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

Side by Side Diff: ppapi/generators/idl_thunk.py

Issue 14007010: Pepper: Autogenerate thunk for PPB_URL_Loader. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix sizeof statements Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/api/trusted/ppb_url_loader_trusted.idl ('k') | ppapi/ppapi_shared.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ Generator for C++ style thunks """ 6 """ Generator for C++ style thunks """
7 7
8 import glob 8 import glob
9 import os 9 import os
10 import re 10 import re
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 arg_list = ', '.join([a[1] for a in args]) 207 arg_list = ', '.join([a[1] for a in args])
208 if member.GetProperty('create_func'): 208 if member.GetProperty('create_func'):
209 create_func = member.GetProperty('create_func') 209 create_func = member.GetProperty('create_func')
210 else: 210 else:
211 create_func = _GetCreateFuncName(interface) 211 create_func = _GetCreateFuncName(interface)
212 body += 'return enter.functions()->%s(%s);' % (create_func, 212 body += 'return enter.functions()->%s(%s);' % (create_func,
213 arg_list) 213 arg_list)
214 return body 214 return body
215 215
216 216
217 def _GetOutputParams(member, release):
218 """Returns output parameters (and their types) for a member function.
219
220 Args:
221 member - IDLNode for the member function
222 release - Release to get output parameters for
223 Returns:
224 A list of name strings for all output parameters of the member
225 function.
226 """
227 out_params = []
228 callnode = member.GetOneOf('Callspec')
229 if callnode:
230 cgen = CGen()
231 for param in callnode.GetListOf('Param'):
232 mode = cgen.GetParamMode(param)
233 if mode == 'out':
234 # We use the 'store' mode when getting the parameter type, since we
235 # need to call sizeof() for memset().
236 _, pname, _, _ = cgen.GetComponents(param, release, 'store')
237 out_params.append(pname)
238 return out_params
239
240
217 def _MakeNormalMemberBody(filenode, release, node, member, rtype, args, 241 def _MakeNormalMemberBody(filenode, release, node, member, rtype, args,
218 include_version, meta): 242 include_version, meta):
219 """Returns the body of a typical function. 243 """Returns the body of a typical function.
220 244
221 Args: 245 Args:
222 filenode - IDLNode for the file 246 filenode - IDLNode for the file
223 release - release to generate body for 247 release - release to generate body for
224 node - IDLNode for the interface 248 node - IDLNode for the interface
225 member - IDLNode for the member function 249 member - IDLNode for the member function
226 rtype - Return type for the member function 250 rtype - Return type for the member function
(...skipping 19 matching lines...) Expand all
246 function_name = member.GetName() 270 function_name = member.GetName()
247 if include_version: 271 if include_version:
248 version = node.GetVersion(release).replace('.', '_') 272 version = node.GetVersion(release).replace('.', '_')
249 function_name += version 273 function_name += version
250 274
251 invocation = 'enter.%s()->%s(%s)' % (function_container, 275 invocation = 'enter.%s()->%s(%s)' % (function_container,
252 function_name, 276 function_name,
253 call_arglist) 277 call_arglist)
254 278
255 handle_errors = not (member.GetProperty('report_errors') == 'False') 279 handle_errors = not (member.GetProperty('report_errors') == 'False')
280 out_params = _GetOutputParams(member, release)
256 if is_callback_func: 281 if is_callback_func:
282 # TODO(teravest): Reduce code duplication below.
257 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0], 283 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0],
258 handle_errors, args[len(args) - 1][1], meta) 284 handle_errors, args[len(args) - 1][1], meta)
259 body += 'if (enter.failed())\n'
260 value = member.GetProperty('on_failure') 285 value = member.GetProperty('on_failure')
261 if value is None: 286 if value is None:
262 value = 'enter.retval()' 287 value = 'enter.retval()'
263 body += ' return %s;\n' % value 288 if member.GetProperty('always_set_output_parameters'):
264 body += 'return enter.SetResult(%s);' % invocation 289 body += 'if (enter.failed()) {\n'
290 for param in out_params:
291 body += ' memset(%s, 0, sizeof(*%s));\n' % (param, param)
292 body += ' return %s;\n' % value
293 body += '}\n'
294 body += 'return enter.SetResult(%s);' % invocation
295 meta.AddBuiltinInclude('string.h')
296 else:
297 body += 'if (enter.failed())\n'
298 body += ' return %s;\n' % value
299 body += 'return enter.SetResult(%s);' % invocation
265 elif rtype == 'void': 300 elif rtype == 'void':
266 # On failure, zero out all output parameters.
267 out_params = []
268 callnode = member.GetOneOf('Callspec')
269 if callnode:
270 cgen = CGen()
271 for param in callnode.GetListOf('Param'):
272 mode = cgen.GetParamMode(param)
273 if mode == 'out':
274 # We use the 'store' mode when getting the parameter type, since we
275 # need to call sizeof() for memset().
276 ptype, pname, _, _ = cgen.GetComponents(param, release, 'store')
277 out_params.append((pname, ptype))
278
279 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0], 301 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0],
280 handle_errors, None, meta) 302 handle_errors, None, meta)
281 if not out_params: 303 if member.GetProperty('always_set_output_parameters'):
282 body += 'if (enter.succeeded())\n'
283 body += ' %s;' % invocation
284 else:
285 body += 'if (enter.succeeded()) {\n' 304 body += 'if (enter.succeeded()) {\n'
286 body += ' %s;\n' % invocation 305 body += ' %s;\n' % invocation
287 body += ' return;\n' 306 body += ' return;\n'
288 body += '}' 307 body += '}'
289 for param in out_params: 308 for param in out_params:
290 body += '\nmemset(%s, 0, sizeof(%s));' % param 309 body += '\nmemset(%s, 0, sizeof(*%s));' % (param, param)
291 meta.AddBuiltinInclude('string.h') 310 meta.AddBuiltinInclude('string.h')
311 else:
312 body += 'if (enter.succeeded())\n'
313 body += ' %s;' % invocation
292 314
293 else: 315 else:
294 value = member.GetProperty('on_failure') 316 value = member.GetProperty('on_failure')
295 if value is None: 317 if value is None:
296 value = _GetDefaultFailureValue(rtype) 318 value = _GetDefaultFailureValue(rtype)
297 if value is None: 319 if value is None:
298 raise TGenError('No default value for rtype %s' % rtype) 320 raise TGenError('No default value for rtype %s' % rtype)
299 321
300 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0], 322 body = '%s\n' % _MakeEnterLine(filenode, node, member, args[0],
301 handle_errors, None, meta) 323 handle_errors, None, meta)
302 body += 'if (enter.failed())\n' 324 if member.GetProperty('always_set_output_parameters'):
303 body += ' return %s;\n' % value 325 body += 'if (enter.failed()) {\n'
304 body += 'return %s;' % invocation 326 for param in out_params:
327 body += ' memset(%s, 0, sizeof(*%s));\n' % (param, param)
328 body += ' return %s;\n' % value
329 body += '}\n'
330 body += 'return %s;' % invocation
331 meta.AddBuiltinInclude('string.h')
332 else:
333 body += 'if (enter.failed())\n'
334 body += ' return %s;\n' % value
335 body += 'return %s;' % invocation
305 return body 336 return body
306 337
307 338
308 def DefineMember(filenode, node, member, release, include_version, meta): 339 def DefineMember(filenode, node, member, release, include_version, meta):
309 """Returns a definition for a member function of an interface. 340 """Returns a definition for a member function of an interface.
310 341
311 Args: 342 Args:
312 filenode - IDLNode for the file 343 filenode - IDLNode for the file
313 node - IDLNode for the interface 344 node - IDLNode for the interface
314 member - IDLNode for the member function 345 member - IDLNode for the member function
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 print "Golden file for M13-M14 failed." 569 print "Golden file for M13-M14 failed."
539 failed = 1 570 failed = 1
540 else: 571 else:
541 print "Golden file for M13-M14 passed." 572 print "Golden file for M13-M14 passed."
542 573
543 return failed 574 return failed
544 575
545 576
546 if __name__ == '__main__': 577 if __name__ == '__main__':
547 sys.exit(Main(sys.argv[1:])) 578 sys.exit(Main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « ppapi/api/trusted/ppb_url_loader_trusted.idl ('k') | ppapi/ppapi_shared.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698