Chromium Code Reviews| 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) |