Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(422)

Unified Diff: ppapi/generators/idl_c_proto.py

Issue 7715036: More multi-version support (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/generators/idl_c_proto.py
===================================================================
--- ppapi/generators/idl_c_proto.py (revision 97752)
+++ ppapi/generators/idl_c_proto.py (working copy)
@@ -26,6 +26,32 @@
return repr(self.value)
+def CommentLines(lines, tabs=0):
+ tab = ' ' * tabs
+ if lines[-1] == '':
dmichael (off chromium) 2011/08/24 20:49:11 I guess my python-fu is weak. What does indexing a
noelallen1 2011/08/24 22:43:06 [-n] is the standard way to notate the 'nth' to la
+ out = '%s/*' % tab + ('\n%s *' % tab).join(lines) + '/\n'
+ else:
+ out = '%s/*' % tab + ('\n%s *' % tab).join(lines) + ' */\n'
dmichael (off chromium) 2011/08/24 20:49:11 Maybe a comment on what's going on here? And maybe
noelallen1 2011/08/24 22:43:06 Done.
+ return out
+
+def Comment(node, prefix=None, tabs=0):
dmichael (off chromium) 2011/08/24 20:49:11 Speaking of comments... Could we have some here?
noelallen1 2011/08/24 22:43:06 Done.
+ comment = node.GetName()
+ lines = comment.split('\n')
+ if prefix:
+ prefix = prefix.split('\n')
dmichael (off chromium) 2011/08/24 20:49:11 I'd prefer you use a different variable name for t
noelallen1 2011/08/24 22:43:06 Done.
+ if prefix[0] == '*' and lines[0] == '*':
+ lines = prefix + lines[1:]
+ else:
+ lines = prefix + lines;
+ return CommentLines(lines, tabs)
+
+def GetNodeComments(node, prefix=None, tabs=0):
+ comment_txt = ''
+ for doc in node.GetListOf('Comment'):
+ comment_txt += Comment(doc, tabs=tabs)
+ return comment_txt
+
+
class CGen(object):
# TypeMap
#
@@ -103,17 +129,17 @@
def __init__(self):
self.dbg_depth = 0
- self.vmin = 0.0
- self.vmax = 1e100
- self.release = GetOption('release')
+# self.vmin = 0.0
+# self.vmax = 1e100
+# self.release = GetOption('release')
dmichael (off chromium) 2011/08/24 20:49:11 Why are these just commented out? If they're dead,
noelallen1 2011/08/24 22:43:06 Done.
- def SetVersionMap(self, node):
- self.vmin = 0.0
- self.vmax = 1e100
- for version in node.GetListOf('LabelItem'):
- if version.GetName() == GetOption('release'):
- self.vmin = float(version.GetProperty('VALUE'))
- self.vmax = float(version.GetProperty('VALUE'))
+ def SetVersionMap(self, node): pass
+# self.vmin = 0.0
+# self.vmax = 1e100
+# for version in node.GetListOf('LabelItem'):
+# if version.GetName() == GetOption('release'):
+# self.vmin = float(version.GetProperty('VALUE'))
+# self.vmax = float(version.GetProperty('VALUE'))
#
# Debug Logging functions
@@ -152,12 +178,12 @@
#
# For a given node return the type name by passing mode.
#
- def GetTypeName(self, node, prefix=''):
- self.LogEnter('GetTypeName of %s' % node)
+ def GetTypeName(self, node, release, prefix=''):
+ self.LogEnter('GetTypeName of %s rel=%s' % (node, release))
# For Members, Params, and Typedef's your want type it refers to
dmichael (off chromium) 2011/08/24 20:49:11 Typedef's->Typedefs and not sure what 'your want t
noelallen1 2011/08/24 22:43:06 Done.
if node.IsA('Member', 'Param', 'Typedef'):
- typeref = node.GetType(self.release)
+ typeref = node.GetType(release)
else:
typeref = node
@@ -194,19 +220,20 @@
# For a given node return basic type of that object. This is
# either a 'Type', 'Callspec', or 'Array'
#
- def GetRootTypeMode(self, node, mode):
+ def GetRootTypeMode(self, node, release, mode):
self.LogEnter('GetRootType of %s' % node)
# If it has an array spec, then treat it as an array regardless of type
if node.GetOneOf('Array'):
rootType = 'Array'
# Or if it has a callspec, treat it as a function
elif node.GetOneOf('Callspec'):
- rootType, mode = self.GetRootTypeMode(node.GetType(self.release),
+ rootType, mode = self.GetRootTypeMode(node.GetType(release), release,
'return')
# If it's a plain typedef, try that object's root type
elif node.IsA('Member', 'Param', 'Typedef'):
- rootType, mode = self.GetRootTypeMode(node.GetType(self.release), mode)
+ rootType, mode = self.GetRootTypeMode(node.GetType(release),
+ release, mode)
# If it's an Enum, then it's normal passing rules
elif node.IsA('Enum'):
@@ -237,10 +264,11 @@
return rootType, mode
- def GetTypeByMode(self, node, mode):
- self.LogEnter('GetTypeByMode of %s mode=%s' % (node, mode))
- name = self.GetTypeName(node)
- ntype, mode = self.GetRootTypeMode(node, mode)
+ def GetTypeByMode(self, node, release, mode):
+ self.LogEnter('GetTypeByMode of %s mode=%s release=%s' %
+ (node, mode, release))
+ name = self.GetTypeName(node, release)
+ ntype, mode = self.GetRootTypeMode(node, release, mode)
out = CGen.TypeMap[ntype][mode] % name
self.LogExit('GetTypeByMode %s = %s' % (node, out))
return out
@@ -264,15 +292,15 @@
# arrays - A list of array dimensions as [] or [<fixed_num>].
# args - None of not a function, otherwise a list of parameters.
#
- def GetComponents(self, node, mode):
- self.LogEnter('GetComponents mode %s for %s' % (mode, node))
+ def GetComponents(self, node, release, mode):
+ self.LogEnter('GetComponents mode %s for %s %s' % (mode, node, release))
# Generate passing type by modifying root type
- rtype = self.GetTypeByMode(node, mode)
+ rtype = self.GetTypeByMode(node, release, mode)
if node.IsA('Enum', 'Interface', 'Struct'):
rname = node.GetName()
else:
- rname = node.GetType(self.release).GetName()
+ rname = node.GetType(release).GetName()
if rname in CGen.RemapName:
rname = CGen.RemapName[rname]
@@ -285,7 +313,7 @@
callspec = []
for param in callnode.GetListOf('Param'):
mode = self.GetParamMode(param)
- ptype, pname, parray, pspec = self.GetComponents(param, mode)
+ ptype, pname, parray, pspec = self.GetComponents(param, release, mode)
callspec.append((ptype, pname, parray, pspec))
else:
callspec = None
@@ -317,32 +345,23 @@
# prefix - A prefix for the object's name
# func_as_ptr - Formats a function as a function pointer
#
- def GetSignature(self, node, mode, prefix='', func_as_ptr=True):
+ def GetSignature(self, node, release, mode, prefix='', func_as_ptr=True):
self.LogEnter('GetSignature %s %s as func=%s' % (node, mode, func_as_ptr))
- rtype, name, arrayspec, callspec = self.GetComponents(node, mode)
+ rtype, name, arrayspec, callspec = self.GetComponents(node, release, mode)
out = self.Compose(rtype, name, arrayspec, callspec, prefix, func_as_ptr)
self.LogExit('Exit GetSignature: %s' % out)
return out
- def GetMacro(self, node):
- name = node.GetName()
- name = name.upper()
- return "%s_INTERFACE" % name
-
- def GetDefine(self, name, value):
- out = '#define %s %s' % (name, value)
- if len(out) > 80:
- out = '#define %s \\\n %s' % (name, value)
- return '%s\n' % out
-
# Define an Typedef.
dmichael (off chromium) 2011/08/24 20:49:11 nit: an->a
- def DefineTypedef(self, node, prefix='', comment=False):
- out = 'typedef %s;\n' % self.GetSignature(node, 'return', prefix, True)
+ def DefineTypedef(self, node, releases, prefix='', comment=False):
dmichael (off chromium) 2011/08/24 20:49:11 Why are you passing an array here if you only use
noelallen1 2011/08/24 22:43:06 Yes. This is waiting on name mangling based on ve
+ release = releases[0]
+ out = 'typedef %s;\n' % self.GetSignature(node, release, 'return',
+ prefix, True)
self.Log('DefineTypedef: %s' % out)
return out
# Define an Enum.
- def DefineEnum(self, node, prefix='', comment=False):
+ def DefineEnum(self, node, releases, prefix='', comment=False):
dmichael (off chromium) 2011/08/24 20:49:11 releases appears to be unused here
noelallen1 2011/08/24 22:43:06 Transitional (same as above)
self.LogEnter('DefineEnum %s' % node)
unnamed = node.GetProperty('unnamed')
if unnamed:
@@ -353,12 +372,7 @@
enumlist = []
for child in node.GetListOf('EnumItem'):
value = child.GetProperty('VALUE')
- comment_txt = ''
- if comment:
- for comment_node in child.GetListOf('Comment'):
- comment_txt += self.Comment(comment_node, tabs=1)
- if comment_txt:
- comment_txt = '%s' % comment_txt
+ comment_txt = GetNodeComments(child, tabs=1)
if value:
item_txt = '%s%s = %s' % (prefix, child.GetName(), value)
else:
@@ -372,36 +386,15 @@
out = '%s\n%s\n} %s;\n' % (out, ',\n'.join(enumlist), name)
return out
- def DefineMember(self, node, prefix='', comment=False):
+ def DefineMember(self, node, releases, prefix='', comment=False):
+ release = releases[0]
dmichael (off chromium) 2011/08/24 20:49:11 Again, is this just temporary?
noelallen1 2011/08/24 22:43:06 Yes. All Define<X> functions take an array of re
self.LogEnter('DefineMember %s' % node)
-
-# out = ''
-# if comment:
-# for doc in node.GetListOf('Comment'):
-# out += self.Comment(doc)
- out = '%s;' % self.GetSignature(node, 'store', '', True)
+ out = '%s;' % self.GetSignature(node, release, 'store', '', True)
self.LogExit('Exit DefineMember')
return out
- def InterfaceDefs(self, node):
- out = ''
- name = node.GetName()
- macro = node.GetProperty('macro')
- if not macro:
- macro = self.GetMacro(node)
- label = node.GetLabel()
- if label:
- for vers in label.versions:
- strver = str(vers).replace('.', '_')
- out += self.GetDefine('%s_%s' % (macro, strver),
- '"%s;%s"' % (name, vers))
- if label.GetRelease(vers) == self.release:
- out += self.GetDefine(macro, '%s_%s' % (macro, strver))
- out += '\n'
- return out
-
# Define a Struct.
- def DefineStruct(self, node, prefix='', comment=False):
+ def DefineStruct(self, node, releases, prefix='', comment=False):
out = ''
self.LogEnter('DefineStruct %s' % node)
@@ -413,7 +406,7 @@
# Generate Member Functions
members = []
for child in node.GetListOf('Member'):
- member = self.Define(child, tabs=1, comment=comment)
+ member = self.Define(child, releases, tabs=1, comment=comment)
if not member:
continue
members.append(member)
@@ -421,7 +414,7 @@
self.LogExit('Exit DefineStruct')
return out
- def DefineType(self, node, prefix='', comment=False):
+ def DefineType(self, node, releases, prefix='', comment=False):
dmichael (off chromium) 2011/08/24 20:49:11 Why the trivial function? Is this speculative codi
noelallen1 2011/08/24 22:43:06 A 'type' doesn't have anything to emit for C heade
return ''
#
@@ -431,125 +424,63 @@
#
def Copyright(self, node, tabs=0):
lines = node.GetName().split('\n')
- return self.CommentLines(lines, tabs)
+ return CommentLines(lines, tabs)
- def Comment(self, node, prefix=None, tabs=0):
- comment = node.GetName()
- # Ignore comments that do not have a '*' marker
-# if comment[0] != '*' and not prefix: return ''
-
- lines = comment.split('\n')
- if prefix:
- prefix = prefix.split('\n')
- if prefix[0] == '*' and lines[0] == '*':
- lines = prefix + lines[1:]
- else:
- lines = prefix + lines;
- return self.CommentLines(lines, tabs)
-
- def CommentLines(self, lines, tabs=0):
- tab = ''.join([' ' for i in range(tabs)])
- if lines[-1] == '':
- return '%s/*' % tab + ('\n%s *' % tab).join(lines) + '/\n'
- else:
- return '%s/*' % tab + ('\n%s *' % tab).join(lines) + ' */\n'
-
-
# Define a top level object.
- def Define(self, node, tabs=0, prefix='', comment=False):
- if True:
-# try:
- self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix))
+ def Define(self, node, releases, tabs=0, prefix='', comment=False):
+ if not node.InReleases(releases):
+ return ''
- node_nim = node.GetProperty('version')
- node_max = node.GetProperty('deprecate')
+ self.LogEnter('Define %s tab=%d prefix="%s"' % (node,tabs,prefix))
+ declmap = {
+ 'Describe' : CGen.DefineType,
+ 'Enum' : CGen.DefineEnum,
+ 'Function' : CGen.DefineMember,
+ 'Interface' : CGen.DefineStruct,
+ 'Member' : CGen.DefineMember,
+ 'Struct' : CGen.DefineStruct,
+ 'Type' : CGen.DefineType,
+ 'Typedef' : CGen.DefineTypedef,
+ }
- if node_nim is not None:
- node_nim = float(node_nim)
- else:
- node_nim = 0.0
+ out = ''
+ func = declmap.get(node.cls)
+ if not func:
+ ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName()))
+ define_txt = func(self, node, releases, prefix=prefix, comment=comment)
- if node_max is not None:
- node_max = float(node_max)
- else:
- node_max = 1.0e100
+ comment_txt = GetNodeComments(node, tabs=0)
+ if comment_txt and comment:
+ out += '%s%s' % (comment_txt, define_txt)
dmichael (off chromium) 2011/08/24 20:49:11 Doesn't the % operator seem like overkill here? ou
noelallen1 2011/08/24 22:43:06 Done.
+ else:
+ out += define_txt
- label = node.GetLabel()
- if label:
- lver = label.GetVersion(self.release)
+ tab = ' ' * tabs
+ lines = []
+ for line in out.split('\n'):
+ # Add indentation
+ line = '%s%s' % (tab, line)
dmichael (off chromium) 2011/08/24 20:49:11 again with the percent operator for just concatena
noelallen1 2011/08/24 22:43:06 Done.
+ if len(line) > 80:
+ left = line.rfind('(') + 1
+ args = line[left:].split(',')
+ line_max = 0
+ for arg in args:
+ if len(arg) > line_max: line_max = len(arg)
- # Verify that we are in a valid version.
- if node_max <= lver: return ''
- if node_nim > lver: return ''
-
- declmap = {
- 'Describe' : CGen.DefineType,
- 'Enum' : CGen.DefineEnum,
- 'Function' : CGen.DefineMember,
- 'Interface' : CGen.DefineStruct,
- 'Member' : CGen.DefineMember,
- 'Struct' : CGen.DefineStruct,
- 'Type' : CGen.DefineType,
- 'Typedef' : CGen.DefineTypedef,
- }
-
- if node.cls == 'Inline':
- return node.GetProperty('VALUE')
-
- if node.cls == 'Label':
- return ''
-
- out = ''
- comment_txt = ''
- if comment:
- for doc in node.GetListOf('Comment'):
- comment_txt += self.Comment(doc)
-
- func = declmap.get(node.cls)
- if not func:
- ErrOut.Log('Failed to define %s named %s' % (node.cls, node.GetName()))
-
- define_txt = func(self, node, prefix=prefix, comment=comment)
- if comment_txt:
- out += '%s%s' % (comment_txt, define_txt)
+ if left + line_max >= 80:
+ space = '%s ' % tab
+ args = (',\n%s' % space).join([arg.strip() for arg in args])
+ lines.append('%s\n%s%s' % (line[:left], space, args))
+ else:
+ space = ' '.join(['' for i in range(left)])
dmichael (off chromium) 2011/08/24 20:49:11 Why not just ' ' * (left-1) Seems clearer to me, a
+ args = (',\n%s' % space).join(args)
+ lines.append('%s%s' % (line[:left], args))
else:
- out += define_txt
+ lines.append(line.rstrip())
+ self.LogExit('Exit Define')
+ return '\n'.join(lines)
- tab = ''
- for i in range(tabs):
- tab += ' '
-
- lines = []
- for line in out.split('\n'):
- # Add indentation
- line = '%s%s' % (tab, line)
- if len(line) > 80:
- left = line.rfind('(') + 1
- args = line[left:].split(',')
- line_max = 0
- for arg in args:
- if len(arg) > line_max: line_max = len(arg)
-
- if left + line_max >= 80:
- space = '%s ' % tab
- args = (',\n%s' % space).join([arg.strip() for arg in args])
- lines.append('%s\n%s%s' % (line[:left], space, args))
- else:
- space = ' '.join(['' for i in range(left)])
- args = (',\n%s' % space).join(args)
- lines.append('%s%s' % (line[:left], args))
- else:
- lines.append(line.rstrip())
-
- # out = tab + ('\n%s' % tab).join(out.split('\n')) + '\n'
- self.LogExit('Exit Define')
- return '\n'.join(lines)
-# except:
- if False:
- node.Error('Failed to resolve.')
- return ''
-
# Clean a string representing an object definition and return then string
# as a single space delimited set of tokens.
def CleanString(instr):
@@ -569,7 +500,7 @@
instr.Dump()
instr = CleanString(instr.GetName())
- outstr = cgen.Define(node)
+ outstr = cgen.Define(node, releases=['M14'])
if GetOption('verbose'):
print outstr + '\n'
outstr = CleanString(outstr)

Powered by Google App Engine
This is Rietveld 408576698