Title: [142730] trunk/Source/WebCore
Revision
142730
Author
[email protected]
Date
2013-02-13 01:43:48 -0800 (Wed, 13 Feb 2013)

Log Message

[V8] Generate wrapper methods for custom getters/setters
https://bugs.webkit.org/show_bug.cgi?id=109666

Reviewed by Adam Barth.

Currently V8 directly calls back custom getters/setters written
in custom binding files. This makes it impossible for code generators
to hook custom getters/setters (e.g. Code generators cannot insert a code
for FeatureObservation into custom getters/setters). We should generate
wrapper methods for custom getters/setters.

In the future, I will insert TRACE_EVENT() macros into these wrapper methods
to profile DOM getters/setters/methods.

* bindings/scripts/CodeGeneratorV8.pm:
(GenerateNormalAttrGetter):
(GenerateNormalAttrSetter):
(GenerateSingleBatchedAttribute):
(GenerateImplementation):
* bindings/scripts/test/V8/V8TestInterface.cpp:
(WebCore::TestInterfaceV8Internal::supplementalStr3AttrGetter):
(TestInterfaceV8Internal):
(WebCore::TestInterfaceV8Internal::supplementalStr3AttrSetter):
(WebCore):
* bindings/scripts/test/V8/V8TestObj.cpp:
(WebCore::TestObjV8Internal::customAttrAttrGetter):
(TestObjV8Internal):
(WebCore::TestObjV8Internal::customAttrAttrSetter):
(WebCore):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (142729 => 142730)


--- trunk/Source/WebCore/ChangeLog	2013-02-13 09:27:14 UTC (rev 142729)
+++ trunk/Source/WebCore/ChangeLog	2013-02-13 09:43:48 UTC (rev 142730)
@@ -1,3 +1,35 @@
+2013-02-12  Kentaro Hara  <[email protected]>
+
+        [V8] Generate wrapper methods for custom getters/setters
+        https://bugs.webkit.org/show_bug.cgi?id=109666
+
+        Reviewed by Adam Barth.
+
+        Currently V8 directly calls back custom getters/setters written
+        in custom binding files. This makes it impossible for code generators
+        to hook custom getters/setters (e.g. Code generators cannot insert a code
+        for FeatureObservation into custom getters/setters). We should generate
+        wrapper methods for custom getters/setters.
+
+        In the future, I will insert TRACE_EVENT() macros into these wrapper methods
+        to profile DOM getters/setters/methods.
+
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateNormalAttrGetter):
+        (GenerateNormalAttrSetter):
+        (GenerateSingleBatchedAttribute):
+        (GenerateImplementation):
+        * bindings/scripts/test/V8/V8TestInterface.cpp:
+        (WebCore::TestInterfaceV8Internal::supplementalStr3AttrGetter):
+        (TestInterfaceV8Internal):
+        (WebCore::TestInterfaceV8Internal::supplementalStr3AttrSetter):
+        (WebCore):
+        * bindings/scripts/test/V8/V8TestObj.cpp:
+        (WebCore::TestObjV8Internal::customAttrAttrGetter):
+        (TestObjV8Internal):
+        (WebCore::TestObjV8Internal::customAttrAttrSetter):
+        (WebCore):
+
 2013-02-13  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r142611.

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (142729 => 142730)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2013-02-13 09:27:14 UTC (rev 142729)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm	2013-02-13 09:43:48 UTC (rev 142730)
@@ -898,6 +898,16 @@
 END
     push(@implContentDecls, GenerateFeatureObservation($attrExt->{"V8MeasureAs"}));
 
+    if (HasCustomGetter($attrExt)) {
+        push(@implContentDecls, <<END);
+        return ${v8InterfaceName}::${attrName}AccessorGetter(name, info);
+}
+
+END
+        push(@implContentDecls, "#endif // ${conditionalString}\n\n") if $conditionalString;
+        return;
+    }
+
     if ($svgNativeType) {
         my $svgWrappedNativeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($interfaceName);
         if ($svgWrappedNativeType =~ /List/) {
@@ -1174,6 +1184,16 @@
     push(@implContentDecls, "static void ${attrName}AttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\n{\n");
     push(@implContentDecls, GenerateFeatureObservation($attribute->signature->extendedAttributes->{"V8MeasureAs"}));
 
+    if (HasCustomSetter($attrExt)) {
+        push(@implContentDecls, <<END);
+        ${v8InterfaceName}::${attrName}AccessorSetter(name, value, info);
+}
+
+END
+        push(@implContentDecls, "#endif // ${conditionalString}\n\n") if $conditionalString;
+        return;
+    }
+
     # If the "StrictTypeChecking" extended attribute is present, and the attribute'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.
@@ -2307,14 +2327,6 @@
         if ($attrExt->{"Replaceable"}) {
             $setter = "${interfaceName}V8Internal::${interfaceName}ReplaceableAttrSetter";
         }
-
-        if (HasCustomSetter($attrExt)) {
-            $setter = "V8${customAccessor}AccessorSetter";
-        }
-
-        if (HasCustomGetter($attrExt)) {
-            $getter = "V8${customAccessor}AccessorGetter";
-        }
     }
 
     # Read only attributes
