summaryrefslogtreecommitdiffstats
path: root/ppapi/generators
diff options
context:
space:
mode:
authornoelallen@chromium.org <noelallen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 19:47:08 +0000
committernoelallen@chromium.org <noelallen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-13 19:47:08 +0000
commit76641b5e67f2e1aca51dad7a672b916d67447dd2 (patch)
tree23e2ca34441d12c2d35d6e42cc89573aa266b089 /ppapi/generators
parent248c85dab8fa86d39e07bbcaf5c7f8d82fba6aad (diff)
downloadchromium_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-xppapi/generators/idl_c_header.py42
-rwxr-xr-xppapi/generators/idl_c_proto.py29
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