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

Unified Diff: Source/bindings/templates/methods.cpp

Issue 284163002: Better arity checks for overloads (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Return properly Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/templates/interface.cpp ('k') | Source/bindings/tests/results/V8TestInterface.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/templates/methods.cpp
diff --git a/Source/bindings/templates/methods.cpp b/Source/bindings/templates/methods.cpp
index 3ae2bdbebf4341b9bde4556ca2ef09608b85915c..75b6b59729ff2b1fca3d133e57b1123755098cd4 100644
--- a/Source/bindings/templates/methods.cpp
+++ b/Source/bindings/templates/methods.cpp
@@ -10,7 +10,7 @@ static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const
{# Overloaded methods have length checked during overload resolution #}
{% if method.number_of_required_arguments and not method.overload_index %}
if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) {
- {{throw_arity_type_error(method, method.number_of_required_arguments)}};
+ {{throw_minimum_arity_type_error(method, method.number_of_required_arguments)}};
return;
}
{% endif %}
@@ -267,13 +267,25 @@ throwTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{interfac
{######################################}
-{% macro throw_arity_type_error(method, number_of_required_arguments) %}
+{% macro throw_arity_type_error(method, valid_arities) %}
{% if method.has_exception_state %}
-throwArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Length())
+throwArityTypeError(exceptionState, {{valid_arities}}, info.Length())
{%- elif method.is_constructor %}
-throwArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsolate())
+throwArityTypeErrorForConstructor("{{interface_name}}", {{valid_arities}}, info.Length(), info.GetIsolate())
{%- else %}
-throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsolate())
+throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{valid_arities}}, info.Length(), info.GetIsolate())
+{%- endif %}
+{% endmacro %}
+
+
+{######################################}
+{% macro throw_minimum_arity_type_error(method, number_of_required_arguments) %}
+{% if method.has_exception_state %}
+throwMinimumArityTypeError(exceptionState, {{number_of_required_arguments}}, info.Length())
+{%- elif method.is_constructor %}
+throwMinimumArityTypeErrorForConstructor("{{interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsolate())
+{%- else %}
+throwMinimumArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{number_of_required_arguments}}, info.Length(), info.GetIsolate())
{%- endif %}
{% endmacro %}
@@ -313,14 +325,21 @@ static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI
{% endfor %}
break;
{% endfor %}
- }
- {# No match, throw error #}
- {% if overloads.minimum_number_of_required_arguments %}
- if (UNLIKELY(info.Length() < {{overloads.minimum_number_of_required_arguments}})) {
- throwArityTypeError(exceptionState, {{overloads.minimum_number_of_required_arguments}}, info.Length());
+ default:
+ {# Invalid arity, throw error #}
+ {# Report full list of valid arities if gaps and above minimum #}
+ {% if overloads.valid_arities %}
+ if (info.Length() >= {{overloads.minarg}}) {
+ throwArityTypeError(exceptionState, "{{overloads.valid_arities}}", info.Length());
+ return;
+ }
+ {% endif %}
+ {# Otherwise just report "not enough arguments" #}
+ exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{overloads.minarg}}, info.Length()));
+ exceptionState.throwIfNeeded();
return;
}
- {% endif %}
+ {# No match, throw error #}
exceptionState.throwTypeError("No function was found that matched the signature provided.");
exceptionState.throwIfNeeded();
}
@@ -420,7 +439,7 @@ static void constructor{{constructor.overload_index}}(const v8::FunctionCallback
{% if interface_length and not constructor.overload_index %}
{# FIXME: remove UNLIKELY: constructors are expensive, so no difference. #}
if (UNLIKELY(info.Length() < {{interface_length}})) {
- {{throw_arity_type_error(constructor, interface_length)}};
+ {{throw_minimum_arity_type_error(constructor, interface_length)}};
return;
}
{% endif %}
@@ -486,7 +505,7 @@ static void {{v8_class}}ConstructorCallback(const v8::FunctionCallbackInfo<v8::V
{% endif %}
{% if constructor.number_of_required_arguments %}
if (UNLIKELY(info.Length() < {{constructor.number_of_required_arguments}})) {
- {{throw_arity_type_error(constructor, constructor.number_of_required_arguments)}};
+ {{throw_minimum_arity_type_error(constructor, constructor.number_of_required_arguments)}};
return;
}
{% endif %}
« no previous file with comments | « Source/bindings/templates/interface.cpp ('k') | Source/bindings/tests/results/V8TestInterface.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698