diff options
author | teravest@chromium.org <teravest@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-25 17:18:04 +0000 |
---|---|---|
committer | teravest@chromium.org <teravest@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-25 17:18:04 +0000 |
commit | 8917a67934617e7627d9241e8fb31545d4141429 (patch) | |
tree | 6e21410ab64832a51499bd05716c5e98836e2667 /ppapi/generators | |
parent | 60780f41729ab40ba08b93ad4c279fbe0aee4c13 (diff) | |
download | chromium_src-8917a67934617e7627d9241e8fb31545d4141429.zip chromium_src-8917a67934617e7627d9241e8fb31545d4141429.tar.gz chromium_src-8917a67934617e7627d9241e8fb31545d4141429.tar.bz2 |
Pepper IDL: Autogenerate thunk for ppb_audio_input
BUG=
Review URL: https://chromiumcodereview.appspot.com/12212166
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184424 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/generators')
-rwxr-xr-x | ppapi/generators/idl_thunk.py | 129 |
1 files changed, 86 insertions, 43 deletions
diff --git a/ppapi/generators/idl_thunk.py b/ppapi/generators/idl_thunk.py index 117f54a..a754e3f 100755 --- a/ppapi/generators/idl_thunk.py +++ b/ppapi/generators/idl_thunk.py @@ -163,38 +163,41 @@ def _MakeCreateMemberBody(interface, member, args): args - List of arguments for the Create() function """ if args[0][0] == 'PP_Resource': - body = ' Resource* object =\n' - body += ' PpapiGlobals::Get()->GetResourceTracker()->' + body = 'Resource* object =\n' + body += ' PpapiGlobals::Get()->GetResourceTracker()->' body += 'GetResource(%s);\n' % args[0][1] - body += ' if (!object)\n' - body += ' return 0;\n' - body += ' EnterResourceCreation enter(object->pp_instance());\n' + body += 'if (!object)\n' + body += ' return 0;\n' + body += 'EnterResourceCreation enter(object->pp_instance());\n' elif args[0][0] == 'PP_Instance': - body = ' EnterResourceCreation enter(%s);\n' % args[0][1] + body = 'EnterResourceCreation enter(%s);\n' % args[0][1] else: raise TGenError('Unknown arg type for Create(): %s' % args[0][0]) - body += ' if (enter.failed())\n' - body += ' return 0;\n' + body += 'if (enter.failed())\n' + body += ' return 0;\n' arg_list = ', '.join([a[1] for a in args]) if member.GetProperty('create_func'): create_func = member.GetProperty('create_func') else: create_func = _GetCreateFuncName(interface) - body += ' return enter.functions()->%s(%s);' % (create_func, - arg_list) + body += 'return enter.functions()->%s(%s);' % (create_func, + arg_list) return body -def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta): +def _MakeNormalMemberBody(filenode, release, node, member, rtype, args, + include_version, meta): """Returns the body of a typical function. Args: filenode - IDLNode for the file + release - release to generate body for node - IDLNode for the interface member - IDLNode for the member function rtype - Return type for the member function args - List of 4-tuple arguments for the member function + include_version - whether to include the version in the invocation meta - ThunkBodyMetadata for header hints """ is_callback_func = args[len(args) - 1][0] == 'struct PP_CompletionCallback' @@ -212,25 +215,30 @@ def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta): call_arglist = ', '.join(a[1] for a in call_args[1:]) function_container = 'object' + function_name = member.GetName() + if include_version: + version = node.GetVersion(release).replace('.', '_') + function_name += version + invocation = 'enter.%s()->%s(%s)' % (function_container, - member.GetName(), + function_name, call_arglist) handle_errors = not (member.GetProperty('report_errors') == 'False') if is_callback_func: - body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, - args[len(args) - 1][1], meta) - body += ' if (enter.failed())\n' + body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, + args[len(args) - 1][1], meta) + body += 'if (enter.failed())\n' value = member.GetProperty('on_failure') if value is None: value = 'enter.retval()' - body += ' return %s;\n' % value - body += ' return enter.SetResult(%s);' % invocation + body += ' return %s;\n' % value + body += 'return enter.SetResult(%s);' % invocation elif rtype == 'void': - body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, - None, meta) - body += ' if (enter.succeeded())\n' - body += ' %s;' % invocation + body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, + None, meta) + body += 'if (enter.succeeded())\n' + body += ' %s;' % invocation else: value = member.GetProperty('on_failure') if value is None: @@ -238,11 +246,11 @@ def _MakeNormalMemberBody(filenode, node, member, rtype, args, meta): if value is None: raise TGenError('No default value for rtype %s' % rtype) - body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, - None, meta) - body += ' if (enter.failed())\n' - body += ' return %s;\n' % value - body += ' return %s;' % invocation + body = '%s\n' % _MakeEnterLine(filenode, node, args[0], handle_errors, + None, meta) + body += 'if (enter.failed())\n' + body += ' return %s;\n' % value + body += 'return %s;' % invocation return body @@ -263,17 +271,49 @@ def DefineMember(filenode, node, member, release, include_version, meta): rtype, name, arrays, args = cgen.GetComponents(member, release, 'return') if _IsTypeCheck(node, member): - body = ' %s\n' % _MakeEnterLine(filenode, node, args[0], False, None, meta) - body += ' return PP_FromBool(enter.succeeded());' + body = '%s\n' % _MakeEnterLine(filenode, node, args[0], False, None, meta) + body += 'return PP_FromBool(enter.succeeded());' elif member.GetName() == 'Create': body = _MakeCreateMemberBody(node, member, args) else: - body = _MakeNormalMemberBody(filenode, node, member, rtype, args, meta) + body = _MakeNormalMemberBody(filenode, release, node, member, rtype, args, + include_version, meta) signature = cgen.GetSignature(member, release, 'return', func_as_ptr=False, include_version=include_version) - member_code = '%s {\n%s\n}' % (signature, body) - return cgen.Indent(member_code, tabs=0) + return '%s\n%s\n}' % (cgen.Indent('%s {' % signature, tabs=0), + cgen.Indent(body, tabs=1)) + + +def _IsNewestMember(member, members, releases): + """Returns true if member is the newest node with its name in members. + + Currently, every node in the AST only has one version. This means that we + will have two sibling nodes with the same name to represent different + versions. + See http://crbug.com/157017 . + + Special handling is required for nodes which share their name with others, + but aren't the newest version in the IDL. + + Args: + member - The member which is checked if it's newest + members - The list of members to inspect + releases - The set of releases to check for versions in. + """ + build_list = member.GetUniqueReleases(releases) + assert(len(build_list) == 1) + release = build_list[-1] # Pick the newest release. + same_name_siblings = filter( + lambda n: str(n) == str(member) and n != member, members) + + for s in same_name_siblings: + sibling_build_list = s.GetUniqueReleases(releases) + assert(len(sibling_build_list) == 1) + sibling_release = sibling_build_list[-1] + if sibling_release > release: + return False + return True class TGen(GeneratorByFile): @@ -347,7 +387,7 @@ class TGen(GeneratorByFile): meta - a ThunkMetadata instance for hinting which headers are needed. """ __pychecker__ = 'unusednames=options' - members = [] + out_members = [] meta = ThunkBodyMetadata() for node in filenode.GetListOf('Interface'): # Skip if this node is not in this release @@ -357,23 +397,22 @@ class TGen(GeneratorByFile): # Generate Member functions if node.IsA('Interface'): - for child in node.GetListOf('Member'): + members = node.GetListOf('Member') + for child in members: build_list = child.GetUniqueReleases(releases) # We have to filter out releases this node isn't in. build_list = filter(lambda r: child.InReleases([r]), build_list) if len(build_list) == 0: continue - release = build_list[-1] # Pick the newest release. - member = DefineMember(filenode, node, child, release, False, meta) + assert(len(build_list) == 1) + release = build_list[-1] + include_version = not _IsNewestMember(child, members, releases) + member = DefineMember(filenode, node, child, release, include_version, + meta) if not member: continue - members.append(member) - for build in build_list[:-1]: - member = DefineMember(filenode, node, child, build, True, meta) - if not member: - continue - members.append(member) - return (members, meta) + out_members.append(member) + return (out_members, meta) def WriteTail(self, out, filenode, releases, options): __pychecker__ = 'unusednames=options' @@ -392,9 +431,13 @@ class TGen(GeneratorByFile): out.Write('const %s %s = {\n' % (thunk_type, thunk_name)) generated_functions = [] - for child in node.GetListOf('Member'): + members = node.GetListOf('Member') + for child in members: rtype, name, arrays, args = cgen.GetComponents( child, build, 'return') + if not _IsNewestMember(child, members, releases): + version = node.GetVersion(build).replace('.', '_') + name += '_' + version if child.InReleases([build]): generated_functions.append(name) out.Write(',\n'.join([' &%s' % f for f in generated_functions])) |