diff options
author | noelallen@chromium.org <noelallen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 19:47:08 +0000 |
---|---|---|
committer | noelallen@chromium.org <noelallen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-13 19:47:08 +0000 |
commit | 76641b5e67f2e1aca51dad7a672b916d67447dd2 (patch) | |
tree | 23e2ca34441d12c2d35d6e42cc89573aa266b089 /ppapi/generators | |
parent | 248c85dab8fa86d39e07bbcaf5c7f8d82fba6aad (diff) | |
download | chromium_src-76641b5e67f2e1aca51dad7a672b916d67447dd2.zip chromium_src-76641b5e67f2e1aca51dad7a672b916d67447dd2.tar.gz chromium_src-76641b5e67f2e1aca51dad7a672b916d67447dd2.tar.bz2 |
Add idl version of ppb_flash_menu.idl
See CR=11013017
Convert .h to .idl
R=yzshen@chromium.org
BUG=None
Review URL: https://chromiumcodereview.appspot.com/11446066
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172932 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/generators')
-rwxr-xr-x | ppapi/generators/idl_c_header.py | 42 | ||||
-rwxr-xr-x | ppapi/generators/idl_c_proto.py | 29 |
2 files changed, 65 insertions, 6 deletions
diff --git a/ppapi/generators/idl_c_header.py b/ppapi/generators/idl_c_header.py index d4561d5..7311472 100755 --- a/ppapi/generators/idl_c_header.py +++ b/ppapi/generators/idl_c_header.py @@ -18,11 +18,43 @@ from idl_outfile import IDLOutFile from idl_parser import ParseFiles from idl_c_proto import CGen, GetNodeComments, CommentLines, Comment from idl_generator import Generator, GeneratorByFile +from idl_visitor import IDLVisitor Option('dstroot', 'Base directory of output', default=os.path.join('..', 'c')) Option('guard', 'Include guard prefix', default=os.path.join('ppapi', 'c')) +# +# PrototypeResolver +# +# A specialized visitor which traverses the AST, building a mapping of +# Release names to Versions numbers and calculating a min version. +# The mapping is applied to the File nodes within the AST. +# +class ProtoResolver(IDLVisitor): + def __init__(self): + IDLVisitor.__init__(self) + self.struct_map = {} + self.interface_map = {} + + def Arrive(self, node, ignore): + if node.IsA('Member') and node.GetProperty('ref'): + typeref = node.typelist.GetReleases()[0] + if typeref.IsA('Struct'): + nodelist = self.struct_map.get(typeref.GetName(), []) + nodelist.append(node) + self.struct_map[typeref.GetName()] = nodelist + + if node.IsA('Param'): + typeref = node.typelist.GetReleases()[0] + if typeref.IsA('Interface'): + nodelist = self.struct_map.get(typeref.GetName(), []) + nodelist.append(node) + self.interface_map[typeref.GetName()] = nodelist + + return None + + def GetPathFromNode(filenode, relpath=None, ext=None): path, name = os.path.split(filenode.GetProperty('NAME')) if ext: name = os.path.splitext(name)[0] + ext @@ -128,6 +160,10 @@ class HGen(GeneratorByFile): def GenerateHead(self, out, filenode, releases, options): __pychecker__ = 'unusednames=options' + + proto = ProtoResolver() + proto.Visit(filenode, None) + cgen = CGen() gpath = GetOption('guard') def_guard = GetHeaderFromNode(filenode, relpath=gpath) @@ -176,6 +212,12 @@ class HGen(GeneratorByFile): if include == cur_include: continue out.Write('#include "%s"\n' % include) + # Generate Prototypes + if proto.struct_map: + out.Write('\n/* Struct prototypes */\n') + for struct in proto.struct_map: + out.Write('struct %s;\n' % struct) + # If we are generating a single release, then create a macro for the highest # available release number. if filenode.GetProperty('NAME').endswith('pp_macros.idl'): diff --git a/ppapi/generators/idl_c_proto.py b/ppapi/generators/idl_c_proto.py index b2b78d4..79656308 100755 --- a/ppapi/generators/idl_c_proto.py +++ b/ppapi/generators/idl_c_proto.py @@ -79,7 +79,8 @@ class CGen(object): 'inout': '%s', 'out': '%s*', 'store': '%s', - 'return': '%s' + 'return': '%s', + 'ref': '%s*' }, 'Callspec': { 'in': '%s', @@ -107,7 +108,8 @@ class CGen(object): 'inout': '%s*', 'out': '%s*', 'return': ' %s*', - 'store': '%s' + 'store': '%s', + 'ref': '%s*' }, 'blob_t': { 'in': 'const %s', @@ -396,9 +398,15 @@ class CGen(object): def Compose(self, rtype, name, arrayspec, callspec, prefix, func_as_ptr, - ptr_prefix, include_name): + ptr_prefix, include_name, unsized_as_ptr): self.LogEnter('Compose: %s %s' % (rtype, name)) arrayspec = ''.join(arrayspec) + + # Switch unsized array to a ptr. NOTE: Only last element can be unsized. + if unsized_as_ptr and arrayspec[-2:] == '[]': + prefix += '*' + arrayspec=arrayspec[:-2] + if not include_name: name = prefix + arrayspec else: @@ -409,7 +417,8 @@ class CGen(object): params = [] for ptype, pname, parray, pspec in callspec: params.append(self.Compose(ptype, pname, parray, pspec, '', True, - ptr_prefix='', include_name=True)) + ptr_prefix='', include_name=True, + unsized_as_ptr=unsized_as_ptr)) if func_as_ptr: name = '(%s*%s)' % (ptr_prefix, name) if not params: @@ -437,8 +446,13 @@ class CGen(object): rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode) if include_version: name = self.GetStructName(node, release, True) + + # If not a callspec (such as a struct) use a ptr instead of [] + unsized_as_ptr = not callspec + out = self.Compose(rtype, name, arrayspec, callspec, prefix, - func_as_ptr, ptr_prefix, include_name) + func_as_ptr, ptr_prefix, include_name, unsized_as_ptr) + self.LogExit('Exit GetSignature: %s' % out) return out @@ -492,7 +506,10 @@ class CGen(object): __pychecker__ = 'unusednames=prefix,comment' release = releases[0] self.LogEnter('DefineMember %s' % node) - out = '%s;' % self.GetSignature(node, release, 'store', '', True) + if node.GetProperty('ref'): + out = '%s;' % self.GetSignature(node, release, 'ref', '', True) + else: + out = '%s;' % self.GetSignature(node, release, 'store', '', True) self.LogExit('Exit DefineMember') return out |