mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
bug 525172: from IPDL specs generate .cpp files with method definitions instead of everything in .h files. r=bsmedberg
This commit is contained in:
parent
9bcd9f1ab6
commit
677d4b14f9
@ -41,7 +41,11 @@ VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS += testshell
|
||||
# NB: chromium/ and glue/ are in tier_xpcom
|
||||
|
||||
# tier_gecko:
|
||||
DIRS += ipdl testshell
|
||||
|
||||
TOOL_DIRS = app
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
@ -45,10 +45,6 @@
|
||||
#include "nsStringGlue.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
#include "IPCMessageStart.h"
|
||||
|
||||
COMPILE_ASSERT(LastMsgIndex <= 64, need_to_update_IPC_MESSAGE_MACRO);
|
||||
|
||||
namespace IPC {
|
||||
|
||||
template <>
|
||||
|
@ -44,8 +44,15 @@ include $(DEPTH)/config/autoconf.mk
|
||||
GARBAGE_DIRS += _ipdlheaders
|
||||
GARBAGE += ipdl_lextab.py ipdl_yacctab.py
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
MODULE = ipdlgen
|
||||
LIBRARY_NAME = mozipdlgen_s
|
||||
FORCE_STATIC_LIB = 1
|
||||
LIBXUL_LIBRARY = 1
|
||||
EXPORT_LIBRARY = 1
|
||||
|
||||
##-----------------------------------------------------------------------------
|
||||
## When you add IPDL files to a source directory, list the directory here.
|
||||
##
|
||||
IPDLDIRS = \
|
||||
dom/plugins \
|
||||
dom/ipc \
|
||||
@ -54,22 +61,46 @@ IPDLDIRS = \
|
||||
ipc/ipdl/test/cxx \
|
||||
ipc/testshell \
|
||||
$(NULL)
|
||||
##-----------------------------------------------------------------------------
|
||||
|
||||
ifdef MOZ_IPDL_TESTS
|
||||
DIRS += test
|
||||
endif
|
||||
|
||||
vpath %.ipdl $(topsrcdir)
|
||||
|
||||
define ADD_IPDLDIR
|
||||
include $(topsrcdir)/$(IPDLDIR)/ipdl.mk
|
||||
ALL_IPDLSRCS += $$(IPDLSRCS:%=$(IPDLDIR)/%)
|
||||
PROTOCOLS += $$(IPDLSRCS)
|
||||
endef
|
||||
|
||||
ALL_IPDLSRCS :=
|
||||
PROTOCOLS :=
|
||||
|
||||
$(foreach IPDLDIR,$(IPDLDIRS),$(eval $(ADD_IPDLDIR)))
|
||||
|
||||
|
||||
CPPSRCS = \
|
||||
$(PROTOCOLS:%.ipdl=%Parent.cpp) \
|
||||
$(PROTOCOLS:%.ipdl=%Child.cpp) \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES += -I$(DEPTH)/ipc/ipdl/_ipdlheaders
|
||||
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
||||
# NB: the IPDL compiler manages .ipdl-->.h/.cpp dependencies itself,
|
||||
# which is why we don't have explicit .h/.cpp targets here
|
||||
export:: $(ALL_IPDLSRCS)
|
||||
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
-I$(topsrcdir)/other-licenses/ply \
|
||||
$(srcdir)/ipdl.py \
|
||||
-d _ipdlheaders \
|
||||
$(IPDLDIRS:%=-I$(topsrcdir)/%) \
|
||||
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||
-I$(topsrcdir)/other-licenses/ply \
|
||||
$(srcdir)/ipdl.py \
|
||||
--outheaders-dir=_ipdlheaders \
|
||||
--outcpp-dir=. \
|
||||
$(IPDLDIRS:%=-I$(topsrcdir)/%) \
|
||||
$^
|
||||
|
@ -42,8 +42,6 @@ def log(minv, fmt, *args):
|
||||
# process command line
|
||||
|
||||
op = optparse.OptionParser(usage='ipdl.py [options] IPDLfiles...')
|
||||
op.add_option('-d', '--output-dir', dest='outputdir', default='.',
|
||||
help='Directory in which to put generated headers')
|
||||
op.add_option('-I', '--include', dest='includedirs', default=[ ],
|
||||
action='append',
|
||||
help='Additional directory to search for included protocol specifications')
|
||||
@ -51,16 +49,29 @@ op.add_option('-v', '--verbose', dest='verbosity', default=1, action='count',
|
||||
help='Verbose logging (specify -vv or -vvv for very verbose logging)')
|
||||
op.add_option('-q', '--quiet', dest='verbosity', action='store_const', const=0,
|
||||
help="Suppress logging output")
|
||||
op.add_option('-d', '--outheaders-dir', dest='headersdir', default='.',
|
||||
help="""Director into which C++ headers will be generated.
|
||||
A protocol Foo in the namespace bar will cause the headers
|
||||
dir/bar/Foo.h, dir/bar/FooParent.h, and dir/bar/FooParent.h
|
||||
to be generated""")
|
||||
op.add_option('-o', '--outcpp-dir', dest='cppdir', default='.',
|
||||
help="""Director into which C++ sources will be generated
|
||||
A protocol Foo in the namespace bar will cause the sources
|
||||
cppdir/FooParent.cpp, cppdir/FooChild.cpp
|
||||
to be generated""")
|
||||
|
||||
|
||||
options, files = op.parse_args()
|
||||
_verbosity = options.verbosity
|
||||
codedir = options.outputdir
|
||||
headersdir = options.headersdir
|
||||
cppdir = options.cppdir
|
||||
includedirs = [ os.path.abspath(incdir) for incdir in options.includedirs ]
|
||||
|
||||
if not len(files):
|
||||
op.error("No IPDL files specified")
|
||||
|
||||
log(1, 'Generated headers will be placed in "%s"', codedir)
|
||||
log(1, 'Generated C++ headers will be generated relative to "%s"', headersdir)
|
||||
log(1, 'Generated C++ sources will be generated relative to "%s"', cppdir)
|
||||
|
||||
allprotocols = []
|
||||
|
||||
@ -92,7 +103,7 @@ for f in files:
|
||||
log(3, ' pretty printed code:')
|
||||
ipdl.genipdl(ast, codedir)
|
||||
|
||||
ipdl.gencxx(ast, codedir)
|
||||
ipdl.gencxx(filename, ast, headersdir, cppdir)
|
||||
|
||||
allprotocols.sort()
|
||||
|
||||
@ -101,6 +112,9 @@ ipcmsgstart = StringIO()
|
||||
print >>ipcmsgstart, """
|
||||
// CODE GENERATED by ipdl.py. Do not edit.
|
||||
|
||||
#ifndef IPCMessageStart_h
|
||||
#define IPCMessageStart_h
|
||||
|
||||
enum IPCMessageStart {
|
||||
"""
|
||||
|
||||
@ -110,7 +124,11 @@ for name in allprotocols:
|
||||
print >>ipcmsgstart, """
|
||||
LastMsgIndex
|
||||
};
|
||||
|
||||
COMPILE_ASSERT(LastMsgIndex <= 64, need_to_update_IPC_MESSAGE_MACRO);
|
||||
|
||||
#endif // ifndef IPCMessageStart_h
|
||||
"""
|
||||
|
||||
ipdl.writeifmodified(ipcmsgstart.getvalue(),
|
||||
os.path.join(codedir, 'IPCMessageStart.h'))
|
||||
os.path.join(headersdir, 'IPCMessageStart.h'))
|
||||
|
@ -42,29 +42,43 @@ from ipdl.type import TypeCheck
|
||||
|
||||
from ipdl.cxx.cgen import CxxCodeGen
|
||||
|
||||
|
||||
def parse(specstring, filename='/stdin', includedirs=[ ], errout=sys.stderr):
|
||||
'''Return an IPDL AST if parsing was successful. Print errors to |errout|
|
||||
if it is not.'''
|
||||
return Parser().parse(specstring, os.path.abspath(filename), includedirs, errout)
|
||||
|
||||
|
||||
def typecheck(ast, errout=sys.stderr):
|
||||
'''Return True iff |ast| is well typed. Print errors to |errout| if
|
||||
it is not.'''
|
||||
return TypeCheck().check(ast, errout)
|
||||
|
||||
def gencxx(ast, outdir):
|
||||
for hdr in LowerToCxx().lower(ast):
|
||||
file = os.path.join(
|
||||
outdir,
|
||||
*([ns.name for ns in ast.protocol.namespaces] + [hdr.name]))
|
||||
|
||||
def gencxx(ipdlfilename, ast, outheadersdir, outcppdir):
|
||||
headers, cpps = LowerToCxx().lower(ast)
|
||||
|
||||
def resolveHeader(hdr):
|
||||
return [
|
||||
hdr,
|
||||
os.path.join(
|
||||
outheadersdir,
|
||||
*([ns.name for ns in ast.protocol.namespaces] + [hdr.name]))
|
||||
]
|
||||
def resolveCpp(cpp):
|
||||
return [ cpp, os.path.join(outcppdir, cpp.name) ]
|
||||
|
||||
for ast, filename in ([ resolveHeader(hdr) for hdr in headers ]
|
||||
+ [ resolveCpp(cpp) for cpp in cpps ]):
|
||||
tempfile = StringIO()
|
||||
CxxCodeGen(tempfile).cgen(hdr)
|
||||
writeifmodified(tempfile.getvalue(), file)
|
||||
CxxCodeGen(tempfile).cgen(ast)
|
||||
writeifmodified(tempfile.getvalue(), filename)
|
||||
|
||||
|
||||
def genipdl(ast, outdir):
|
||||
return IPDLCodeGen().cgen(ast)
|
||||
|
||||
|
||||
def writeifmodified(contents, file):
|
||||
dir = os.path.dirname(file)
|
||||
os.path.exists(dir) or os.makedirs(dir)
|
||||
|
@ -67,6 +67,7 @@ Includes = (
|
||||
'base/basictypes.h',
|
||||
'prtime.h',
|
||||
'nscore.h',
|
||||
'IPCMessageStart.h',
|
||||
'IPC/IPCMessageUtils.h',
|
||||
'nsStringGlue.h',
|
||||
'nsTArray.h',
|
||||
|
@ -77,6 +77,11 @@ class Visitor:
|
||||
def visitDecl(self, decl):
|
||||
decl.type.accept(self)
|
||||
|
||||
def visitParam(self, param):
|
||||
self.visitDecl(param)
|
||||
if param.default is not None:
|
||||
param.default.accept(self)
|
||||
|
||||
def visitClass(self, cls):
|
||||
for inherit in cls.inherits:
|
||||
inherit.accept(self)
|
||||
@ -398,6 +403,14 @@ class Decl(Node):
|
||||
def __deepcopy__(self, memo):
|
||||
return Decl(copy.deepcopy(self.type, memo), self.name)
|
||||
|
||||
class Param(Decl):
|
||||
def __init__(self, type, name, default=None):
|
||||
Decl.__init__(self, type, name)
|
||||
self.default = default
|
||||
def __deepcopy__(self, memo):
|
||||
return Param(copy.deepcopy(self.type, memo), self.name,
|
||||
copy.deepcopy(self.default, memo))
|
||||
|
||||
##------------------------------
|
||||
# class stuff
|
||||
class Class(Block):
|
||||
@ -486,6 +499,11 @@ class DestructorDecl(MethodDecl):
|
||||
def __init__(self, name, virtual=0):
|
||||
MethodDecl.__init__(self, name, params=[ ], ret=None,
|
||||
virtual=virtual)
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
return DestructorDecl(self.name, self.virtual)
|
||||
|
||||
|
||||
class DestructorDefn(MethodDefn):
|
||||
def __init__(self, decl): MethodDefn.__init__(self, decl)
|
||||
|
||||
|
@ -136,6 +136,12 @@ class CxxCodeGen(CodePrinter, Visitor):
|
||||
d.type.nmemb.accept(self)
|
||||
self.write(']')
|
||||
|
||||
def visitParam(self, p):
|
||||
self.visitDecl(p)
|
||||
if p.default is not None:
|
||||
self.write(' = ')
|
||||
p.default.accept(self)
|
||||
|
||||
def visitClass(self, c):
|
||||
if c.specializes is not None:
|
||||
self.printdentln('template<>')
|
||||
@ -258,7 +264,12 @@ class CxxCodeGen(CodePrinter, Visitor):
|
||||
def visitDestructorDecl(self, dd):
|
||||
if dd.virtual:
|
||||
self.write('virtual ')
|
||||
self.write('~'+ dd.name +'()')
|
||||
|
||||
# hack alert
|
||||
parts = dd.name.split('::')
|
||||
parts[-1] = '~'+ parts[-1]
|
||||
|
||||
self.write('::'.join(parts) +'()')
|
||||
|
||||
def visitDestructorDefn(self, dd):
|
||||
self.printdent()
|
||||
|
@ -48,7 +48,8 @@ EMIT_LOGGING_CODE = ('win32' == sys.platform)
|
||||
##
|
||||
class LowerToCxx:
|
||||
def lower(self, tu):
|
||||
'''returns a list of File representing the lowered form of |tu|'''
|
||||
'''returns |[ header: File ], [ cpp : File ]| representing the
|
||||
lowered form of |tu|'''
|
||||
# annotate the AST with IPDL/C++ IR-type stuff used later
|
||||
tu.accept(_DecorateWithCxxStuff())
|
||||
|
||||
@ -57,13 +58,15 @@ class LowerToCxx:
|
||||
pheader = File(pname +'.h')
|
||||
_GenerateProtocolHeader().lower(tu, pheader)
|
||||
|
||||
parentheader = File(pname +'Parent.h')
|
||||
_GenerateProtocolParentHeader().lower(tu, pname+'Parent', parentheader)
|
||||
parentheader, parentcpp = File(pname +'Parent.h'), File(pname +'Parent.cpp')
|
||||
_GenerateProtocolParentCode().lower(
|
||||
tu, pname+'Parent', parentheader, parentcpp)
|
||||
|
||||
childheader = File(pname +'Child.h')
|
||||
_GenerateProtocolChildHeader().lower(tu, pname+'Child', childheader)
|
||||
childheader, childcpp = File(pname +'Child.h'), File(pname +'Child.cpp')
|
||||
_GenerateProtocolChildCode().lower(
|
||||
tu, pname+'Child', childheader, childcpp)
|
||||
|
||||
return pheader, parentheader, childheader
|
||||
return [ pheader, parentheader, childheader ], [ parentcpp, childcpp ]
|
||||
|
||||
|
||||
##-----------------------------------------------------------------------------
|
||||
@ -75,10 +78,14 @@ _FREED_ACTOR_ID = ExprLiteral.ONE
|
||||
|
||||
class _struct: pass
|
||||
|
||||
def _protocolHeaderBaseFilename(p):
|
||||
def _protocolHeaderName(p, side=''):
|
||||
if side: side = side.title()
|
||||
base = p.name + side
|
||||
|
||||
|
||||
pfx = '/'.join([ ns.name for ns in p.namespaces ])
|
||||
if pfx: return pfx +'/'+ p.name
|
||||
else: return p.name
|
||||
if pfx: return pfx +'/'+ base
|
||||
else: return base
|
||||
|
||||
def _includeGuardMacroName(headerfile):
|
||||
return re.sub(r'[./]', '_', headerfile.name)
|
||||
@ -356,7 +363,9 @@ def _killProcess(pid):
|
||||
# Results that IPDL-generated code returns back to *Channel code.
|
||||
# Users never see these
|
||||
class _Result:
|
||||
Type = Type('Result')
|
||||
@staticmethod
|
||||
def Type():
|
||||
return Type('Result')
|
||||
|
||||
Processed = ExprVar('MsgProcessed')
|
||||
NotKnown = ExprVar('MsgNotKnown')
|
||||
@ -2270,58 +2279,138 @@ class _FindFriends(ipdl.ast.Visitor):
|
||||
yield actor
|
||||
|
||||
|
||||
class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
||||
def __init__(self, myside):
|
||||
self.side = myside # "parent" or "child"
|
||||
self.prettyside = myside.title()
|
||||
self.clsname = None
|
||||
self.protocol = None
|
||||
self.file = None
|
||||
self.hdrfile = None
|
||||
self.cppfile = None
|
||||
self.ns = None
|
||||
self.cls = None
|
||||
self.includedActorTypedefs = [ ]
|
||||
self.protocolCxxIncludes = [ ]
|
||||
|
||||
def lower(self, tu, clsname, cxxHeaderFile):
|
||||
def lower(self, tu, clsname, cxxHeaderFile, cxxFile):
|
||||
self.clsname = clsname
|
||||
self.file = cxxHeaderFile
|
||||
self.hdrfile = cxxHeaderFile
|
||||
self.cppfile = cxxFile
|
||||
tu.accept(self)
|
||||
|
||||
def visitTranslationUnit(self, tu):
|
||||
f = self.file
|
||||
def standardTypedefs(self):
|
||||
return [
|
||||
Typedef(Type('IPC::Message'), 'Message'),
|
||||
Typedef(Type(self.protocol.channelName()), 'Channel'),
|
||||
Typedef(Type(self.protocol.fqListenerName()), 'ChannelListener'),
|
||||
Typedef(Type('base::ProcessHandle'), 'ProcessHandle')
|
||||
]
|
||||
|
||||
f.addthing(Whitespace('''//
|
||||
|
||||
def visitTranslationUnit(self, tu):
|
||||
self.protocol = tu.protocol
|
||||
|
||||
hf = self.hdrfile
|
||||
cf = self.cppfile
|
||||
|
||||
disclaimer = Whitespace('''//
|
||||
// Automatically generated by ipdlc.
|
||||
// Edit at your own risk
|
||||
//
|
||||
|
||||
'''))
|
||||
f.addthings(_includeGuardStart(f))
|
||||
f.addthings([
|
||||
Whitespace.NL,
|
||||
CppDirective(
|
||||
'include',
|
||||
'"'+ _protocolHeaderBaseFilename(tu.protocol) +'.h"') ])
|
||||
|
||||
self.protocol = tu.protocol
|
||||
''')
|
||||
# make the C++ header
|
||||
hf.addthings(
|
||||
[ disclaimer ]
|
||||
+ _includeGuardStart(hf)
|
||||
+[
|
||||
Whitespace.NL,
|
||||
CppDirective(
|
||||
'include',
|
||||
'"'+ _protocolHeaderName(tu.protocol) +'.h"')
|
||||
])
|
||||
|
||||
for pinc in tu.protocolIncludes:
|
||||
pinc.accept(self)
|
||||
|
||||
# this generates the actor's full impl in self.cls
|
||||
tu.protocol.accept(self)
|
||||
|
||||
f.addthing(Whitespace.NL)
|
||||
f.addthings(_includeGuardEnd(f))
|
||||
clsdecl, clsdefn = _ClassDeclDefn().split(self.cls)
|
||||
|
||||
# XXX damn C++ ... return types in the method defn aren't in
|
||||
# class scope
|
||||
for stmt in clsdefn.stmts:
|
||||
if isinstance(stmt, MethodDefn):
|
||||
if stmt.decl.ret and stmt.decl.ret.name == 'Result':
|
||||
stmt.decl.ret.name = clsdecl.name +'::'+ stmt.decl.ret.name
|
||||
|
||||
def makeNamespace(p, file):
|
||||
if 0 == len(p.namespaces):
|
||||
return file
|
||||
ns = Namespace(p.namespaces[-1].name)
|
||||
outerns = _putInNamespaces(ns, p.namespaces[:-1])
|
||||
file.addthing(outerns)
|
||||
return ns
|
||||
|
||||
hdrns = makeNamespace(self.protocol, self.hdrfile)
|
||||
hdrns.addstmts([
|
||||
Whitespace.NL,
|
||||
Whitespace.NL,
|
||||
clsdecl,
|
||||
Whitespace.NL,
|
||||
Whitespace.NL
|
||||
])
|
||||
|
||||
self.hdrfile.addthings(
|
||||
([
|
||||
Whitespace.NL,
|
||||
CppDirective('if', '0') ])
|
||||
+ _GenerateSkeletonImpl(
|
||||
_actorName(self.protocol.name, self.side)[1:],
|
||||
self.protocol.namespaces).fromclass(self.cls)
|
||||
+([
|
||||
CppDirective('endif', '// if 0'),
|
||||
Whitespace.NL ])
|
||||
+ _includeGuardEnd(hf))
|
||||
|
||||
# make the .cpp file
|
||||
cf.addthings((
|
||||
[ disclaimer,
|
||||
Whitespace.NL,
|
||||
CppDirective(
|
||||
'include',
|
||||
'"'+ _protocolHeaderName(self.protocol, self.side) +'.h"'),
|
||||
Whitespace.NL
|
||||
]
|
||||
+ self.protocolCxxIncludes
|
||||
+ [ Whitespace.NL ]
|
||||
+ self.standardTypedefs()
|
||||
+ self.includedActorTypedefs
|
||||
+ tu.protocol.decl.cxxtypedefs
|
||||
+ [ Whitespace.NL ]))
|
||||
|
||||
cppns = makeNamespace(self.protocol, cf)
|
||||
cppns.addstmts([
|
||||
Whitespace.NL,
|
||||
Whitespace.NL,
|
||||
clsdefn,
|
||||
Whitespace.NL,
|
||||
Whitespace.NL
|
||||
])
|
||||
|
||||
|
||||
def visitProtocolInclude(self, pi):
|
||||
ip = pi.tu.protocol
|
||||
|
||||
if self.protocol.decl.type.isManagerOf(ip.decl.type):
|
||||
self.file.addthing(
|
||||
CppDirective(
|
||||
'include',
|
||||
'"%s%s.h"'% (_protocolHeaderBaseFilename(ip),
|
||||
self.prettyside)))
|
||||
self.hdrfile.addthings([
|
||||
_makeForwardDecl(ip.decl.type, self.side),
|
||||
Whitespace.NL
|
||||
])
|
||||
self.protocolCxxIncludes.append(
|
||||
CppDirective(
|
||||
'include',
|
||||
'"%s.h"'% (_protocolHeaderName(ip, self.side))))
|
||||
|
||||
if ip.decl.fullname is not None:
|
||||
self.includedActorTypedefs.append(Typedef(
|
||||
@ -2330,7 +2419,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
|
||||
|
||||
def visitProtocol(self, p):
|
||||
self.file.addthings([
|
||||
self.hdrfile.addthings([
|
||||
CppDirective('ifdef', 'DEBUG'),
|
||||
CppDirective('include', '"prenv.h"'),
|
||||
CppDirective('endif', '// DEBUG')
|
||||
@ -2340,9 +2429,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
|
||||
# FIXME: all actors impl Iface for now
|
||||
if p.decl.type.isManager() or 1:
|
||||
self.file.addthing(CppDirective('include', '"base/id_map.h"'))
|
||||
self.hdrfile.addthing(CppDirective('include', '"base/id_map.h"'))
|
||||
|
||||
self.file.addthings([
|
||||
self.hdrfile.addthings([
|
||||
CppDirective('include', '"'+ p.channelHeaderFile() +'"'),
|
||||
Whitespace.NL ])
|
||||
|
||||
@ -2356,7 +2445,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
friends.add(p.decl.type.manager)
|
||||
|
||||
for friend in friends:
|
||||
self.file.addthings([
|
||||
self.hdrfile.addthings([
|
||||
Whitespace.NL,
|
||||
_makeForwardDecl(friend, self.prettyside),
|
||||
Whitespace.NL
|
||||
@ -2366,15 +2455,6 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
self.prettyside)),
|
||||
Whitespace.NL ])
|
||||
|
||||
# construct the namespace into which we'll stick all our decls
|
||||
if 0 == len(p.namespaces):
|
||||
self.ns = self.file
|
||||
else:
|
||||
self.ns = Namespace(p.namespaces[-1].name)
|
||||
outerns = _putInNamespaces(self.ns, p.namespaces[:-1])
|
||||
self.file.addthing(outerns)
|
||||
self.ns.addstmts([ Whitespace.NL, Whitespace.NL ])
|
||||
|
||||
self.cls.addstmt(Label.PROTECTED)
|
||||
for typedef in p.cxxTypedefs():
|
||||
self.cls.addstmt(typedef)
|
||||
@ -2420,14 +2500,11 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
|
||||
self.cls.addstmt(Whitespace.NL)
|
||||
|
||||
self.cls.addstmts([
|
||||
Label.PRIVATE,
|
||||
Typedef(Type('IPC::Message'), 'Message'),
|
||||
Typedef(Type(p.channelName()), 'Channel'),
|
||||
Typedef(Type(p.fqListenerName()), 'ChannelListener'),
|
||||
Typedef(Type('base::ProcessHandle'), 'ProcessHandle'),
|
||||
Whitespace.NL,
|
||||
])
|
||||
self.cls.addstmts((
|
||||
[ Label.PRIVATE ]
|
||||
+ self.standardTypedefs()
|
||||
+ [ Whitespace.NL ]
|
||||
))
|
||||
|
||||
self.cls.addstmt(Label.PUBLIC)
|
||||
# Actor()
|
||||
@ -2467,8 +2544,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
params=[ Decl(Type('Channel::Transport', ptr=True),
|
||||
aTransportVar.name),
|
||||
Decl(Type('ProcessHandle'), processvar.name),
|
||||
Decl(Type('MessageLoop', ptr=True),
|
||||
aThreadVar.name +' = 0') ],
|
||||
Param(Type('MessageLoop', ptr=True),
|
||||
aThreadVar.name,
|
||||
default=ExprLiteral.NULL) ],
|
||||
ret=Type.BOOL))
|
||||
|
||||
openmeth.addstmts([
|
||||
@ -2530,7 +2608,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
replyvar.name))
|
||||
|
||||
method = MethodDefn(MethodDecl(name, virtual=True,
|
||||
params=params, ret=_Result.Type))
|
||||
params=params, ret=_Result.Type()))
|
||||
if dispatches:
|
||||
routevar = ExprVar('__route')
|
||||
routedecl = StmtDecl(
|
||||
@ -2649,17 +2727,6 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
StmtDecl(Decl(_shmemIdType(), p.lastShmemIdVar().name))
|
||||
])
|
||||
|
||||
self.ns.addstmts([ self.cls, Whitespace.NL, Whitespace.NL ])
|
||||
|
||||
# generate skeleton implementation of abstract actor class
|
||||
self.file.addthing(CppDirective('if', '0'))
|
||||
|
||||
genskeleton = _GenerateSkeletonImpl()
|
||||
genskeleton.fromclass(self.cls)
|
||||
self.file.addthings(genskeleton.stuff)
|
||||
|
||||
self.file.addthing(CppDirective('endif', '// if 0'))
|
||||
|
||||
|
||||
def implementManagerIface(self):
|
||||
p = self.protocol
|
||||
@ -3438,9 +3505,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||
ExprVar('stderr') ])) ])
|
||||
|
||||
|
||||
class _GenerateProtocolParentHeader(_GenerateProtocolActorHeader):
|
||||
class _GenerateProtocolParentCode(_GenerateProtocolActorCode):
|
||||
def __init__(self):
|
||||
_GenerateProtocolActorHeader.__init__(self, 'parent')
|
||||
_GenerateProtocolActorCode.__init__(self, 'parent')
|
||||
|
||||
def sendsMessage(self, md):
|
||||
return not md.decl.type.isIn()
|
||||
@ -3448,9 +3515,9 @@ class _GenerateProtocolParentHeader(_GenerateProtocolActorHeader):
|
||||
def receivesMessage(self, md):
|
||||
return md.decl.type.isInout() or md.decl.type.isIn()
|
||||
|
||||
class _GenerateProtocolChildHeader(_GenerateProtocolActorHeader):
|
||||
class _GenerateProtocolChildCode(_GenerateProtocolActorCode):
|
||||
def __init__(self):
|
||||
_GenerateProtocolActorHeader.__init__(self, 'child')
|
||||
_GenerateProtocolActorCode.__init__(self, 'child')
|
||||
|
||||
def sendsMessage(self, md):
|
||||
return not md.decl.type.isOut()
|
||||
@ -3460,29 +3527,62 @@ class _GenerateProtocolChildHeader(_GenerateProtocolActorHeader):
|
||||
|
||||
|
||||
##-----------------------------------------------------------------------------
|
||||
## Bonus (inessential) passes
|
||||
## Utility passes
|
||||
##
|
||||
|
||||
class _ClassDeclDefn:
|
||||
def split(self, cls):
|
||||
"""Warning: destructively splits |cls|!"""
|
||||
defns = Block()
|
||||
|
||||
for i, stmt in enumerate(cls.stmts):
|
||||
if isinstance(stmt, MethodDefn):
|
||||
decl, defn = self.splitMethodDefn(stmt, cls.name)
|
||||
cls.stmts[i] = StmtDecl(decl)
|
||||
defns.addstmts([ defn, Whitespace.NL ])
|
||||
|
||||
return cls, defns
|
||||
|
||||
def splitMethodDefn(self, md, clsname):
|
||||
saveddecl = deepcopy(md.decl)
|
||||
md.decl.name = (clsname +'::'+ md.decl.name)
|
||||
md.decl.virtual = 0
|
||||
md.decl.static = 0
|
||||
for param in md.decl.params:
|
||||
if isinstance(param, Param):
|
||||
param.default = None
|
||||
return saveddecl, md
|
||||
|
||||
|
||||
# XXX this is tantalizingly similar to _SplitDeclDefn, but just
|
||||
# different enough that I don't see the need to define
|
||||
# _GenerateSkeleton in terms of that
|
||||
class _GenerateSkeletonImpl(Visitor):
|
||||
def __init__(self, name='ActorImpl'):
|
||||
def __init__(self, name, namespaces):
|
||||
self.name = name
|
||||
self.stuff = [ ]
|
||||
self.cls = None
|
||||
self.methodimpls = [ ]
|
||||
self.namespaces = namespaces
|
||||
self.methodimpls = Block()
|
||||
|
||||
def fromclass(self, cls):
|
||||
cls.accept(self)
|
||||
self.stuff.append(Whitespace('''
|
||||
|
||||
nsclass = _putInNamespaces(self.cls, self.namespaces)
|
||||
nsmethodimpls = _putInNamespaces(self.methodimpls, self.namespaces)
|
||||
|
||||
return [
|
||||
Whitespace('''
|
||||
//-----------------------------------------------------------------------------
|
||||
// Skeleton implementation of abstract actor class
|
||||
|
||||
'''))
|
||||
self.stuff.append(Whitespace('// Header file contents\n'))
|
||||
self.stuff.append(self.cls)
|
||||
'''),
|
||||
Whitespace('// Header file contents\n'),
|
||||
nsclass,
|
||||
Whitespace.NL,
|
||||
Whitespace('\n// C++ file contents\n'),
|
||||
nsmethodimpls
|
||||
]
|
||||
|
||||
self.stuff.append(Whitespace.NL)
|
||||
self.stuff.append(Whitespace('\n// C++ file contents\n'))
|
||||
self.stuff.extend(self.methodimpls)
|
||||
|
||||
def visitClass(self, cls):
|
||||
self.cls = Class(self.name, inherits=[ Inherit(Type(cls.name)) ])
|
||||
@ -3521,8 +3621,7 @@ class _GenerateSkeletonImpl(Visitor):
|
||||
self.addmethodimpl(dtor)
|
||||
|
||||
def addmethodimpl(self, impl):
|
||||
self.methodimpls.append(impl)
|
||||
self.methodimpls.append(Whitespace.NL)
|
||||
self.methodimpls.addstmts([ impl, Whitespace.NL ])
|
||||
|
||||
def implname(self, method):
|
||||
return self.name +'::'+ method
|
||||
|
76
ipc/ipdl/test/cxx/IPDLUnitTestTypes.h
Normal file
76
ipc/ipdl/test/cxx/IPDLUnitTestTypes.h
Normal file
@ -0,0 +1,76 @@
|
||||
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla IPC.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Mozilla Foundation
|
||||
* Portions created by the Initial Developer are Copyright (C) 2009
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Chris Jones <jones.chris.g@gmail.com>.
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef mozilla__ipdltest_IPDLUnitTestTypes_h
|
||||
#define mozilla__ipdltest_IPDLUnitTestTypes_h
|
||||
|
||||
|
||||
namespace mozilla {
|
||||
namespace _ipdltest {
|
||||
|
||||
struct DirtyRect
|
||||
{
|
||||
int x; int y; int w; int h;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
namespace IPC {
|
||||
template<>
|
||||
struct ParamTraits<mozilla::_ipdltest::DirtyRect>
|
||||
{
|
||||
typedef mozilla::_ipdltest::DirtyRect paramType;
|
||||
static void Write(Message* aMsg, const paramType& aParam) {
|
||||
WriteParam(aMsg, aParam.x);
|
||||
WriteParam(aMsg, aParam.y);
|
||||
WriteParam(aMsg, aParam.w);
|
||||
WriteParam(aMsg, aParam.h);
|
||||
}
|
||||
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||
{
|
||||
return (ReadParam(aMsg, aIter, &aResult->x) &&
|
||||
ReadParam(aMsg, aIter, &aResult->y) &&
|
||||
ReadParam(aMsg, aIter, &aResult->w) &&
|
||||
ReadParam(aMsg, aIter, &aResult->h));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif // ifndef mozilla__ipdltest_IPDLUnitTestTypes_h
|
@ -49,6 +49,7 @@ EXPORTS_NAMESPACES = mozilla/_ipdltest
|
||||
EXPORTS_mozilla/_ipdltest = \
|
||||
IPDLUnitTests.h \
|
||||
IPDLUnitTestThreadChild.h \
|
||||
IPDLUnitTestTypes.h \
|
||||
$(NULL)
|
||||
|
||||
LIBRARY_NAME = $(MODULE)_s
|
||||
@ -78,7 +79,6 @@ CPPSRCS = \
|
||||
$(IPDLTESTSRCS) \
|
||||
$(NULL)
|
||||
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
@ -96,6 +96,7 @@ STATIC_LIBS += \
|
||||
domipc_s \
|
||||
domplugins_s \
|
||||
mozipc_s \
|
||||
mozipdlgen_s \
|
||||
chromium_s \
|
||||
ipcshell_s \
|
||||
gfxipc_s \
|
||||
|
@ -174,10 +174,6 @@ ifdef ACCESSIBILITY
|
||||
tier_gecko_dirs += accessible
|
||||
endif
|
||||
|
||||
ifdef MOZ_IPDL_TESTS
|
||||
tier_gecko_dirs += ipc/ipdl/test
|
||||
endif
|
||||
|
||||
#
|
||||
# tier "toolkit" - xpfe & toolkit
|
||||
#
|
||||
|
@ -44,5 +44,5 @@ endif
|
||||
tier_xpcom_dirs += xpcom
|
||||
|
||||
ifdef MOZ_IPC
|
||||
tier_xpcom_dirs += ipc/ipdl ipc/chromium ipc/glue
|
||||
tier_xpcom_dirs += ipc/chromium ipc/glue
|
||||
endif
|
||||
|
Loading…
Reference in New Issue
Block a user