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

Side by Side Diff: third_party/WebKit/Source/bindings/scripts/v8_types.py

Issue 2709983004: WIP bindings: Add support for the record<K,V> WebIDL type. (Closed)
Patch Set: Rebased patch using NativeValueTraits for IDL types Created 3 years, 9 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
OLDNEW
1 # Copyright (C) 2013 Google Inc. All rights reserved. 1 # Copyright (C) 2013 Google Inc. All rights reserved.
2 # 2 #
3 # Redistribution and use in source and binary forms, with or without 3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are 4 # modification, are permitted provided that the following conditions are
5 # met: 5 # met:
6 # 6 #
7 # * Redistributions of source code must retain the above copyright 7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer. 8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above 9 # * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer 10 # copyright notice, this list of conditions and the following disclaimer
(...skipping 23 matching lines...) Expand all
34 class methods. 34 class methods.
35 35
36 Spec: 36 Spec:
37 http://www.w3.org/TR/WebIDL/#es-type-mapping 37 http://www.w3.org/TR/WebIDL/#es-type-mapping
38 38
39 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler 39 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler
40 """ 40 """
41 41
42 import posixpath 42 import posixpath
43 43
44 from idl_types import IdlTypeBase, IdlType, IdlUnionType, IdlArrayOrSequenceType , IdlNullableType 44 from idl_types import IdlArrayOrSequenceType
45 from idl_types import IdlNullableType
46 from idl_types import IdlRecordType
47 from idl_types import IdlType
48 from idl_types import IdlTypeBase
49 from idl_types import IdlUnionType
45 import v8_attributes # for IdlType.constructor_type_name 50 import v8_attributes # for IdlType.constructor_type_name
46 from v8_globals import includes 51 from v8_globals import includes
47 from v8_utilities import extended_attribute_value_contains 52 from v8_utilities import extended_attribute_value_contains
48 53
49 54
50 ################################################################################ 55 ################################################################################
51 # V8-specific handling of IDL types 56 # V8-specific handling of IDL types
52 ################################################################################ 57 ################################################################################
53 58
54 NON_WRAPPER_TYPES = frozenset([ 59 NON_WRAPPER_TYPES = frozenset([
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 IdlType 141 IdlType
137 raw_type: 142 raw_type:
138 bool, True if idl_type's raw/primitive C++ type should be returned. 143 bool, True if idl_type's raw/primitive C++ type should be returned.
139 used_as_rvalue_type: 144 used_as_rvalue_type:
140 bool, True if the C++ type is used as an argument or the return 145 bool, True if the C++ type is used as an argument or the return
141 type of a method. 146 type of a method.
142 used_as_variadic_argument: 147 used_as_variadic_argument:
143 bool, True if the C++ type is used as a variadic argument of a metho d. 148 bool, True if the C++ type is used as a variadic argument of a metho d.
144 used_in_cpp_sequence: 149 used_in_cpp_sequence:
145 bool, True if the C++ type is used as an element of a container. 150 bool, True if the C++ type is used as an element of a container.
146 Containers can be an array, a sequence or a dictionary. 151 Containers can be an array, a sequence, a dictionary or a record.
147 """ 152 """
148 def string_mode(): 153 def string_mode():
149 if idl_type.is_nullable: 154 if idl_type.is_nullable:
150 return 'TreatNullAndUndefinedAsNullString' 155 return 'TreatNullAndUndefinedAsNullString'
151 if extended_attributes.get('TreatNullAs') == 'EmptyString': 156 if extended_attributes.get('TreatNullAs') == 'EmptyString':
152 return 'TreatNullAsEmptyString' 157 return 'TreatNullAsEmptyString'
153 if extended_attributes.get('TreatNullAs') == 'NullString': 158 if extended_attributes.get('TreatNullAs') == 'NullString':
154 return 'TreatNullAsNullString' 159 return 'TreatNullAsNullString'
155 return '' 160 return ''
156 161
157 extended_attributes = extended_attributes or {} 162 extended_attributes = extended_attributes or {}
158 idl_type = idl_type.preprocessed_type 163 idl_type = idl_type.preprocessed_type
159 164
160 # Array or sequence types 165 # Array or sequence types
161 if used_as_variadic_argument: 166 if used_as_variadic_argument:
162 native_array_element_type = idl_type 167 native_array_element_type = idl_type
163 else: 168 else:
164 native_array_element_type = idl_type.native_array_element_type 169 native_array_element_type = idl_type.native_array_element_type
165 if native_array_element_type: 170 if native_array_element_type:
166 vector_type = cpp_ptr_type('Vector', 'HeapVector', native_array_element_ type.is_gc_type) 171 vector_type = cpp_ptr_type('Vector', 'HeapVector', native_array_element_ type.is_gc_type)
167 vector_template_type = cpp_template_type(vector_type, native_array_eleme nt_type.cpp_type_args(used_in_cpp_sequence=True)) 172 vector_template_type = cpp_template_type(vector_type, native_array_eleme nt_type.cpp_type_args(used_in_cpp_sequence=True))
168 if used_as_rvalue_type: 173 if used_as_rvalue_type:
169 return 'const %s&' % vector_template_type 174 return 'const %s&' % vector_template_type
170 return vector_template_type 175 return vector_template_type
171 176
177 # Record types.
178 if idl_type.is_record_type:
179 vector_type = cpp_ptr_type('Vector', 'HeapVector', idl_type.value_type.i s_gc_type)
180 value_type = idl_type.value_type.cpp_type_args(used_in_cpp_sequence=True )
181 vector_template_type = cpp_template_type(vector_type,
182 'std::pair<String, %s>' % value _type)
183 if used_as_rvalue_type:
184 return 'const %s&' % vector_template_type
185 return vector_template_type
186
172 # Simple types 187 # Simple types
173 base_idl_type = idl_type.base_type 188 base_idl_type = idl_type.base_type
174 189
175 if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE: 190 if base_idl_type in CPP_TYPE_SAME_AS_IDL_TYPE:
176 return base_idl_type 191 return base_idl_type
177 if base_idl_type in CPP_INT_TYPES: 192 if base_idl_type in CPP_INT_TYPES:
178 return 'int' 193 return 'int'
179 if base_idl_type in CPP_UNSIGNED_TYPES: 194 if base_idl_type in CPP_UNSIGNED_TYPES:
180 return 'unsigned' 195 return 'unsigned'
181 if base_idl_type in CPP_SPECIAL_CONVERSION_RULES: 196 if base_idl_type in CPP_SPECIAL_CONVERSION_RULES:
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 IdlTypeBase.is_gc_type = property(is_gc_type) 330 IdlTypeBase.is_gc_type = property(is_gc_type)
316 331
317 332
318 def is_traceable(idl_type): 333 def is_traceable(idl_type):
319 return (idl_type.is_garbage_collected or idl_type.is_dictionary) 334 return (idl_type.is_garbage_collected or idl_type.is_dictionary)
320 335
321 IdlTypeBase.is_traceable = property(is_traceable) 336 IdlTypeBase.is_traceable = property(is_traceable)
322 IdlUnionType.is_traceable = property(lambda self: True) 337 IdlUnionType.is_traceable = property(lambda self: True)
323 IdlArrayOrSequenceType.is_traceable = property( 338 IdlArrayOrSequenceType.is_traceable = property(
324 lambda self: self.element_type.is_traceable) 339 lambda self: self.element_type.is_traceable)
340 IdlRecordType.is_traceable = property(
341 lambda self: self.value_type.is_traceable)
325 342
326 343
327 ################################################################################ 344 ################################################################################
328 # Includes 345 # Includes
329 ################################################################################ 346 ################################################################################
330 347
331 def includes_for_cpp_class(class_name, relative_dir_posix): 348 def includes_for_cpp_class(class_name, relative_dir_posix):
332 return set([posixpath.join('bindings', relative_dir_posix, class_name + '.h' )]) 349 return set([posixpath.join('bindings', relative_dir_posix, class_name + '.h' )])
333 350
334 351
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 421
405 IdlUnionType.includes_for_type = includes_for_union_type 422 IdlUnionType.includes_for_type = includes_for_union_type
406 423
407 424
408 def includes_for_array_or_sequence_type(idl_type, extended_attributes=None): 425 def includes_for_array_or_sequence_type(idl_type, extended_attributes=None):
409 return idl_type.element_type.includes_for_type(extended_attributes) 426 return idl_type.element_type.includes_for_type(extended_attributes)
410 427
411 IdlArrayOrSequenceType.includes_for_type = includes_for_array_or_sequence_type 428 IdlArrayOrSequenceType.includes_for_type = includes_for_array_or_sequence_type
412 429
413 430
431 def includes_for_record_type(idl_type, extended_attributes=None):
432 return set.union(set(['bindings/core/v8/IDLTypes.h']),
433 idl_type.key_type.includes_for_type(extended_attributes),
434 idl_type.value_type.includes_for_type(extended_attributes))
435
436 IdlRecordType.includes_for_type = includes_for_record_type
437
438
414 def add_includes_for_type(idl_type, extended_attributes=None): 439 def add_includes_for_type(idl_type, extended_attributes=None):
415 includes.update(idl_type.includes_for_type(extended_attributes)) 440 includes.update(idl_type.includes_for_type(extended_attributes))
416 441
417 IdlTypeBase.add_includes_for_type = add_includes_for_type 442 IdlTypeBase.add_includes_for_type = add_includes_for_type
418 443
419 444
420 def includes_for_interface(interface_name): 445 def includes_for_interface(interface_name):
421 return IdlType(interface_name).includes_for_type() 446 return IdlType(interface_name).includes_for_type()
422 447
423 448
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 540
516 541
517 def v8_conversion_needs_exception_state(idl_type): 542 def v8_conversion_needs_exception_state(idl_type):
518 return (idl_type.is_numeric_type or 543 return (idl_type.is_numeric_type or
519 idl_type.is_enum or 544 idl_type.is_enum or
520 idl_type.is_dictionary or 545 idl_type.is_dictionary or
521 idl_type.name in ('Boolean', 'ByteString', 'Date', 'Dictionary', 'US VString', 'SerializedScriptValue')) 546 idl_type.name in ('Boolean', 'ByteString', 'Date', 'Dictionary', 'US VString', 'SerializedScriptValue'))
522 547
523 IdlType.v8_conversion_needs_exception_state = property(v8_conversion_needs_excep tion_state) 548 IdlType.v8_conversion_needs_exception_state = property(v8_conversion_needs_excep tion_state)
524 IdlArrayOrSequenceType.v8_conversion_needs_exception_state = True 549 IdlArrayOrSequenceType.v8_conversion_needs_exception_state = True
550 IdlRecordType.v8_conversion_needs_exception_state = True
525 IdlUnionType.v8_conversion_needs_exception_state = True 551 IdlUnionType.v8_conversion_needs_exception_state = True
526 552
527 553
528 TRIVIAL_CONVERSIONS = frozenset([ 554 TRIVIAL_CONVERSIONS = frozenset([
529 'any', 555 'any',
530 'boolean', 556 'boolean',
531 'Date', 557 'Date',
532 'Dictionary', 558 'Dictionary',
533 'NodeFilter', 559 'NodeFilter',
534 'XPathNSResolver', 560 'XPathNSResolver',
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 elif idl_type.v8_conversion_needs_exception_state: 599 elif idl_type.v8_conversion_needs_exception_state:
574 arguments = ', '.join([v8_value, 'exceptionState']) 600 arguments = ', '.join([v8_value, 'exceptionState'])
575 else: 601 else:
576 arguments = v8_value 602 arguments = v8_value
577 if base_idl_type in V8_VALUE_TO_CPP_VALUE: 603 if base_idl_type in V8_VALUE_TO_CPP_VALUE:
578 cpp_expression_format = V8_VALUE_TO_CPP_VALUE[base_idl_type] 604 cpp_expression_format = V8_VALUE_TO_CPP_VALUE[base_idl_type]
579 elif idl_type.is_array_buffer_or_view: 605 elif idl_type.is_array_buffer_or_view:
580 cpp_expression_format = ( 606 cpp_expression_format = (
581 '{v8_value}->Is{idl_type}() ? ' 607 '{v8_value}->Is{idl_type}() ? '
582 'V8{idl_type}::toImpl(v8::Local<v8::{idl_type}>::Cast({v8_value})) : 0') 608 'V8{idl_type}::toImpl(v8::Local<v8::{idl_type}>::Cast({v8_value})) : 0')
609 elif idl_type.is_record_type:
610 # This function is not record-specific, but for now we are using
611 # NativeValueTraits<> and the idl:: types only with this IDL type.
612 def idl_type_name(idl_type):
613 idl_type = idl_type.preprocessed_type
614 if idl_type.native_array_element_type:
615 return 'idl::Sequence<%s>' % idl_type_name(idl_type.native_array _element_type)
616 elif idl_type.is_record_type:
617 return 'idl::Record<%s, %s>' % (idl_type_name(idl_type.key_type) ,
618 idl_type_name(idl_type.value_typ e))
619 elif idl_type.is_union_type:
620 return idl_type.as_union_type.name
621 elif idl_type.is_basic_type or idl_type.name == 'Promise':
622 return 'idl::%s' % idl_type.name
623 elif idl_type.implemented_as is not None:
624 return idl_type.implemented_as
625 return idl_type.name
626
627 if idl_type.is_nullable:
628 type_name = idl_type.inner_type.name
629 else:
630 type_name = idl_type.name
631
632 k = idl_type_name(idl_type.key_type)
633 v = idl_type_name(idl_type.value_type)
634
635 cpp_expression_format = (
636 'NativeValueTraits<idl::Record<%s, %s>>::nativeValue({isolate}, {v8_ value}, exceptionState)' % (k, v))
583 elif idl_type.is_union_type: 637 elif idl_type.is_union_type:
584 nullable = 'UnionTypeConversionMode::Nullable' if idl_type.includes_null able_type else 'UnionTypeConversionMode::NotNullable' 638 nullable = 'UnionTypeConversionMode::Nullable' if idl_type.includes_null able_type else 'UnionTypeConversionMode::NotNullable'
585 cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {va riable_name}, %s, exceptionState)' % nullable 639 cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {va riable_name}, %s, exceptionState)' % nullable
586 elif idl_type.use_output_parameter_for_result: 640 elif idl_type.use_output_parameter_for_result:
587 cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {va riable_name}, exceptionState)' 641 cpp_expression_format = 'V8{idl_type}::toImpl({isolate}, {v8_value}, {va riable_name}, exceptionState)'
588 elif idl_type.is_callback_function: 642 elif idl_type.is_callback_function:
589 cpp_expression_format = ( 643 cpp_expression_format = (
590 '{idl_type}::create(ScriptState::current({isolate}), {v8_value})') 644 '{idl_type}::create(ScriptState::current({isolate}), {v8_value})')
591 else: 645 else:
592 cpp_expression_format = ( 646 cpp_expression_format = (
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 return 'NullableDictionary' 806 return 'NullableDictionary'
753 807
754 if idl_type.is_dictionary or idl_type.is_union_type: 808 if idl_type.is_dictionary or idl_type.is_union_type:
755 return 'DictionaryOrUnion' 809 return 'DictionaryOrUnion'
756 810
757 # Array or sequence types 811 # Array or sequence types
758 native_array_element_type = idl_type.native_array_element_type 812 native_array_element_type = idl_type.native_array_element_type
759 if native_array_element_type: 813 if native_array_element_type:
760 return 'FrozenArray' if idl_type.is_frozen_array else 'array' 814 return 'FrozenArray' if idl_type.is_frozen_array else 'array'
761 815
816 # Record types.
817 if idl_type.is_record_type:
818 return 'Record'
819
762 # Simple types 820 # Simple types
763 base_idl_type = idl_type.base_type 821 base_idl_type = idl_type.base_type
764 # Basic types, without additional includes 822 # Basic types, without additional includes
765 if base_idl_type in CPP_INT_TYPES: 823 if base_idl_type in CPP_INT_TYPES:
766 return 'int' 824 return 'int'
767 if base_idl_type in CPP_UNSIGNED_TYPES: 825 if base_idl_type in CPP_UNSIGNED_TYPES:
768 return 'unsigned' 826 return 'unsigned'
769 if idl_type.is_string_type: 827 if idl_type.is_string_type:
770 if idl_type.is_nullable: 828 if idl_type.is_nullable:
771 return 'StringOrNull' 829 return 'StringOrNull'
(...skipping 29 matching lines...) Expand all
801 'double': 'v8SetReturnValue(info, {cpp_value})', 859 'double': 'v8SetReturnValue(info, {cpp_value})',
802 'unrestricted double': 'v8SetReturnValue(info, {cpp_value})', 860 'unrestricted double': 'v8SetReturnValue(info, {cpp_value})',
803 # No special v8SetReturnValue* function, but instead convert value to V8 861 # No special v8SetReturnValue* function, but instead convert value to V8
804 # and then use general v8SetReturnValue. 862 # and then use general v8SetReturnValue.
805 'array': 'v8SetReturnValue(info, {cpp_value})', 863 'array': 'v8SetReturnValue(info, {cpp_value})',
806 'FrozenArray': 'v8SetReturnValue(info, {cpp_value})', 864 'FrozenArray': 'v8SetReturnValue(info, {cpp_value})',
807 'Date': 'v8SetReturnValue(info, {cpp_value})', 865 'Date': 'v8SetReturnValue(info, {cpp_value})',
808 'EventHandler': 'v8SetReturnValue(info, {cpp_value})', 866 'EventHandler': 'v8SetReturnValue(info, {cpp_value})',
809 'ScriptValue': 'v8SetReturnValue(info, {cpp_value})', 867 'ScriptValue': 'v8SetReturnValue(info, {cpp_value})',
810 'SerializedScriptValue': 'v8SetReturnValue(info, {cpp_value})', 868 'SerializedScriptValue': 'v8SetReturnValue(info, {cpp_value})',
869 # Records.
870 'Record': 'v8SetReturnValue(info, ToV8({cpp_value}, info.Holder(), info.GetI solate()))',
811 # DOMWrapper 871 # DOMWrapper
812 'DOMWrapperForMainWorld': 'v8SetReturnValueForMainWorld(info, {cpp_value})', 872 'DOMWrapperForMainWorld': 'v8SetReturnValueForMainWorld(info, {cpp_value})',
813 'DOMWrapperFast': 'v8SetReturnValueFast(info, {cpp_value}, {script_wrappable })', 873 'DOMWrapperFast': 'v8SetReturnValueFast(info, {cpp_value}, {script_wrappable })',
814 'DOMWrapperDefault': 'v8SetReturnValue(info, {cpp_value})', 874 'DOMWrapperDefault': 'v8SetReturnValue(info, {cpp_value})',
815 # If [CheckSecurity=ReturnValue] is specified, the returned object must be 875 # If [CheckSecurity=ReturnValue] is specified, the returned object must be
816 # wrapped in its own realm, which can be different from the realm of the 876 # wrapped in its own realm, which can be different from the realm of the
817 # receiver object. 877 # receiver object.
818 # 878 #
819 # [CheckSecurity=ReturnValue] is used only for contentDocument and 879 # [CheckSecurity=ReturnValue] is used only for contentDocument and
820 # getSVGDocument attributes of HTML{IFrame,Frame,Object,Embed}Element, 880 # getSVGDocument attributes of HTML{IFrame,Frame,Object,Embed}Element,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 'unrestricted double': 'v8::Number::New({isolate}, {cpp_value})', 955 'unrestricted double': 'v8::Number::New({isolate}, {cpp_value})',
896 'void': 'v8Undefined()', 956 'void': 'v8Undefined()',
897 'StringOrNull': '{cpp_value}.isNull() ? v8::Local<v8::Value>(v8::Null({isola te})) : v8String({isolate}, {cpp_value})', 957 'StringOrNull': '{cpp_value}.isNull() ? v8::Local<v8::Value>(v8::Null({isola te})) : v8String({isolate}, {cpp_value})',
898 # Special cases 958 # Special cases
899 'Dictionary': '{cpp_value}.v8Value()', 959 'Dictionary': '{cpp_value}.v8Value()',
900 'EventHandler': ( 960 'EventHandler': (
901 '{cpp_value} ? ' + 961 '{cpp_value} ? ' +
902 'V8AbstractEventListener::cast({cpp_value})->getListenerOrNull(' + 962 'V8AbstractEventListener::cast({cpp_value})->getListenerOrNull(' +
903 '{isolate}, impl->getExecutionContext()) : ' + 963 '{isolate}, impl->getExecutionContext()) : ' +
904 'v8::Null({isolate}).As<v8::Value>()'), 964 'v8::Null({isolate}).As<v8::Value>()'),
965 'Record': 'ToV8({cpp_value}, {creation_context}, {isolate})',
905 'ScriptValue': '{cpp_value}.v8Value()', 966 'ScriptValue': '{cpp_value}.v8Value()',
906 'SerializedScriptValue': 'v8Deserialize({isolate}, {cpp_value})', 967 'SerializedScriptValue': 'v8Deserialize({isolate}, {cpp_value})',
907 # General 968 # General
908 'array': 'ToV8({cpp_value}, {creation_context}, {isolate})', 969 'array': 'ToV8({cpp_value}, {creation_context}, {isolate})',
909 'FrozenArray': 'freezeV8Object(ToV8({cpp_value}, {creation_context}, {isolat e}), {isolate})', 970 'FrozenArray': 'freezeV8Object(ToV8({cpp_value}, {creation_context}, {isolat e}), {isolate})',
910 'DOMWrapper': 'ToV8({cpp_value}, {creation_context}, {isolate})', 971 'DOMWrapper': 'ToV8({cpp_value}, {creation_context}, {isolate})',
911 # Passing nullable dictionaries isn't a pattern currently used 972 # Passing nullable dictionaries isn't a pattern currently used
912 # anywhere in the web platform, and more work would be needed in 973 # anywhere in the web platform, and more work would be needed in
913 # the code generator to distinguish between passing null, and 974 # the code generator to distinguish between passing null, and
914 # passing an object which happened to not contain any of the 975 # passing an object which happened to not contain any of the
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 number_of_nullable_member_types_union) 1089 number_of_nullable_member_types_union)
1029 1090
1030 1091
1031 def includes_nullable_type_union(idl_type): 1092 def includes_nullable_type_union(idl_type):
1032 # http://heycam.github.io/webidl/#dfn-includes-a-nullable-type 1093 # http://heycam.github.io/webidl/#dfn-includes-a-nullable-type
1033 return idl_type.number_of_nullable_member_types == 1 1094 return idl_type.number_of_nullable_member_types == 1
1034 1095
1035 IdlTypeBase.includes_nullable_type = False 1096 IdlTypeBase.includes_nullable_type = False
1036 IdlNullableType.includes_nullable_type = True 1097 IdlNullableType.includes_nullable_type = True
1037 IdlUnionType.includes_nullable_type = property(includes_nullable_type_union) 1098 IdlUnionType.includes_nullable_type = property(includes_nullable_type_union)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698