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

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

Issue 17572008: WIP IDL compiler rewrite (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Branch: const + primitive type readonly attributes Created 7 years, 4 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_wip.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/templates/macros.cpp
diff --git a/Source/bindings/templates/macros.cpp b/Source/bindings/templates/macros.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ed57afa35b2ace4189e3a25a09a3790a925a853f
--- /dev/null
+++ b/Source/bindings/templates/macros.cpp
@@ -0,0 +1,298 @@
+{% macro parameters_check(function) %}
+{% for parameter in function.parameters %}{#### see GenerateParametersCheck #}
+{#
+// { {parameter.name} }
+// { {parameter.is_callback_interface} }
+#}
+{% if parameter.early_call %}
+ if (args.Length() <= {{parameter.index}}) {
+ {{function_call(parameter.early_call_statement_parameter) | trim | indent}}
+{# FIXME: whitespace error in V8Entry.cpp, fix Perl CG to remove this line #}
+ }
+{% endif %}
+{# TODO if ($parameter->isOptional && !$parameter->extendedAttributes->{"Default"} && $nativeType ne "Dictionary" && !IsCallbackInterface($parameter->type)) { #}
+{# TODO if ($parameter->isOptional and $default eq "NullString") { #}
+{% if parameter.is_callback_interface %}{###########################}
+{% if parameter.is_optional %}
+ RefPtr<{{parameter.type}}> {{parameter.name}};
+ if (args.Length() > {{parameter.index}} && !args[{{parameter.index}}]->IsNull() && !args[{{parameter.index}}]->IsUndefined()) {
+ if (!args[{{parameter.index}}]->IsFunction()) {
+ throwTypeError(args.GetIsolate());
+ return;
+ }
+ {{parameter.name}} = V8{{parameter.type}}::create(args[{{parameter.index}}], getScriptExecutionContext());
+ }
+{% else %}
+ if (args.Length() <= {{parameter.index}} || !args[{{parameter.index}}]->IsFunction()) {
+ throwTypeError(args.GetIsolate());
+ return;
+ }
+ RefPtr<{{parameter.type}}> {{parameter.name}} = V8{{parameter.type}}::create(args[{{parameter.index}}], getScriptExecutionContext());
+{% endif %}
+{% elif parameter.clamp %}{###########################}
+ {{parameter.type}} {{parameter.name}}NativeValue = 0;
+ V8TRYCATCH_VOID(double, $nativeValue, args[{{parameter.index}}]->NumberValue());
+ if (!std::isnan({{parameter.name}}NativeValue))
+ {{parameter.name}}NativeValue = clampTo<{{parameter.type}}>({{parameter.name}}NativeValue);
+{% elif parameter.type == "SerializedScriptValue" %}{###########################}
+ bool {{parameter.name}}DidThrow = false;
+ {{parameter.naive_type}} {{parameter.name}} = SerializedScriptValue::create(args[{{parameter.index}}], 0, 0, {{parameter.name}}DidThrow, args.GetIsolate());
+ if ({{parameter.name}}DidThrow)
+ return;
+{% elif parameter.is_variadic %}{###########################}
+{% if parameter.is_wrapper_type %}
+ Vector<{{parameter.native_type}}> {{parameter.name}};
+ for (int i = {{parameter.index}}; i < args.Length(); ++i) {
+ if (!V8{{parameter.type}}::HasInstance(args[i], args.GetIsolate(), worldType(args.GetIsolate()))) {
+ throwTypeError(args.GetIsolate());
+ return;
+ }
+ {{parameter.name}}.append(V8{{parameter.type}}::toNative(v8::Handle<v8::Object>::Cast(args[i])));
+ }
+{% else %}
+ V8TRYCATCH_VOID(Vector<{{parameter.native_element_type}}>, {{parameter.name}}, toNativeArguments<{{parameter.native_element_type}}>(args, {{parameter.index}}));
+{% endif %}
+{% elif parameter.is_string %}{###########################}
+ {{parameter.convert_to_v8_string_resource}}
+{% if parameter.is_enum_type %}
+ String string = {{parameter.name}};
+ if (!({{parameter.enum_validation_expression}})) {
+ throwTypeError(args.GetIsolate());
+ return;
+ }
+{% endif %}
+{% else %}{###########################}
+{#
+ If the "StrictTypeChecking" extended attribute is present, and the argument's type is an
+ interface type, then if the incoming value does not implement that interface, a TypeError
+ is thrown rather than silently passing NULL to the C++ code.
+ Per the Web IDL and ECMAScript specifications, incoming values can always be converted
+ to both strings and numbers, so do not throw TypeError if the argument is of these
+ types.
+#}
+{# TODO #}
+{% if parameter.strict_type_checking and parameter.is_wrapper_type %}
+ if (args.Length() > {{parameter.index}} && !isUndefinedOrNull(arg[{{parameter.index}}]) && !V8{{parameter.type}}::HasInstance(arg[{{parameter.index}}], args.GetIsolate(), worldType(args.GetIsolate()))) {
+ throwTypeError(args.GetIsolate());
+ return;
+ }
+{% endif %}
+{################# JS to native #}
+ {{parameter.js_to_native_statement}}
+{% if parameter.native_type == "Dictionary" %}
+ if (!{{parameter.name}}.isUndefinedOrNull() && !{{parameter.name}}.isObject()) {
+ throwTypeError("Not an object.", args.GetIsolate());
+ return;
+ }
+{% endif %}
+{% endif %}
+{% if parameter.is_index %}
+ if (UNLIKELY({{parameter.name}} < 0)) {
+ setDOMException(IndexSizeError, args.GetIsolate());
+ return;
+ }
+{% endif %}
+{% endfor %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro function_call(function_call) %}
+{{call_with_statements(function_call.call_with) -}}
+{% for parameter in function_call.parameters %}
+{% if parameter.svg_tear_off_and_not_list %}
+ if (!{{parameter.name}}) {
+ setDOMException(WebCore::TypeMismatchError, args.GetIsolate());
+ return;
+ }
+{% endif %}
+{% endfor %}
+{% if function_call.statement %}
+ {{function_call.statement | indent}}
+{% endif %}
+{% if function_call.raises_exception %}
+ if (es.throwIfNeeded())
+ return;
+{% endif %}
+{% if function_call.extended_attribute_contains_script_state %}
+ if (state.hadException()) {
+ v8::Local<v8::Value> exception = state.exception();
+ state.clearException();
+ throwError(exception);
+ return;
+ }
+{% endif %}
+{% if function_call.svg_tear_off_and_not_list %}
+{% if function_call.is_dom_node_type %}
+ v8SetReturnValue(args, toV8Fast{{function_call.for_main_world_suffix}}(WTF::getPtr({{function_call.svg_native_type}}::create({{function_call.native_value_expression}})), args, imp));
+{% else %}
+ v8SetReturnValue(args, toV8{{function_call.for_main_world_suffix}}(WTF::getPtr({{function_call.svg_native_type}}::create({{function_call.native_value_expression}})), args.Holder(), args.GetIsolate()));
+{% endif %}
+ return;
+{% else %}
+{% if function_call.return_js_value_statement %}
+ {{function_call.return_js_value_statement | indent}}
+{% else %}
+
+{% endif %}
+ return;
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro feature_observation(measure_as) %}
+{% if measure_as %}
+ UseCounter::count(activeDOMWindow(), UseCounter::{{measure_as}});
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro deprecation_notification(deprecate_as) %}
+{% if deprecate_as %}
+ UseCounter::countDeprecation(activeDOMWindow(), UseCounter::{{deprecate_as}});
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro call_with_statements(call_with) %}
+{% if call_with %}
+{% if call_with.script_state %}
+ ScriptState* currentState = ScriptState::current();
+ if (!currentState)
+ return{{script_state_return_value}};
+ ScriptState& state = *currentState;
+{% endif %}
+{% if call_with.script_execution_context %}
+ ScriptExecutionContext* scriptContext = getScriptExecutionContext();
+{%- endif %}
+{% if call_with.function and call_with.script_arguments %}
+
+ RefPtr<ScriptArguments> scriptArguments(createScriptArguments(args, {{call_with.number_of_function_parameters}}));
+{% endif %}
+{% endif %}
+{%- endmacro %}
+
+
+{##############################################################################}
+{% macro activity_logging(access_type, property_name) %}
+{% if access_type == "Method" %}
+ V8PerContextData* contextData = V8PerContextData::from(args.GetIsolate()->GetCurrentContext());
+ if (contextData && contextData->activityLogger()) {
+ Vector<v8::Handle<v8::Value> > loggerArgs = toVectorOfArguments(args);
+ contextData->activityLogger()->log("{{interface_name}}.{{property_name}}", args.Length(), loggerArgs.data(), "{{access_type}}");
+ }
+{% endif %}
+{% if access_type == "Setter" %}
+ V8PerContextData* contextData = V8PerContextData::from(info.GetIsolate()->GetCurrentContext());
+ if (contextData && contextData->activityLogger()) {
+ v8::Handle<v8::Value> loggerArg[] = { value };
+ contextData->activityLogger()->log("{{interface_name}}.{{property_name}}", 1, &loggerArg[0], "{{access_type}}");
+ }
+{% endif %}
+{% if access_type == "Getter" %}
+ V8PerContextData* contextData = V8PerContextData::from(info.GetIsolate()->GetCurrentContext());
+ if (contextData && contextData->activityLogger())
+ contextData->activityLogger()->log("{{interface_name}}.{{property_name}}", 0, 0, "{{access_type}}");
+{% endif %}
+{%- endmacro %}
+
+
+{##############################################################################}
+{# user: replaceable attr setter, normal attr setter, normal attr setter callback, function #}
+{% macro custom_element_invocation(custom_element_invocation_scope) %}
+{% if custom_element_invocation_scope %}
+ CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope;
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro method(function, for_main_world_suffix) %}
+{% if function.conditional_string %}
+#if {{function.conditional_string}}
+{% endif %}
+static void {{function.name}}Method{{for_main_world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+{% if function.mandatory_parameters %}
+ if (args.Length() < {{function.mandatory_parameters}}) {
+ throwNotEnoughArgumentsError(args.GetIsolate());
+ return;
+ }
+{% endif %}
+{###################### Get imp #}
+{% if not function.is_static %}
+ {{cpp_class_name}}* imp = {{v8_class_name}}::toNative(args.Holder());
+{% endif %}
+{{custom_element_invocation(function.custom_element_invocation_scope) -}}
+{% if function.raises_exception %}
+ ExceptionState es(args.GetIsolate());
+{% endif %}
+{% if function.check_security_for_node %}
+ if (!BindingSecurity::shouldAllowAccessToNode(imp->{{function.cpp_name}}(es))) {
+ v8SetReturnValueNull(args);
+ return;
+ }
+{% endif %}
+{{parameters_check(function) -}}
+{{function_call(function.function_call_parameter[for_main_world_suffix]) -}}
+}
+
+{% if function.conditional_string %}
+#endif // {{function.conditional_string}}
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro method_callback(function, for_main_world_suffix) %}
+{% if function.name %}
+{% if function.conditional_string %}
+#if {{function.conditional_string}}
+{% endif %}
+static void {{function.name}}MethodCallback{{function.for_main_world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+ TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMMethod");
+{{feature_observation(function.measure_as) -}}
+{{deprecation_notification(function.deprecate_as) -}}
+{% if for_main_world_suffix in function.activity_logging %}
+{{activity_logging("Method", function.name)}}
+{% endif %}
+{% if function.is_custom %}
+ {{v8_class_name}}::{{function.name}}MethodCustom(args);
+{% else %}
+ {{cpp_class_name}}V8Internal::{{function.name}}Method{{function.for_main_world_suffix}}(args);
+{% endif %}
+ TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
+}
+
+{% if function.conditional_string %}
+#endif // {{function.conditional_string}}
+{% endif %}
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro if_else_statement(type, variable_name, condition_and_statements) %}
+{% if condition_and_statements | length == 1 %}
+ {{type}} {{variable_name}} = {{condition_and_statements[0]["statement"]}}
+{% else %}
+ {{type}} {{variable_name}};
+{% for condition_and_statement in condition_and_statements %}
+{% if loop.first %}
+ if{% elif loop.last %}
+
+ else{% else %}
+
+ else if{% endif %}
+{% if condition_and_statement["condition"] %} ({{condition_and_statement["condition"]}})
+{% else %}
+
+{% endif %}
+ {{variable_name}} = {{condition_and_statement["statement"]}}
+{%- endfor %}
+{% endif %}
+{% endmacro %}
« no previous file with comments | « Source/bindings/templates/interface_wip.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698