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

Unified Diff: Source/bindings/templates/constructors.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/constants.cpp ('k') | Source/bindings/templates/interface.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/templates/constructors.cpp
diff --git a/Source/bindings/templates/constructors.cpp b/Source/bindings/templates/constructors.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3bac1163ef797e764432465861e6a2fde2eb17b8
--- /dev/null
+++ b/Source/bindings/templates/constructors.cpp
@@ -0,0 +1,189 @@
+{% from 'macros.cpp' import deprecation_notification, feature_observation, parameters_check with context %}
+
+{##############################################################################}
+{% macro make_constructors() %}
+{% if has_named_constructor %}
+{% elif has_constructor %}
+{% for constructor in constructors %}
+{{normal_constructor(constructor)}}
+{% endfor %}
+{% elif is_constructor_template_of_event %}
+{{constructor_template_of_event()}}
+{% elif is_constructor_template_of_typed_array %}
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro normal_constructor(constructor) %}
+{# FIXME: check name #}
+static void constructor{{constructor.overloaded_index_string}}(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+{% if constructor.overloaded_index == 0 and constructor.mandatory_parameters %}
+ if (args.Length() < {{constructor.mandatory_parameters}}) {
+ throwNotEnoughArgumentsError(args.GetIsolate());
+ return;
+ }
+{% endif %}
+{% if constructor_raises_exception %}
+ ExceptionState es(args.GetIsolate());
+{% endif %}
+{{parameters_check(constructor)}}
+{% if constructor_call_with == 'ScriptExecutionContext' %}
+ ScriptExecutionContext* context = getScriptExecutionContext();
+{% endif %}
+ RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::create({{constructor.argument_string}});
+ v8::Handle<v8::Object> wrapper = args.Holder();
+{% if constructor_raises_exception %}
+ if (es.throwIfNeeded())
+ return;
+{% endif %}
+
+ V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(), &{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
+ args.GetReturnValue().Set(wrapper);
+}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro constructor_template_of_event() %}
+{# FIXME: check name #}
+static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+ if (args.Length() < 1) {
+ throwNotEnoughArgumentsError(args.GetIsolate());
+ return;
+ }
+
+ V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, type, args[0]);
+{% for attribute in attributes %}
+{% if attribute.type == 'any' %}
+ v8::Local<v8::Value> {{attribute.name}};
+{% endif %}
+{% endfor %}
+ {{cpp_class_name}}Init eventInit;
+ if (args.Length() >= 2) {
+ V8TRYCATCH_VOID(Dictionary, options, Dictionary(args[1], args.GetIsolate()));
+ if (!fill{{cpp_class_name}}Init(eventInit, options))
+ return;
+{% for attribute in attributes %}
+{% if attribute.type == 'any' %}
+ options.get("{{attribute.name}}", {{attribute.name}});
+ if (!{{attribute.name}}.IsEmpty())
+ args.Holder()->SetHiddenValue(V8HiddenPropertyName::{{attribute.name}}(), {{attribute.name}});
+{% endif %}
+{% endfor %}
+ }
+
+ RefPtr<{{cpp_class_name}}> event = {{cpp_class_name}}::create(type, eventInit);
+{% if number_of_any_attributes %}
+{# If we're in an isolated world, create a SerializedScriptValue and store it in the event for
+ # later cloning if the property is accessed from another world.
+ # The main world case is handled lazily (in Custom code). #}
+ if (isolatedWorldForIsolate(args.GetIsolate())) {
+{% for attribute in attributes %}
+{% if attribute.type == 'any' %}
+ if (!{{attribute.name}}.IsEmpty())
+ event->{{attribute.setter}}(SerializedScriptValue::createAndSwallowExceptions({{attribute.name}}, args.GetIsolate()));
+{% endif %}
+{% endfor %}
+ }
+
+{% endif %}
+ v8::Handle<v8::Object> wrapper = args.Holder();
+ V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(event.release(), &{{v8_class_name}}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
+ v8SetReturnValue(args, wrapper);
+}{% endmacro %}
+
+
+{##############################################################################}
+{% macro more_constructor_stuff() %}
+{# FIXME: check name #}
+{% if has_named_constructor %}
+{## working #}
+WrapperTypeInfo {{v8_class_name}}Constructor::info = { {{v8_class_name}}Constructor::GetTemplate, {{v8_class_name}}::derefObject, {{to_active_dom_object}}, {{to_event_target}}, 0, {{v8_class_name}}::installPerContextPrototypeProperties, 0, WrapperTypeObjectPrototype };
+
+static void {{v8_class_name}}ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+{{feature_observation(measure_as) -}}
+{{deprecation_notification(deprecate_as)}} if (!args.IsConstructCall()) {
+ throwTypeError("DOM object constructor cannot be called as a function.", args.GetIsolate());
+ return;
+ }
+
+ if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) {
+ args.GetReturnValue().Set(args.Holder());
+ return;
+ }
+
+ Document* document = currentDocument();
+
+ // Make sure the document is added to the DOM Node map. Otherwise, the {{cpp_class_name}} instance
+ // may end up being the only node in the map and get garbage-collected prematurely.
+ toV8(document, args.Holder(), args.GetIsolate());
+
+{{parameters_check(named_constructor)}}
+{% if constructor_raises_exception %}
+ ExceptionCode ec = 0;
+{% endif %}
+ RefPtr<{{cpp_class_name}}> impl = {{cpp_class_name}}::createForJSConstructor({{named_constructor.argument_string}});
+ v8::Handle<v8::Object> wrapper = args.Holder();
+{% if constructor_raises_exception %}
+ if (ec) {
+ setDOMException(ec, args.GetIsolate());
+ return;
+ }
+{% endif %}
+
+ V8DOMWrapper::associateObjectWithWrapper<{{v8_class_name}}>(impl.release(), &{{v8_class_name}}Constructor::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
+ args.GetReturnValue().Set(wrapper);
+}
+
+v8::Handle<v8::FunctionTemplate> {{v8_class_name}}Constructor::GetTemplate(v8::Isolate* isolate, WrapperWorldType currentWorldType)
+{
+ // This is only for getting a unique pointer which we can pass to privateTemplate.
+ static const char* privateTemplateUniqueKey = "{{v8_class_name}}Constructor::GetTemplatePrivateTemplate";
+ V8PerIsolateData* data = V8PerIsolateData::from(isolate);
+ v8::Handle<v8::FunctionTemplate> result = data->privateTemplateIfExists(currentWorldType, &privateTemplateUniqueKey);
+ if (!result.IsEmpty())
+ return result;
+
+ TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate");
+ v8::HandleScope scope(isolate);
+ result = v8::FunctionTemplate::New({{v8_class_name}}ConstructorCallback);
+
+ v8::Local<v8::ObjectTemplate> instance = result->InstanceTemplate();
+ instance->SetInternalFieldCount({{v8_class_name}}::internalFieldCount);
+ result->SetClassName(v8::String::NewSymbol("{{cpp_class_name}}"));
+ result->Inherit({{v8_class_name}}::GetTemplate(isolate, currentWorldType));
+ data->setPrivateTemplate(currentWorldType, &privateTemplateUniqueKey, result);
+
+ return scope.Close(result);
+}
+
+{% endif %}
+{% endmacro %}
+
+
+{##############################################################################}
+{% macro constructor_callback() %}
+void {{v8_class_name}}::constructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+ TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "DOMConstructor");{{feature_observation(measure_as)}}{{deprecation_notification(deprecate_as)}}
+ if (!args.IsConstructCall()) {
+ throwTypeError("DOM object constructor cannot be called as a function.", args.GetIsolate());
+ return;
+ }
+
+ if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) {
+ args.GetReturnValue().Set(args.Holder());
+ return;
+ }
+
+{% if has_custom_constructor %}
+ {{v8_class_name}}::constructorCustom(args);
+{% else %}
+ {{cpp_class_name}}V8Internal::constructor(args);
+{% endif %}
+}
+{% endmacro %}
« no previous file with comments | « Source/bindings/templates/constants.cpp ('k') | Source/bindings/templates/interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698