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')