def overload_check_argument(index, argument): cpp_value = 'info[%s]' % index idl_type = argument['idl_type'] # FIXME: proper type checking, sharing code with attributes and methods if idl_type == 'DOMString' and argument['is_strict_type_checking']: return ' || '.join(['isUndefinedOrNull(%s)' % cpp_value, '%s->IsString()' % cpp_value, '%s->IsObject()' % cpp_value]) if v8_types.array_or_sequence_type(idl_type): return '%s->IsArray()' % cpp_value if v8_types.is_callback_interface(idl_type): return ' || '.join(['%s->IsNull()' % cpp_value, '%s->IsFunction()' % cpp_value]) if v8_types.is_wrapper_type(idl_type): type_check = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate())'.format(idl_type=idl_type, cpp_value=cpp_value) if argument['is_nullable']: type_check = ' || '.join(['%s->IsNull()' % cpp_value, type_check]) return type_check if v8_types.is_interface_type(idl_type): # Non-wrapper types are just objects: we don't distinguish type type_check = '%s->IsObject()' % cpp_value if argument['is_nullable']: type_check = ' || '.join(['%s->IsNull()' % cpp_value, type_check]) return type_check return None
def generate_argument(method, argument, index): extended_attributes = argument.extended_attributes idl_type = argument.idl_type return { 'cpp_method': cpp_method(method, index), 'cpp_type': v8_types.cpp_type(idl_type), 'enum_validation_expression': v8_utilities.enum_validation_expression(idl_type), 'has_default': 'Default' in extended_attributes, 'idl_type': argument.idl_type, 'index': index, 'is_clamp': 'Clamp' in extended_attributes, 'is_optional': argument.is_optional, 'is_variadic_wrapper_type': argument.is_variadic and v8_types.is_wrapper_type(idl_type), 'name': argument.name, 'v8_value_to_local_cpp_value': v8_value_to_local_cpp_value(argument, index), }
def argument_template(argument): idl_type = argument.idl_type if (v8_types.is_wrapper_type(idl_type) and not v8_types.is_typed_array_type(idl_type) and # Compatibility: all other browsers accepts a callable for # XPathNSResolver, despite it being against spec. not idl_type == 'XPathNSResolver'): return 'V8PerIsolateData::from(isolate)->rawDOMTemplate(&V8{idl_type}::wrapperTypeInfo, currentWorldType)'.format(idl_type=idl_type) return 'v8::Handle<v8::FunctionTemplate>()'
def argument_template(argument): idl_type = argument.idl_type if (v8_types.is_wrapper_type(idl_type) and not v8_types.is_typed_array_type(idl_type) and # Compatibility: all other browsers accepts a callable for # XPathNSResolver, despite it being against spec. not idl_type == 'XPathNSResolver'): return 'V8PerIsolateData::from(isolate)->rawDOMTemplate(&V8{idl_type}::wrapperTypeInfo, currentWorldType)'.format( idl_type=idl_type) return 'v8::Handle<v8::FunctionTemplate>()'
def generate_argument(interface, method, argument, index): extended_attributes = argument.extended_attributes idl_type = argument.idl_type this_cpp_value = cpp_value(interface, method, index) return { 'cpp_type': v8_types.cpp_type(idl_type), 'cpp_value': this_cpp_value, 'enum_validation_expression': v8_utilities.enum_validation_expression(idl_type), 'has_default': 'Default' in extended_attributes, 'idl_type': idl_type, 'index': index, 'is_clamp': 'Clamp' in extended_attributes, 'is_callback_interface': v8_types.is_callback_interface(idl_type), 'is_nullable': argument.is_nullable, 'is_optional': argument.is_optional, 'is_strict_type_checking': 'StrictTypeChecking' in extended_attributes, 'is_variadic_wrapper_type': argument.is_variadic and v8_types.is_wrapper_type(idl_type), 'is_wrapper_type': v8_types.is_wrapper_type(idl_type), 'name': argument.name, 'v8_set_return_value_for_main_world': v8_set_return_value(interface.name, method, this_cpp_value, for_main_world=True), 'v8_set_return_value': v8_set_return_value(interface.name, method, this_cpp_value), 'v8_value_to_local_cpp_value': v8_value_to_local_cpp_value(argument, index), }
def generate_argument(interface, method, argument, index): extended_attributes = argument.extended_attributes idl_type = argument.idl_type this_cpp_value = cpp_value(interface, method, index) return { 'cpp_type': v8_types.cpp_type(idl_type), 'cpp_value': this_cpp_value, 'enum_validation_expression': v8_utilities.enum_validation_expression(idl_type), 'has_default': 'Default' in extended_attributes, 'idl_type': idl_type, 'index': index, 'is_clamp': 'Clamp' in extended_attributes, 'is_nullable': argument.is_nullable, 'is_optional': argument.is_optional, 'is_strict_type_checking': 'StrictTypeChecking' in extended_attributes, 'is_variadic_wrapper_type': argument.is_variadic and v8_types.is_wrapper_type(idl_type), 'is_wrapper_type': v8_types.is_wrapper_type(idl_type), 'name': argument.name, 'v8_set_return_value': v8_set_return_value(method, this_cpp_value), 'v8_value_to_local_cpp_value': v8_value_to_local_cpp_value(argument, index), }
def property_setter(setter): idl_type = setter.arguments[1].idl_type extended_attributes = setter.extended_attributes is_raises_exception = 'RaisesException' in extended_attributes return { 'has_strict_type_checking': 'StrictTypeChecking' in extended_attributes and v8_types.is_wrapper_type(idl_type), 'idl_type': idl_type, 'is_custom': 'Custom' in extended_attributes, 'has_exception_state': is_raises_exception or v8_types.is_integer_type(idl_type), 'is_raises_exception': is_raises_exception, 'name': cpp_name(setter), 'v8_value_to_local_cpp_value': v8_types.v8_value_to_local_cpp_value( idl_type, extended_attributes, 'jsValue', 'propertyValue'), }
def overload_check_argument(index, argument): cpp_value = 'info[%s]' % index idl_type = argument['idl_type'] # FIXME: proper type checking, sharing code with attributes and methods if idl_type == 'DOMString' and argument['is_strict_type_checking']: return ' || '.join(['%s->IsNull()' % cpp_value, '%s->IsUndefined()' % cpp_value, '%s->IsString()' % cpp_value, '%s->IsObject()' % cpp_value]) if v8_types.array_or_sequence_type(idl_type): return '%s->IsArray()' % cpp_value if v8_types.is_wrapper_type(idl_type): type_check = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate(), worldType(info.GetIsolate()))'.format(idl_type=idl_type, cpp_value=cpp_value) if argument['is_nullable']: type_check = ' || '.join(['%s->IsNull()' % cpp_value, type_check]) return type_check return None
def custom_signature(arguments): def argument_template(argument): idl_type = argument.idl_type if (v8_types.is_wrapper_type(idl_type) and not v8_types.is_typed_array_type(idl_type) and # Compatibility: all other browsers accepts a callable for # XPathNSResolver, despite it being against spec. not idl_type == 'XPathNSResolver'): return 'V8PerIsolateData::from(isolate)->rawTemplate(&V8{idl_type}::wrapperTypeInfo, currentWorldType)'.format(idl_type=idl_type) return 'v8::Handle<v8::FunctionTemplate>()' if (any(argument.is_optional and 'Default' not in argument.extended_attributes for argument in arguments) or all(not v8_types.is_wrapper_type(argument.idl_type) for argument in arguments)): return None return ', '.join([argument_template(argument) for argument in arguments])
def is_keep_alive_for_gc(attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes return ( # For readonly attributes, for performance reasons we keep the attribute # wrapper alive while the owner wrapper is alive, because the attribute # never changes. (attribute.is_read_only and v8_types.is_wrapper_type(idl_type) and # There are some exceptions, however: not( # Node lifetime is managed by object grouping. v8_types.is_dom_node_type(idl_type) or # A self-reference is unnecessary. attribute.name == 'self' or # FIXME: Remove these hard-coded hacks. idl_type in ['EventHandler', 'Promise', 'Window'] or idl_type.startswith('HTML'))))
def is_keep_alive_for_gc(attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes return ( # For readonly attributes, for performance reasons we keep the attribute # wrapper alive while the owner wrapper is alive, because the attribute # never changes. ( attribute.is_read_only and v8_types.is_wrapper_type(idl_type) and # There are some exceptions, however: not ( # Node lifetime is managed by object grouping. v8_types.is_dom_node_type(idl_type) or # A self-reference is unnecessary. attribute.name == 'self' or # FIXME: Remove these hard-coded hacks. idl_type in ['EventHandler', 'Promise', 'Window'] or idl_type.startswith('HTML'))))
def custom_signature(arguments): def argument_template(argument): idl_type = argument.idl_type if (v8_types.is_wrapper_type(idl_type) and not v8_types.is_typed_array_type(idl_type) and # Compatibility: all other browsers accepts a callable for # XPathNSResolver, despite it being against spec. not idl_type == 'XPathNSResolver'): return 'V8PerIsolateData::from(isolate)->rawTemplate(&V8{idl_type}::wrapperTypeInfo, currentWorldType)'.format( idl_type=idl_type) return 'v8::Handle<v8::FunctionTemplate>()' if (any(argument.is_optional and 'Default' not in argument.extended_attributes for argument in arguments) or all(not v8_types.is_wrapper_type(argument.idl_type) for argument in arguments)): return None return ', '.join([argument_template(argument) for argument in arguments])
def overload_check_argument(index, argument): cpp_value = 'info[%s]' % index idl_type = argument['idl_type'] # FIXME: proper type checking, sharing code with attributes and methods if idl_type == 'DOMString' and argument['is_strict_type_checking']: return ' || '.join([ '%s->IsNull()' % cpp_value, '%s->IsUndefined()' % cpp_value, '%s->IsString()' % cpp_value, '%s->IsObject()' % cpp_value ]) if v8_types.array_or_sequence_type(idl_type): return '%s->IsArray()' % cpp_value if v8_types.is_wrapper_type(idl_type): type_check = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate(), worldType(info.GetIsolate()))'.format( idl_type=idl_type, cpp_value=cpp_value) if argument['is_nullable']: type_check = ' || '.join(['%s->IsNull()' % cpp_value, type_check]) return type_check return None
def overload_check_argument(index, argument): def null_or_optional_check(): # If undefined is passed for an optional argument, the argument should # be treated as missing; otherwise undefined is not allowed. if argument['is_nullable']: if argument['is_optional']: return 'isUndefinedOrNull(%s)' return '%s->IsNull()' if argument['is_optional']: return '%s->IsUndefined()' return None cpp_value = 'info[%s]' % index idl_type = argument['idl_type'] # FIXME: proper type checking, sharing code with attributes and methods if idl_type == 'DOMString' and argument['is_strict_type_checking']: return ' || '.join(['isUndefinedOrNull(%s)' % cpp_value, '%s->IsString()' % cpp_value, '%s->IsObject()' % cpp_value]) if v8_types.array_or_sequence_type(idl_type): return '%s->IsArray()' % cpp_value if v8_types.is_callback_interface(idl_type): return ' || '.join(['%s->IsNull()' % cpp_value, '%s->IsFunction()' % cpp_value]) if v8_types.is_wrapper_type(idl_type): type_check = 'V8{idl_type}::hasInstance({cpp_value}, info.GetIsolate())'.format(idl_type=idl_type, cpp_value=cpp_value) if argument['is_nullable']: type_check = ' || '.join(['%s->IsNull()' % cpp_value, type_check]) return type_check if is_interface_type(idl_type): # Non-wrapper types are just objects: we don't distinguish type # We only allow undefined for non-wrapper types (notably Dictionary), # as we need it for optional Dictionary arguments, but we don't want to # change behavior of existing bindings for other types. type_check = '%s->IsObject()' % cpp_value added_check_template = null_or_optional_check() if added_check_template: type_check = ' || '.join([added_check_template % cpp_value, type_check]) return type_check return None
def generate_attribute(interface, attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes v8_types.add_includes_for_type(idl_type) # [CheckSecurity] is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') # [Custom] has_custom_getter = ('Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Getter']) has_custom_setter = (not attribute.is_read_only and 'Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Setter']) # [CustomElementCallbacks], [Reflect] is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes is_reflect = 'Reflect' in extended_attributes if is_custom_element_callbacks or is_reflect: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') # [RaisesException], [RaisesException=Setter] is_setter_raises_exception = ('RaisesException' in extended_attributes and extended_attributes['RaisesException'] in [None, 'Setter']) # [StrictTypeChecking] has_strict_type_checking = ( ('StrictTypeChecking' in extended_attributes or 'StrictTypeChecking' in interface.extended_attributes) and v8_types.is_wrapper_type(idl_type)) if (idl_type == 'EventHandler' and interface.name in ['Window', 'WorkerGlobalScope'] and attribute.name == 'onerror'): includes.add('bindings/v8/V8ErrorHandler.h') contents = { 'access_control_list': access_control_list(attribute), 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_world_list( attribute, 'Getter'), # [ActivityLogging] 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_world_list( attribute, 'Setter'), # [ActivityLogging] 'cached_attribute_validation_method': extended_attributes.get('CachedAttribute'), 'conditional_string': v8_utilities.conditional_string(attribute), 'constructor_type': v8_types.constructor_type(idl_type) if is_constructor_attribute(attribute) else None, 'cpp_name': cpp_name(attribute), 'cpp_type': v8_types.cpp_type(idl_type), 'deprecate_as': v8_utilities.deprecate_as(attribute), # [DeprecateAs] 'enum_validation_expression': v8_utilities.enum_validation_expression(idl_type), 'has_custom_getter': has_custom_getter, 'has_custom_setter': has_custom_setter, 'has_strict_type_checking': has_strict_type_checking, 'idl_type': idl_type, 'is_call_with_execution_context': v8_utilities.has_extended_attribute_value(attribute, 'CallWith', 'ExecutionContext'), 'is_check_security_for_node': is_check_security_for_node, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_expose_js_accessors': 'ExposeJSAccessors' in extended_attributes, 'is_getter_raises_exception': ( # [RaisesException] 'RaisesException' in extended_attributes and extended_attributes['RaisesException'] in [None, 'Getter']), 'is_initialized_by_event_constructor': 'InitializedByEventConstructor' in extended_attributes, 'is_keep_alive_for_gc': is_keep_alive_for_gc(interface, attribute), 'is_nullable': attribute.is_nullable, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_read_only': attribute.is_read_only, 'is_reflect': is_reflect, 'is_replaceable': 'Replaceable' in attribute.extended_attributes, 'is_setter_call_with_execution_context': v8_utilities.has_extended_attribute_value(attribute, 'SetterCallWith', 'ExecutionContext'), 'is_setter_raises_exception': is_setter_raises_exception, 'has_setter_exception_state': (is_setter_raises_exception or has_strict_type_checking or v8_types.is_integer_type(idl_type)), 'is_static': attribute.is_static, 'is_url': 'URL' in extended_attributes, 'is_unforgeable': 'Unforgeable' in extended_attributes, 'measure_as': v8_utilities.measure_as(attribute), # [MeasureAs] 'name': attribute.name, 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name( attribute), # [PerContextEnabled] 'property_attributes': property_attributes(attribute), 'put_forwards': 'PutForwards' in extended_attributes, 'reflect_empty': extended_attributes.get('ReflectEmpty'), 'reflect_invalid': extended_attributes.get('ReflectInvalid', ''), 'reflect_missing': extended_attributes.get('ReflectMissing'), 'reflect_only': extended_attributes['ReflectOnly'].split('|') if 'ReflectOnly' in extended_attributes else None, 'setter_callback': setter_callback_name(interface, attribute), 'v8_type': v8_types.v8_type(idl_type), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name( attribute), # [RuntimeEnabled] 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] } if is_constructor_attribute(attribute): return contents if not has_custom_getter: generate_getter(interface, attribute, contents) if (not has_custom_setter and (not attribute.is_read_only or 'PutForwards' in extended_attributes)): generate_setter(interface, attribute, contents) return contents
def generate_attribute(interface, attribute): idl_type = attribute.idl_type extended_attributes = attribute.extended_attributes v8_types.add_includes_for_type(idl_type) # [CheckSecurity] is_check_security_for_node = 'CheckSecurity' in extended_attributes if is_check_security_for_node: includes.add('bindings/v8/BindingSecurity.h') # [Custom] has_custom_getter = ('Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Getter']) has_custom_setter = (not attribute.is_read_only and 'Custom' in extended_attributes and extended_attributes['Custom'] in [None, 'Setter']) # [CustomElementCallbacks], [Reflect] is_custom_element_callbacks = 'CustomElementCallbacks' in extended_attributes is_reflect = 'Reflect' in extended_attributes if is_custom_element_callbacks or is_reflect: includes.add('core/dom/custom/CustomElementCallbackDispatcher.h') # [RaisesException], [RaisesException=Setter] is_setter_raises_exception = ( 'RaisesException' in extended_attributes and extended_attributes['RaisesException'] in [None, 'Setter']) # [StrictTypeChecking] has_strict_type_checking = ( ('StrictTypeChecking' in extended_attributes or 'StrictTypeChecking' in interface.extended_attributes) and v8_types.is_wrapper_type(idl_type)) if (idl_type == 'EventHandler' and interface.name in ['Window', 'WorkerGlobalScope'] and attribute.name == 'onerror'): includes.add('bindings/v8/V8ErrorHandler.h') contents = { 'access_control_list': access_control_list(attribute), 'activity_logging_world_list_for_getter': v8_utilities.activity_logging_world_list(attribute, 'Getter'), # [ActivityLogging] 'activity_logging_world_list_for_setter': v8_utilities.activity_logging_world_list(attribute, 'Setter'), # [ActivityLogging] 'cached_attribute_validation_method': extended_attributes.get('CachedAttribute'), 'conditional_string': v8_utilities.conditional_string(attribute), 'constructor_type': v8_types.constructor_type(idl_type) if is_constructor_attribute(attribute) else None, 'cpp_name': cpp_name(attribute), 'cpp_type': v8_types.cpp_type(idl_type), 'deprecate_as': v8_utilities.deprecate_as(attribute), # [DeprecateAs] 'enum_validation_expression': v8_utilities.enum_validation_expression(idl_type), 'has_custom_getter': has_custom_getter, 'has_custom_setter': has_custom_setter, 'has_strict_type_checking': has_strict_type_checking, 'idl_type': idl_type, 'is_call_with_execution_context': v8_utilities.has_extended_attribute_value(attribute, 'CallWith', 'ExecutionContext'), 'is_check_security_for_node': is_check_security_for_node, 'is_custom_element_callbacks': is_custom_element_callbacks, 'is_expose_js_accessors': 'ExposeJSAccessors' in extended_attributes, 'is_getter_raises_exception': ( # [RaisesException] 'RaisesException' in extended_attributes and extended_attributes['RaisesException'] in [None, 'Getter']), 'is_initialized_by_event_constructor': 'InitializedByEventConstructor' in extended_attributes, 'is_keep_alive_for_gc': is_keep_alive_for_gc(interface, attribute), 'is_nullable': attribute.is_nullable, 'is_per_world_bindings': 'PerWorldBindings' in extended_attributes, 'is_read_only': attribute.is_read_only, 'is_reflect': is_reflect, 'is_replaceable': 'Replaceable' in attribute.extended_attributes, 'is_setter_call_with_execution_context': v8_utilities.has_extended_attribute_value(attribute, 'SetterCallWith', 'ExecutionContext'), 'is_setter_raises_exception': is_setter_raises_exception, 'has_setter_exception_state': ( is_setter_raises_exception or has_strict_type_checking or v8_types.is_integer_type(idl_type)), 'is_static': attribute.is_static, 'is_url': 'URL' in extended_attributes, 'is_unforgeable': 'Unforgeable' in extended_attributes, 'measure_as': v8_utilities.measure_as(attribute), # [MeasureAs] 'name': attribute.name, 'per_context_enabled_function': v8_utilities.per_context_enabled_function_name(attribute), # [PerContextEnabled] 'property_attributes': property_attributes(attribute), 'put_forwards': 'PutForwards' in extended_attributes, 'reflect_empty': extended_attributes.get('ReflectEmpty'), 'reflect_invalid': extended_attributes.get('ReflectInvalid', ''), 'reflect_missing': extended_attributes.get('ReflectMissing'), 'reflect_only': extended_attributes['ReflectOnly'].split('|') if 'ReflectOnly' in extended_attributes else None, 'setter_callback': setter_callback_name(interface, attribute), 'v8_type': v8_types.v8_type(idl_type), 'runtime_enabled_function': v8_utilities.runtime_enabled_function_name(attribute), # [RuntimeEnabled] 'world_suffixes': ['', 'ForMainWorld'] if 'PerWorldBindings' in extended_attributes else [''], # [PerWorldBindings] } if is_constructor_attribute(attribute): return contents if not has_custom_getter: generate_getter(interface, attribute, contents) if (not has_custom_setter and (not attribute.is_read_only or 'PutForwards' in extended_attributes)): generate_setter(interface, attribute, contents) return contents