@@ -2712,13 +2724,11 @@
             AddToImplIncludes("SerializedScriptValue.h");
         }
 
-        if (!HasCustomGetter($attrExt)) {
-            GenerateNormalAttrGetter($attribute, $interface);
-        }
+        GenerateNormalAttrGetter($attribute, $interface);
 
         if ($attrExt->{"Replaceable"}) {
             $hasReplaceable = 1;
-        } elsif (!HasCustomSetter($attrExt) && !IsReadonly($attribute)) {
+        } elsif (!IsReadonly($attribute)) {
             GenerateNormalAttrSetter($attribute, $interface);
         }
     }

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp (142729 => 142730)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2013-02-13 09:27:14 UTC (rev 142729)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp	2013-02-13 09:43:48 UTC (rev 142730)
@@ -131,6 +131,24 @@
 
 #if ENABLE(Condition11) || ENABLE(Condition12)
 
+static v8::Handle<v8::Value> supplementalStr3AttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
+{
+        return V8TestInterface::supplementalStr3AccessorGetter(name, info);
+}
+
+#endif // ENABLE(Condition11) || ENABLE(Condition12)
+
+#if ENABLE(Condition11) || ENABLE(Condition12)
+
+static void supplementalStr3AttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
+{
+        V8TestInterface::supplementalStr3AccessorSetter(name, value, info);
+}
+
+#endif // ENABLE(Condition11) || ENABLE(Condition12)
+
+#if ENABLE(Condition11) || ENABLE(Condition12)
+
 static v8::Handle<v8::Value> supplementalNodeAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
 {
     TestInterface* imp = V8TestInterface::toNative(info.Holder());
@@ -216,7 +234,7 @@
 #endif // ENABLE(Condition11) || ENABLE(Condition12)
 #if ENABLE(Condition11) || ENABLE(Condition12)
     // Attribute 'supplementalStr3' (Type: 'attribute' ExtAttr: 'CustomSetter CustomGetter Conditional ImplementedBy')
-    {"supplementalStr3", V8TestInterface::supplementalStr3AccessorGetter, V8TestInterface::supplementalStr3AccessorSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
+    {"supplementalStr3", TestInterfaceV8Internal::supplementalStr3AttrGetter, TestInterfaceV8Internal::supplementalStr3AttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
 #endif // ENABLE(Condition11) || ENABLE(Condition12)
 #if ENABLE(Condition11) || ENABLE(Condition12)
     // Attribute 'supplementalNode' (Type: 'attribute' ExtAttr: 'Conditional ImplementedBy')

Modified: trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp (142729 => 142730)


--- trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2013-02-13 09:27:14 UTC (rev 142729)
+++ trunk/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp	2013-02-13 09:43:48 UTC (rev 142730)
@@ -500,6 +500,16 @@
     return;
 }
 
+static v8::Handle<v8::Value> customAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
+{
+        return V8TestObj::customAttrAccessorGetter(name, info);
+}
+
+static void customAttrAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
+{
+        V8TestObj::customAttrAccessorSetter(name, value, info);
+}
+
 static v8::Handle<v8::Value> withScriptStateAttributeAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
 {
     TestObj* imp = V8TestObj::toNative(info.Holder());
@@ -1917,7 +1927,7 @@
     // Attribute 'stringAttrWithSetterException' (Type: 'attribute' ExtAttr: '')
     {"stringAttrWithSetterException", TestObjV8Internal::stringAttrWithSetterExceptionAttrGetter, TestObjV8Internal::stringAttrWithSetterExceptionAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     // Attribute 'customAttr' (Type: 'attribute' ExtAttr: 'Custom')
-    {"customAttr", V8TestObj::customAttrAccessorGetter, V8TestObj::customAttrAccessorSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
+    {"customAttr", TestObjV8Internal::customAttrAttrGetter, TestObjV8Internal::customAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     // Attribute 'withScriptStateAttribute' (Type: 'attribute' ExtAttr: 'CallWith')
     {"withScriptStateAttribute", TestObjV8Internal::withScriptStateAttributeAttrGetter, TestObjV8Internal::withScriptStateAttributeAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
     // Attribute 'withScriptExecutionContextAttribute' (Type: 'attribute' ExtAttr: 'CallWith')
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to