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

Side by Side Diff: client/dom/scripts/systemnative.py

Issue 9467007: Support ImplementedBy idl attribute. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Deal with DOM exceptions in one place. Created 8 years, 10 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 | « no previous file | no next file » | 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/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module provides shared functionality for the systems to generate 6 """This module provides shared functionality for the systems to generate
7 native binding from the IDL database.""" 7 native binding from the IDL database."""
8 8
9 import emitter 9 import emitter
10 import os 10 import os
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 constructor_info = AnalyzeConstructor(self._interface) 269 constructor_info = AnalyzeConstructor(self._interface)
270 if constructor_info is None: 270 if constructor_info is None:
271 # We have a custom implementation for it. 271 # We have a custom implementation for it.
272 self._cpp_declarations_emitter.Emit( 272 self._cpp_declarations_emitter.Emit(
273 '\n' 273 '\n'
274 'void constructorCallback(Dart_NativeArguments);\n') 274 'void constructorCallback(Dart_NativeArguments);\n')
275 return 275 return
276 276
277 raises_dom_exceptions = 'ConstructorRaisesException' in self._interface.ext_ attrs 277 raises_dom_exceptions = 'ConstructorRaisesException' in self._interface.ext_ attrs
278 raises_dart_exceptions = raises_dom_exceptions or len(constructor_info.idl_a rgs) > 0 278 raises_dart_exceptions = raises_dom_exceptions or len(constructor_info.idl_a rgs) > 0
279 type_info = GetIDLTypeInfo(self._interface)
280 arguments = [] 279 arguments = []
281 parameter_definitions_emitter = emitter.Emitter() 280 parameter_definitions_emitter = emitter.Emitter()
282 if 'CallWith' in self._interface.ext_attrs: 281 if 'CallWith' in self._interface.ext_attrs:
283 call_with = self._interface.ext_attrs['CallWith'] 282 call_with = self._interface.ext_attrs['CallWith']
284 if call_with == 'ScriptExecutionContext': 283 if call_with == 'ScriptExecutionContext':
285 raises_dart_exceptions = True 284 raises_dart_exceptions = True
286 parameter_definitions_emitter.Emit( 285 parameter_definitions_emitter.Emit(
287 ' ScriptExecutionContext* context = DartUtilities::scriptExec utionContext();\n' 286 ' ScriptExecutionContext* context = DartUtilities::scriptExec utionContext();\n'
288 ' if (!context) {\n' 287 ' if (!context) {\n'
289 ' exception = Dart_NewString("Failed to create an object" );\n' 288 ' exception = Dart_NewString("Failed to create an object" );\n'
290 ' goto fail;\n' 289 ' goto fail;\n'
291 ' }\n') 290 ' }\n')
292 arguments.append('context') 291 arguments.append('context')
293 else: 292 else:
294 raise Exception('Unsupported CallWith=%s attribute' % call_with) 293 raise Exception('Unsupported CallWith=%s attribute' % call_with)
295 294
296 # Process constructor arguments. 295 # Process constructor arguments.
297 for (i, arg) in enumerate(constructor_info.idl_args): 296 for (i, arg) in enumerate(constructor_info.idl_args):
298 self._GenerateParameterAdapter(parameter_definitions_emitter, arg, i - 1) 297 self._GenerateParameterAdapter(parameter_definitions_emitter, arg, i - 1)
299 arguments.append(arg.id) 298 arguments.append(arg.id)
300 299
301 self._GenerateNativeCallback( 300 function_expression = '%s::create' % self._interface_type_info.native_type()
302 callback_name='constructorCallback', 301 invocation = self._GenerateWebCoreInvocation(function_expression, arguments,
303 idl_node=self._interface, 302 self._interface, self._interface.ext_attrs, raises_dom_exceptions)
303 self._GenerateNativeCallback(callback_name='constructorCallback',
antonm 2012/02/27 13:17:33 nit: I'd prefer to callback_name='...' on a separa
304 parameter_definitions=parameter_definitions_emitter.Fragments(), 304 parameter_definitions=parameter_definitions_emitter.Fragments(),
305 needs_receiver=False, function_name='%s::create' % type_info.native_type (), 305 needs_receiver=False, invocation=invocation,
306 arguments=arguments, 306 raises_exceptions=raises_dart_exceptions)
307 idl_return_type=self._interface,
308 raises_dart_exceptions=raises_dart_exceptions,
309 raises_dom_exceptions=raises_dom_exceptions)
310
311 307
312 def _ImplClassName(self, interface_name): 308 def _ImplClassName(self, interface_name):
313 return interface_name + 'Implementation' 309 return interface_name + 'Implementation'
314 310
315 def _IsConstructable(self): 311 def _IsConstructable(self):
316 # FIXME: support ConstructorTemplate. 312 # FIXME: support ConstructorTemplate.
317 # FIXME: support NamedConstructor. 313 # FIXME: support NamedConstructor.
318 return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor']) & se t(self._interface.ext_attrs) 314 return set(['CustomConstructor', 'V8CustomConstructor', 'Constructor']) & se t(self._interface.ext_attrs)
319 315
320 def FinishInterface(self): 316 def FinishInterface(self):
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 DECLARATIONS=self._cpp_declarations_emitter.Fragments()) 366 DECLARATIONS=self._cpp_declarations_emitter.Fragments())
371 367
372 def AddAttribute(self, getter, setter): 368 def AddAttribute(self, getter, setter):
373 # FIXME: Dartium does not support attribute event listeners. However, JS 369 # FIXME: Dartium does not support attribute event listeners. However, JS
374 # implementation falls back to them when addEventListener is not available. 370 # implementation falls back to them when addEventListener is not available.
375 # Make sure addEventListener is available in all EventTargets and remove 371 # Make sure addEventListener is available in all EventTargets and remove
376 # this check. 372 # this check.
377 if (getter or setter).type.id == 'EventListener': 373 if (getter or setter).type.id == 'EventListener':
378 return 374 return
379 375
380 # FIXME: support 'ImplementedBy'.
381 if 'ImplementedBy' in (getter or setter).ext_attrs:
382 return
383
384 # FIXME: these should go away. 376 # FIXME: these should go away.
385 classes_with_unsupported_custom_getters = [ 377 classes_with_unsupported_custom_getters = [
386 'Clipboard', 'Console', 'Coordinates', 'DeviceMotionEvent', 378 'Clipboard', 'Console', 'Coordinates', 'DeviceMotionEvent',
387 'DeviceOrientationEvent', 'FileReader', 'JavaScriptCallFrame', 379 'DeviceOrientationEvent', 'FileReader', 'JavaScriptCallFrame',
388 'HTMLInputElement', 'HTMLOptionsCollection', 'HTMLOutputElement', 380 'HTMLInputElement', 'HTMLOptionsCollection', 'HTMLOutputElement',
389 'ScriptProfileNode', 'WebKitAnimation'] 381 'ScriptProfileNode', 'WebKitAnimation']
390 if (self._interface.id in classes_with_unsupported_custom_getters and 382 if (self._interface.id in classes_with_unsupported_custom_getters and
391 getter and set(['Custom', 'CustomGetter']) & set(getter.ext_attrs)): 383 getter and set(['Custom', 'CustomGetter']) & set(getter.ext_attrs)):
392 return 384 return
393 385
(...skipping 27 matching lines...) Expand all
421 else: 413 else:
422 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)', 414 webcore_function_name = re.sub(r'^(HTML|URL|JS|XML|XSLT|\w)',
423 lambda s: s.group(1).lower(), 415 lambda s: s.group(1).lower(),
424 attr.id) 416 attr.id)
425 webcore_function_name = re.sub(r'^(create|exclusive)', 417 webcore_function_name = re.sub(r'^(create|exclusive)',
426 lambda s: 'is' + s.group(1).capitalize(), 418 lambda s: 'is' + s.group(1).capitalize(),
427 webcore_function_name) 419 webcore_function_name)
428 if attr.type.id.startswith('SVGAnimated'): 420 if attr.type.id.startswith('SVGAnimated'):
429 webcore_function_name += 'Animated' 421 webcore_function_name += 'Animated'
430 422
431 self._GenerateNativeCallback(cpp_callback_name, attr, '', 423 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr)
432 True, webcore_function_name, arguments, idl_return_type=attr.type, 424 invocation = self._GenerateWebCoreInvocation(function_expression,
433 raises_dart_exceptions=attr.get_raises, 425 arguments, attr.type, attr.ext_attrs, attr.get_raises)
434 raises_dom_exceptions=attr.get_raises) 426 self._GenerateNativeCallback(cpp_callback_name, '', True, invocation,
427 raises_exceptions=attr.get_raises)
435 428
436 def _AddSetter(self, attr): 429 def _AddSetter(self, attr):
437 dart_declaration = 'void set %s(%s)' % (attr.id, attr.type.id) 430 dart_declaration = 'void set %s(%s)' % (attr.id, attr.type.id)
438 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext _attrs) 431 is_custom = set(['Custom', 'CustomSetter', 'V8CustomSetter']) & set(attr.ext _attrs)
439 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2, 432 cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
440 dart_declaration, 'Setter', is_custom) 433 dart_declaration, 'Setter', is_custom)
441 if is_custom: 434 if is_custom:
442 return 435 return
443 436
444 arguments = [] 437 arguments = []
445 if 'Reflect' in attr.ext_attrs: 438 if 'Reflect' in attr.ext_attrs:
446 webcore_function_name = GetIDLTypeInfo(attr.type).webcore_setter_name() 439 webcore_function_name = GetIDLTypeInfo(attr.type).webcore_setter_name()
447 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr)) 440 arguments.append(self._GenerateWebCoreReflectionAttributeName(attr))
448 else: 441 else:
449 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)', 442 webcore_function_name = re.sub(r'^(xml(?=[A-Z])|\w)',
450 lambda s: s.group(1).upper(), 443 lambda s: s.group(1).upper(),
451 attr.id) 444 attr.id)
452 webcore_function_name = 'set%s' % webcore_function_name 445 webcore_function_name = 'set%s' % webcore_function_name
453 if attr.type.id.startswith('SVGAnimated'): 446 if attr.type.id.startswith('SVGAnimated'):
454 webcore_function_name += 'Animated' 447 webcore_function_name += 'Animated'
455 448
456 arguments.append(attr.id) 449 arguments.append(attr.id)
450
457 parameter_definitions_emitter = emitter.Emitter() 451 parameter_definitions_emitter = emitter.Emitter()
458 self._GenerateParameterAdapter(parameter_definitions_emitter, attr, 0) 452 self._GenerateParameterAdapter(parameter_definitions_emitter, attr, 0)
459 parameter_definitions = parameter_definitions_emitter.Fragments() 453 parameter_definitions = parameter_definitions_emitter.Fragments()
460 self._GenerateNativeCallback(cpp_callback_name, attr, parameter_definitions, 454
461 True, webcore_function_name, arguments, idl_return_type=None, 455 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, attr)
462 raises_dart_exceptions=True, 456 invocation = self._GenerateWebCoreInvocation(function_expression,
463 raises_dom_exceptions=attr.set_raises) 457 arguments, None, attr.ext_attrs, attr.set_raises)
458
459 self._GenerateNativeCallback(cpp_callback_name, parameter_definitions,
460 True, invocation, raises_exceptions=True)
464 461
465 def _HasNativeIndexGetter(self, interface): 462 def _HasNativeIndexGetter(self, interface):
466 return ('CustomIndexedGetter' in interface.ext_attrs or 463 return ('CustomIndexedGetter' in interface.ext_attrs or
467 'NumericIndexedGetter' in interface.ext_attrs) 464 'NumericIndexedGetter' in interface.ext_attrs)
468 465
469 def _EmitNativeIndexGetter(self, interface, element_type): 466 def _EmitNativeIndexGetter(self, interface, element_type):
470 dart_declaration = '%s operator[](int index)' % element_type 467 dart_declaration = '%s operator[](int index)' % element_type
471 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration, 468 self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration,
472 'Callback', True) 469 'Callback', True)
473 470
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 def GenerateSingleOperation(self, dispatch_emitter, info, indent, operation): 508 def GenerateSingleOperation(self, dispatch_emitter, info, indent, operation):
512 """Generates a call to a single operation. 509 """Generates a call to a single operation.
513 510
514 Arguments: 511 Arguments:
515 dispatch_emitter: an dispatch_emitter for the body of a block of code. 512 dispatch_emitter: an dispatch_emitter for the body of a block of code.
516 info: the compound information about the operation and its overloads. 513 info: the compound information about the operation and its overloads.
517 indent: an indentation string for generated code. 514 indent: an indentation string for generated code.
518 operation: the IDLOperation to call. 515 operation: the IDLOperation to call.
519 """ 516 """
520 517
521 # FIXME: support ImplementedBy callbacks.
522 if 'ImplementedBy' in operation.ext_attrs:
523 return
524
525 for op in self._interface.operations: 518 for op in self._interface.operations:
526 if op.id != operation.id or len(op.arguments) <= len(operation.arguments): 519 if op.id != operation.id or len(op.arguments) <= len(operation.arguments):
527 continue 520 continue
528 next_argument = op.arguments[len(operation.arguments)] 521 next_argument = op.arguments[len(operation.arguments)]
529 if next_argument.is_optional and 'Callback' in next_argument.ext_attrs: 522 if next_argument.is_optional and 'Callback' in next_argument.ext_attrs:
530 # FIXME: '[Optional, Callback]' arguments could be non-optional in 523 # FIXME: '[Optional, Callback]' arguments could be non-optional in
531 # webcore. We need to fix overloads handling to generate native 524 # webcore. We need to fix overloads handling to generate native
532 # callbacks properly. 525 # callbacks properly.
533 return 526 return
534 527
(...skipping 20 matching lines...) Expand all
555 dart_declaration = '%s _%s(%s)' % (info.type_name, native_name, 548 dart_declaration = '%s _%s(%s)' % (info.type_name, native_name,
556 argument_list) 549 argument_list)
557 is_custom = 'Custom' in operation.ext_attrs 550 is_custom = 'Custom' in operation.ext_attrs
558 cpp_callback_name = self._GenerateNativeBinding( 551 cpp_callback_name = self._GenerateNativeBinding(
559 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback', 552 native_name, 1 + len(operation.arguments), dart_declaration, 'Callback',
560 is_custom) 553 is_custom)
561 if is_custom: 554 if is_custom:
562 return 555 return
563 556
564 # Generate callback. 557 # Generate callback.
565 webcore_function_name = operation.id 558 webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.i d)
566 if 'ImplementedAs' in operation.ext_attrs:
567 webcore_function_name = operation.ext_attrs['ImplementedAs']
568 559
569 parameter_definitions_emitter = emitter.Emitter() 560 parameter_definitions_emitter = emitter.Emitter()
570 raises_dart_exceptions = len(operation.arguments) > 0 or operation.raises 561 raises_dart_exceptions = len(operation.arguments) > 0 or operation.raises
571 arguments = [] 562 arguments = []
572 563
573 # Process 'CallWith' argument. 564 # Process 'CallWith' argument.
574 if 'CallWith' in operation.ext_attrs: 565 if 'CallWith' in operation.ext_attrs:
575 call_with = operation.ext_attrs['CallWith'] 566 call_with = operation.ext_attrs['CallWith']
576 if call_with == 'ScriptExecutionContext': 567 if call_with == 'ScriptExecutionContext':
577 parameter_definitions_emitter.Emit( 568 parameter_definitions_emitter.Emit(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 if len(operation.arguments) == 2: 604 if len(operation.arguments) == 2:
614 arguments.append('false') 605 arguments.append('false')
615 606
616 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope rty': 607 if self._interface.id == 'CSSStyleDeclaration' and operation.id == 'setPrope rty':
617 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart 608 # CSSStyleDeclaration.setProperty priority parameter is optional in Dart
618 # idl, but is not optional in webcore implementation. 609 # idl, but is not optional in webcore implementation.
619 if len(operation.arguments) == 2: 610 if len(operation.arguments) == 2:
620 arguments.append('String()') 611 arguments.append('String()')
621 612
622 if 'NeedsUserGestureCheck' in operation.ext_attrs: 613 if 'NeedsUserGestureCheck' in operation.ext_attrs:
623 arguments.extend('DartUtilities::processingUserGesture') 614 arguments.append('DartUtilities::processingUserGesture')
624 615
625 parameter_definitions = parameter_definitions_emitter.Fragments() 616 function_expression = self._GenerateWebCoreFunctionExpression(webcore_functi on_name, operation)
626 self._GenerateNativeCallback(cpp_callback_name, operation, parameter_definit ions, 617 invocation = self._GenerateWebCoreInvocation(function_expression, arguments,
627 True, webcore_function_name, arguments, idl_return_type=operation.type, 618 operation.type, operation.ext_attrs, operation.raises)
628 raises_dart_exceptions=raises_dart_exceptions, 619 self._GenerateNativeCallback(cpp_callback_name,
629 raises_dom_exceptions=operation.raises) 620 parameter_definitions=parameter_definitions_emitter.Fragments(),
621 needs_receiver=True, invocation=invocation,
622 raises_exceptions=raises_dart_exceptions)
630 623
631 def _GenerateNativeCallback(self, callback_name, idl_node, 624 def _GenerateNativeCallback(self, callback_name, parameter_definitions,
632 parameter_definitions, needs_receiver, function_name, arguments, idl_retur n_type, 625 needs_receiver, invocation, raises_exceptions):
633 raises_dart_exceptions, raises_dom_exceptions):
634 if raises_dom_exceptions:
635 arguments.append('ec')
636 prefix = ''
637 if needs_receiver: prefix = self._interface_type_info.receiver()
638 callback = '%s%s(%s)' % (prefix, function_name, ', '.join(arguments))
639 626
640 nested_templates = [] 627 if needs_receiver:
641 if idl_return_type and idl_return_type.id != 'void': 628 parameter_definitions = emitter.Format(
642 return_type_info = GetIDLTypeInfo(idl_return_type) 629 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WE BCORE_CLASS_NAME >(args);\n'
643 conversion_cast = return_type_info.conversion_cast('$BODY') 630 ' $PARAMETER_DEFINITIONS\n',
644 if isinstance(return_type_info, SVGTearOffIDLTypeInfo): 631 WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
645 svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix', 632 PARAMETER_DEFINITIONS=parameter_definitions)
646 'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
647 conversion_cast = '%s::create($BODY)'
648 if self._interface.id.startswith('SVGAnimated'):
649 conversion_cast = 'static_cast<%s*>($BODY)'
650 elif return_type_info.idl_type() == 'SVGStringList':
651 conversion_cast = '%s::create(receiver, $BODY)'
652 elif self._interface.id.endswith('List'):
653 conversion_cast = 'static_cast<%s*>($BODY.get())'
654 elif return_type_info.idl_type() in svg_primitive_types:
655 conversion_cast = '%s::create($BODY)'
656 else:
657 conversion_cast = 'static_cast<%s*>($BODY)'
658 conversion_cast = conversion_cast % return_type_info.native_type()
659 nested_templates.append(conversion_cast)
660 633
661 if return_type_info.conversion_include(): 634 body = emitter.Format(
662 self._cpp_impl_includes[return_type_info.conversion_include()] = 1
663 if (return_type_info.idl_type() in ['DOMString', 'AtomicString'] and
664 'TreatReturnedNullStringAs' in idl_node.ext_attrs):
665 nested_templates.append('$BODY, ConvertDefaultToNull')
666 nested_templates.append(
667 ' Dart_Handle returnValue = toDartValue($BODY);\n'
668 ' if (returnValue)\n'
669 ' Dart_SetReturnValue(args, returnValue);\n')
670 else:
671 nested_templates.append(' $BODY;\n')
672
673 if raises_dom_exceptions:
674 nested_templates.append(
675 ' ExceptionCode ec = 0;\n'
676 '$BODY'
677 ' if (UNLIKELY(ec)) {\n'
678 ' exception = DartDOMWrapper::exceptionCodeToDartException( ec);\n'
679 ' goto fail;\n'
680 ' }\n')
681
682 nested_templates.append(
683 ' {\n' 635 ' {\n'
684 '$PARAMETER_DEFINITIONS' 636 '$PARAMETER_DEFINITIONS'
685 '$BODY' 637 '$INVOCATION'
686 ' return;\n' 638 ' return;\n'
687 ' }\n') 639 ' }\n',
640 PARAMETER_DEFINITIONS=parameter_definitions,
641 INVOCATION=invocation)
688 642
689 if raises_dart_exceptions: 643 if raises_exceptions:
690 nested_templates.append( 644 body = emitter.Format(
691 ' Dart_Handle exception;\n' 645 ' Dart_Handle exception;\n'
692 '$BODY' 646 '$BODY'
693 '\n' 647 '\n'
694 'fail:\n' 648 'fail:\n'
695 ' Dart_ThrowException(exception);\n' 649 ' Dart_ThrowException(exception);\n'
696 ' ASSERT_NOT_REACHED();\n') 650 ' ASSERT_NOT_REACHED();\n',
651 BODY=body)
697 652
698 nested_templates.append( 653 self._cpp_definitions_emitter.Emit(
699 '\n' 654 '\n'
700 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n' 655 'static void $CALLBACK_NAME(Dart_NativeArguments args)\n'
701 '{\n' 656 '{\n'
702 ' DartApiScope dartApiScope;\n' 657 ' DartApiScope dartApiScope;\n'
703 '$BODY' 658 '$BODY'
704 '}\n') 659 '}\n',
705 660 CALLBACK_NAME=callback_name,
706 template_parameters = { 661 BODY=body)
707 'CALLBACK_NAME': callback_name,
708 'WEBCORE_CLASS_NAME': self._interface_type_info.native_type(),
709 'PARAMETER_DEFINITIONS': parameter_definitions,
710 }
711 if needs_receiver:
712 template_parameters['PARAMETER_DEFINITIONS'] = emitter.Format(
713 ' $WEBCORE_CLASS_NAME* receiver = DartDOMWrapper::receiver< $WE BCORE_CLASS_NAME >(args);\n'
714 ' $PARAMETER_DEFINITIONS\n',
715 **template_parameters)
716
717 for template in nested_templates:
718 template_parameters['BODY'] = callback
719 callback = emitter.Format(template, **template_parameters)
720
721 self._cpp_definitions_emitter.Emit(callback)
722 662
723 def _GenerateParameterAdapter(self, emitter, idl_argument, index): 663 def _GenerateParameterAdapter(self, emitter, idl_argument, index):
724 type_info = GetIDLTypeInfo(idl_argument.type) 664 type_info = GetIDLTypeInfo(idl_argument.type)
725 (adapter_type, include_name) = type_info.parameter_adapter_info() 665 (adapter_type, include_name) = type_info.parameter_adapter_info()
726 if include_name: 666 if include_name:
727 self._cpp_impl_includes[include_name] = 1 667 self._cpp_impl_includes[include_name] = 1
728 flags = '' 668 flags = ''
729 if idl_argument.ext_attrs.get('Optionial') == 'DefaultIsNullString': 669 if idl_argument.ext_attrs.get('Optionial') == 'DefaultIsNullString':
730 flags = ', DartUtilities::ConvertNullToEmptyString' 670 flags = ', DartUtilities::ConvertNullToEmptyString'
731 emitter.Emit( 671 emitter.Emit(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 namespace = 'HTMLNames' 709 namespace = 'HTMLNames'
770 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload', 710 svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload',
771 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 711 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover',
772 'onmouseup', 'onresize', 'onscroll', 'onunload'] 712 'onmouseup', 'onresize', 'onscroll', 'onunload']
773 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions: 713 if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions:
774 namespace = 'SVGNames' 714 namespace = 'SVGNames'
775 self._cpp_impl_includes[namespace] = 1 715 self._cpp_impl_includes[namespace] = 1
776 716
777 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower() 717 attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower()
778 return 'WebCore::%s::%sAttr' % (namespace, attribute_name) 718 return 'WebCore::%s::%sAttr' % (namespace, attribute_name)
719
720 def _GenerateWebCoreFunctionExpression(self, function_name, idl_node):
721 if 'ImplementedBy' in idl_node.ext_attrs:
722 return '%s::%s' % (idl_node.ext_attrs['ImplementedBy'], function_name)
723 return '%s%s' % (self._interface_type_info.receiver(), function_name)
724
725 def _GenerateWebCoreInvocation(self, function_expression, arguments,
726 idl_return_type, attributes, raises_dom_exceptions):
727 invocation_template = ' $FUNCTION_CALL;\n'
728 if idl_return_type and idl_return_type.id != 'void':
729 return_type_info = GetIDLTypeInfo(idl_return_type)
730 if return_type_info.conversion_include():
731 self._cpp_impl_includes[return_type_info.conversion_include()] = 1
732
733 # Generate C++ cast based on idl return type.
734 conversion_cast = return_type_info.conversion_cast('$FUNCTION_CALL')
735 if isinstance(return_type_info, SVGTearOffIDLTypeInfo):
736 svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix',
737 'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
738 conversion_cast = '%s::create($FUNCTION_CALL)'
739 if self._interface.id.startswith('SVGAnimated'):
740 conversion_cast = 'static_cast<%s*>($FUNCTION_CALL)'
741 elif return_type_info.idl_type() == 'SVGStringList':
742 conversion_cast = '%s::create(receiver, $FUNCTION_CALL)'
743 elif self._interface.id.endswith('List'):
744 conversion_cast = 'static_cast<%s*>($FUNCTION_CALL.get())'
745 elif return_type_info.idl_type() in svg_primitive_types:
746 conversion_cast = '%s::create($FUNCTION_CALL)'
747 else:
748 conversion_cast = 'static_cast<%s*>($FUNCTION_CALL)'
749 conversion_cast = conversion_cast % return_type_info.native_type()
750
751 # Generate to Dart conversion of C++ value.
752 conversion_arguments = [conversion_cast]
753 if (return_type_info.idl_type() in ['DOMString', 'AtomicString'] and
754 'TreatReturnedNullStringAs' in attributes):
755 conversion_arguments.append('ConvertDefaultToNull')
756
757 invocation_template = emitter.Format(
758 ' Dart_Handle returnValue = toDartValue($ARGUMENTS);\n'
759 ' if (returnValue)\n'
760 ' Dart_SetReturnValue(args, returnValue);\n',
761 ARGUMENTS=', '.join(conversion_arguments))
762
763 if raises_dom_exceptions:
764 # Add 'ec' argument to WebCore invocation and convert DOM exception to Dar t exception.
765 arguments.append('ec')
766 invocation_template = emitter.Format(
767 ' ExceptionCode ec = 0;\n'
768 '$INVOCATION'
769 ' if (UNLIKELY(ec)) {\n'
770 ' exception = DartDOMWrapper::exceptionCodeToDartException( ec);\n'
771 ' goto fail;\n'
772 ' }\n',
773 INVOCATION=invocation_template)
774
775 if 'ImplementedBy' in attributes:
776 arguments.insert(0, 'receiver')
777 self._cpp_impl_includes[attributes['ImplementedBy']] = 1
778
779 return emitter.Format(invocation_template,
780 FUNCTION_CALL='%s(%s)' % (function_expression, ', '.join(arguments)))
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698