Chromium Code Reviews| Index: Source/bindings/templates/methods.cpp |
| diff --git a/Source/bindings/templates/methods.cpp b/Source/bindings/templates/methods.cpp |
| index 598506269c938201bd0d63a2271c22b8b373d6da..ec4a33cc859a3a336c3b8093973fbb6e9a80acb3 100644 |
| --- a/Source/bindings/templates/methods.cpp |
| +++ b/Source/bindings/templates/methods.cpp |
| @@ -482,17 +482,31 @@ static void {{method.name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Lo |
| {##############################################################################} |
| {% macro generate_constructor(constructor) %} |
| -static void constructor{{constructor.overload_index}}(const v8::FunctionCallbackInfo<v8::Value>& info) |
| +{% set name = '%sConstructorCallback' % v8_class |
| + if constructor.is_named_constructor else |
| + 'constructor%s' % (constructor.overload_index or '') %} |
| +static void {{name}}(const v8::FunctionCallbackInfo<v8::Value>& info) |
| { |
| v8::Isolate* isolate = info.GetIsolate(); |
| + {% if constructor.is_named_constructor %} |
| + if (!info.IsConstructCall()) { |
| + throwTypeError(ExceptionMessages::constructorNotCallableAsFunction("{{constructor.name}}"), isolate); |
| + return; |
| + } |
| + |
| + if (ConstructorMode::current(isolate) == ConstructorMode::WrapExistingObject) { |
| + v8SetReturnValue(info, info.Holder()); |
| + return; |
| + } |
| + {% endif %} |
|
haraken
2014/06/25 09:43:11
This block is fine in this CL, but we might want t
Jens Widell
2014/06/25 10:55:37
Ah, I was wondering why these things applied only
|
| {% if constructor.has_exception_state %} |
| ExceptionState exceptionState(ExceptionState::ConstructionContext, "{{interface_name}}", info.Holder(), isolate); |
| {% endif %} |
| {# Overloaded constructors have length checked during overload resolution #} |
| - {% if interface_length and not constructor.overload_index %} |
| + {% if constructor.number_of_required_arguments and not constructor.overload_index %} |
|
Jens Widell
2014/06/25 07:50:42
Using 'constructor.number_of_required_arguments' i
haraken
2014/06/25 09:43:11
What is the spec saying?
interface.cpp is still u
Jens Widell
2014/06/25 10:55:37
The key here is that regular constructors (or cust
|
| {# FIXME: remove UNLIKELY: constructors are expensive, so no difference. #} |
| - if (UNLIKELY(info.Length() < {{interface_length}})) { |
| - {{throw_minimum_arity_type_error(constructor, interface_length)}}; |
| + if (UNLIKELY(info.Length() < {{constructor.number_of_required_arguments}})) { |
| + {{throw_minimum_arity_type_error(constructor, constructor.number_of_required_arguments)}}; |
| return; |
| } |
| {% endif %} |
| @@ -529,43 +543,3 @@ V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{constr |
| {% endif %} |
| v8SetReturnValue(info, wrapper); |
| {% endmacro %} |
| - |
| - |
| -{##############################################################################} |
| -{% macro named_constructor_callback(constructor) %} |
| -static void {{v8_class}}ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& info) |
| -{ |
| - v8::Isolate* isolate = info.GetIsolate(); |
| - if (!info.IsConstructCall()) { |
| - throwTypeError(ExceptionMessages::constructorNotCallableAsFunction("{{constructor.name}}"), isolate); |
| - return; |
| - } |
| - |
| - if (ConstructorMode::current(isolate) == ConstructorMode::WrapExistingObject) { |
| - v8SetReturnValue(info, info.Holder()); |
| - return; |
| - } |
| - |
| - Document& document = *toDocument(currentExecutionContext(isolate)); |
| - |
| - {% if constructor.has_exception_state %} |
| - ExceptionState exceptionState(ExceptionState::ConstructionContext, "{{interface_name}}", info.Holder(), isolate); |
| - {% endif %} |
| - {% if constructor.number_of_required_arguments %} |
| - if (UNLIKELY(info.Length() < {{constructor.number_of_required_arguments}})) { |
| - {{throw_minimum_arity_type_error(constructor, constructor.number_of_required_arguments)}}; |
| - return; |
| - } |
| - {% endif %} |
| - {% if constructor.arguments %} |
| - {{generate_arguments(constructor) | indent}} |
| - {% endif %} |
| - {{constructor.cpp_type}} impl = {{constructor.cpp_value}}; |
| - {% if is_constructor_raises_exception %} |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| - {% endif %} |
| - |
| - {{generate_constructor_wrapper(constructor) | indent}} |
| -} |
| -{% endmacro %} |