Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 {##############################################################################} | 1 {##############################################################################} |
| 2 {% macro generate_method(method, world_suffix) %} | 2 {% macro generate_method(method, world_suffix) %} |
| 3 {% filter conditional(method.conditional_string) %} | 3 {% filter conditional(method.conditional_string) %} |
| 4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) | 4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info{% if method.overload_index %}, int ty pe_checked_argument_index{% endif %}) |
| 5 { | 5 { |
| 6 {# Local variables #} | 6 {# Local variables #} |
| 7 {% if method.has_exception_state %} | 7 {% if method.has_exception_state %} |
| 8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); | 8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); |
| 9 {% endif %} | 9 {% endif %} |
| 10 {# Overloaded methods have length checked during overload resolution #} | 10 {# Overloaded methods have length checked during overload resolution #} |
| 11 {% if method.number_of_required_arguments and not method.overload_index %} | 11 {% if method.number_of_required_arguments and not method.overload_index %} |
| 12 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { | 12 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { |
| 13 {{throw_minimum_arity_type_error(method, method.number_of_required_argum ents) | indent(8)}} | 13 {{throw_minimum_arity_type_error(method, method.number_of_required_argum ents) | indent(8)}} |
| 14 return; | 14 return; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 {% elif argument.is_dictionary %} | 165 {% elif argument.is_dictionary %} |
| 166 {# Dictionaries must have type Undefined, Null or Object: | 166 {# Dictionaries must have type Undefined, Null or Object: |
| 167 http://heycam.github.io/webidl/#es-dictionary #} | 167 http://heycam.github.io/webidl/#es-dictionary #} |
| 168 if (!isUndefinedOrNull(info[{{argument.index}}]) && !info[{{argument.index}}]->I sObject()) { | 168 if (!isUndefinedOrNull(info[{{argument.index}}]) && !info[{{argument.index}}]->I sObject()) { |
| 169 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' % | 169 {{throw_type_error(method, '"parameter %s (\'%s\') is not an object."' % |
| 170 (argument.index + 1, argument.name)) | indent}} | 170 (argument.index + 1, argument.name)) | indent}} |
| 171 return; | 171 return; |
| 172 } | 172 } |
| 173 {{argument.v8_value_to_local_cpp_value}}; | 173 {{argument.v8_value_to_local_cpp_value}}; |
| 174 {% else %}{# argument.is_nullable #} | 174 {% else %}{# argument.is_nullable #} |
| 175 {# Optionally do an "unsafe" type conversion if meaningful for this argument's | |
| 176 type and if this method is overloaded and the argument's type was checked as | |
| 177 part of overload resolution for this particular call. #} | |
| 178 {% if method.overload_index and | |
| 179 argument.is_distinguishing_argument and | |
| 180 argument.v8_value_to_local_cpp_value_unsafe %} | |
| 181 if (type_checked_argument_index == {{argument.index}}) | |
|
haraken
2014/10/14 13:54:07
Help me understand: I'm curious about the relation
Jens Widell
2014/10/14 14:37:56
Yes, it's possible. The key complexity here (which
| |
| 182 {{argument.v8_value_to_local_cpp_value_unsafe}}; | |
| 183 else | |
| 184 {{argument.v8_value_to_local_cpp_value}}; | |
| 185 {% else %} | |
| 175 {{argument.v8_value_to_local_cpp_value}}; | 186 {{argument.v8_value_to_local_cpp_value}}; |
| 187 {% endif %} | |
| 176 {% endif %}{# argument.is_nullable #} | 188 {% endif %}{# argument.is_nullable #} |
| 177 {# Type checking, possibly throw a TypeError, per: | 189 {# Type checking, possibly throw a TypeError, per: |
| 178 http://www.w3.org/TR/WebIDL/#es-type-mapping #} | 190 http://www.w3.org/TR/WebIDL/#es-type-mapping #} |
| 179 {% if argument.has_type_checking_unrestricted %} | 191 {% if argument.has_type_checking_unrestricted %} |
| 180 {# Non-finite floating point values (NaN, +Infinity or −Infinity), per: | 192 {# Non-finite floating point values (NaN, +Infinity or −Infinity), per: |
| 181 http://heycam.github.io/webidl/#es-float | 193 http://heycam.github.io/webidl/#es-float |
| 182 http://heycam.github.io/webidl/#es-double #} | 194 http://heycam.github.io/webidl/#es-double #} |
| 183 if (!std::isfinite({{argument.name}})) { | 195 if (!std::isfinite({{argument.name}})) { |
| 184 {{throw_type_error(method, '"%s parameter %s is non-finite."' % | 196 {{throw_type_error(method, '"%s parameter %s is non-finite."' % |
| 185 (argument.idl_type, argument.index + 1)) | indent }} | 197 (argument.idl_type, argument.index + 1)) | indent }} |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 370 UseCounter::countDeprecation(callingExecutionContext(info.GetIsolate()), Use Counter::{{overloads.deprecate_all_as}}); | 382 UseCounter::countDeprecation(callingExecutionContext(info.GetIsolate()), Use Counter::{{overloads.deprecate_all_as}}); |
| 371 {% endif %} | 383 {% endif %} |
| 372 {# First resolve by length #} | 384 {# First resolve by length #} |
| 373 {# 2. Initialize argcount to be min(maxarg, n). #} | 385 {# 2. Initialize argcount to be min(maxarg, n). #} |
| 374 switch (std::min({{overloads.maxarg}}, info.Length())) { | 386 switch (std::min({{overloads.maxarg}}, info.Length())) { |
| 375 {# 3. Remove from S all entries whose type list is not of length argcount. # } | 387 {# 3. Remove from S all entries whose type list is not of length argcount. # } |
| 376 {% for length, tests_methods in overloads.length_tests_methods %} | 388 {% for length, tests_methods in overloads.length_tests_methods %} |
| 377 {# 10. If i = d, then: #} | 389 {# 10. If i = d, then: #} |
| 378 case {{length}}: | 390 case {{length}}: |
| 379 {# Then resolve by testing argument #} | 391 {# Then resolve by testing argument #} |
| 380 {% for test, method in tests_methods %} | 392 {% for test, method, typed_checked_argument_index in tests_methods %} |
| 381 {% filter runtime_enabled(not overloads.runtime_enabled_function_all and | 393 {% filter runtime_enabled(not overloads.runtime_enabled_function_all and |
| 382 method.runtime_enabled_function) %} | 394 method.runtime_enabled_function) %} |
| 383 if ({{test}}) { | 395 if ({{test}}) { |
| 384 {% if method.measure_as and not overloads.measure_all_as %} | 396 {% if method.measure_as and not overloads.measure_all_as %} |
| 385 UseCounter::count(callingExecutionContext(info.GetIsolate()), UseCou nter::{{method.measure_as}}); | 397 UseCounter::count(callingExecutionContext(info.GetIsolate()), UseCou nter::{{method.measure_as}}); |
| 386 {% endif %} | 398 {% endif %} |
| 387 {% if method.deprecate_as and not overloads.deprecate_all_as %} | 399 {% if method.deprecate_as and not overloads.deprecate_all_as %} |
| 388 UseCounter::countDeprecation(callingExecutionContext(info.GetIsolate ()), UseCounter::{{method.deprecate_as}}); | 400 UseCounter::countDeprecation(callingExecutionContext(info.GetIsolate ()), UseCounter::{{method.deprecate_as}}); |
| 389 {% endif %} | 401 {% endif %} |
| 390 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info) ; | 402 {{method.name}}{{method.overload_index}}Method{{world_suffix}}(info, {{typed_checked_argument_index}}); |
| 391 return; | 403 return; |
| 392 } | 404 } |
| 393 {% endfilter %} | 405 {% endfilter %} |
| 394 {% endfor %} | 406 {% endfor %} |
| 395 break; | 407 break; |
| 396 {% endfor %} | 408 {% endfor %} |
| 397 default: | 409 default: |
| 398 {# Invalid arity, throw error #} | 410 {# Invalid arity, throw error #} |
| 399 {# Report full list of valid arities if gaps and above minimum #} | 411 {# Report full list of valid arities if gaps and above minimum #} |
| 400 {% if overloads.valid_arities %} | 412 {% if overloads.valid_arities %} |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 540 return true; | 552 return true; |
| 541 } | 553 } |
| 542 {% endmacro %} | 554 {% endmacro %} |
| 543 | 555 |
| 544 | 556 |
| 545 {##############################################################################} | 557 {##############################################################################} |
| 546 {% macro generate_constructor(constructor) %} | 558 {% macro generate_constructor(constructor) %} |
| 547 {% set name = '%sConstructorCallback' % v8_class | 559 {% set name = '%sConstructorCallback' % v8_class |
| 548 if constructor.is_named_constructor else | 560 if constructor.is_named_constructor else |
| 549 'constructor%s' % (constructor.overload_index or '') %} | 561 'constructor%s' % (constructor.overload_index or '') %} |
| 550 static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info) | 562 static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info{% if constr uctor.overload_index %}, int type_checked_argument_index{% endif %}) |
|
haraken
2014/10/14 13:54:07
type_checked_argument_index => typeCheckedArgument
| |
| 551 { | 563 { |
| 552 {% if constructor.is_named_constructor %} | 564 {% if constructor.is_named_constructor %} |
| 553 if (!info.IsConstructCall()) { | 565 if (!info.IsConstructCall()) { |
| 554 V8ThrowException::throwTypeError(ExceptionMessages::constructorNotCallab leAsFunction("{{constructor.name}}"), info.GetIsolate()); | 566 V8ThrowException::throwTypeError(ExceptionMessages::constructorNotCallab leAsFunction("{{constructor.name}}"), info.GetIsolate()); |
| 555 return; | 567 return; |
| 556 } | 568 } |
| 557 | 569 |
| 558 if (ConstructorMode::current(info.GetIsolate()) == ConstructorMode::WrapExis tingObject) { | 570 if (ConstructorMode::current(info.GetIsolate()) == ConstructorMode::WrapExis tingObject) { |
| 559 v8SetReturnValue(info, info.Holder()); | 571 v8SetReturnValue(info, info.Holder()); |
| 560 return; | 572 return; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 if method.is_per_world_bindings else '0' %} | 628 if method.is_per_world_bindings else '0' %} |
| 617 {% set property_attribute = | 629 {% set property_attribute = |
| 618 'static_cast<v8::PropertyAttribute>(%s)' % ' | '.join(method.property_attribut es) | 630 'static_cast<v8::PropertyAttribute>(%s)' % ' | '.join(method.property_attribut es) |
| 619 if method.property_attributes else 'v8::None' %} | 631 if method.property_attributes else 'v8::None' %} |
| 620 {% set only_exposed_to_private_script = 'V8DOMConfiguration::OnlyExposedToPrivat eScript' if method.only_exposed_to_private_script else 'V8DOMConfiguration::Expo sedToAllScripts' %} | 632 {% set only_exposed_to_private_script = 'V8DOMConfiguration::OnlyExposedToPrivat eScript' if method.only_exposed_to_private_script else 'V8DOMConfiguration::Expo sedToAllScripts' %} |
| 621 static const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfig uration = { | 633 static const V8DOMConfiguration::MethodConfiguration {{method.name}}MethodConfig uration = { |
| 622 "{{method.name}}", {{method_callback}}, {{method_callback_for_main_world}}, {{method.length}}, {{only_exposed_to_private_script}}, | 634 "{{method.name}}", {{method_callback}}, {{method_callback_for_main_world}}, {{method.length}}, {{only_exposed_to_private_script}}, |
| 623 }; | 635 }; |
| 624 V8DOMConfiguration::installMethod({{method.function_template}}, {{method.signatu re}}, {{property_attribute}}, {{method.name}}MethodConfiguration, isolate); | 636 V8DOMConfiguration::installMethod({{method.function_template}}, {{method.signatu re}}, {{property_attribute}}, {{method.name}}MethodConfiguration, isolate); |
| 625 {%- endmacro %} | 637 {%- endmacro %} |
| OLD | NEW |