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

Unified Diff: Source/bindings/scripts/CodeGeneratorV8.pm

Issue 15899009: Support indexed setter generation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 7 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
Index: Source/bindings/scripts/CodeGeneratorV8.pm
diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm
index b954532afc63d47fdb988ea5edbaacf48f004cd7..6e746fb94c629c9454366cff8e691e952374b96c 100644
--- a/Source/bindings/scripts/CodeGeneratorV8.pm
+++ b/Source/bindings/scripts/CodeGeneratorV8.pm
@@ -3082,9 +3082,11 @@ sub GenerateImplementationIndexedPropertyAccessors
GenerateImplementationIndexedPropertyGetter($interface, $indexedGetterFunction);
}
- # FIXME: Support generated indexed setter bindings.
my $indexedSetterFunction = GetIndexedSetterFunction($interface);
my $hasCustomIndexedSetter = $indexedSetterFunction ? $indexedSetterFunction->signature->extendedAttributes->{"Custom"} : 0;
+ if ($indexedSetterFunction && !$hasCustomIndexedSetter) {
+ GenerateImplementationIndexedPropertySetter($interface, $indexedSetterFunction);
+ }
# FIXME: Support generated named deleter bindings.
my $indexedDeleterFunction = GetIndexedDeleterFunction($interface);
@@ -3170,6 +3172,52 @@ sub GenerateImplementationIndexedPropertyGetter
$implementation{nameSpaceWebCore}->add($getterCode);
}
+sub GenerateImplementationIndexedPropertySetter
+{
+ my $interface = shift;
+ my $indexedSetterFunction = shift;
+ my $implClassName = GetImplName($interface);
+ my $v8ClassName = GetV8ClassName($interface);
+ my $methodName = GetImplName($indexedSetterFunction->signature);
+
+ AddToImplIncludes("bindings/v8/V8Collection.h");
+ my $type = $indexedSetterFunction->parameters->[1]->type;
+ my $returnType = $indexedSetterFunction->signature->type;
+ my $nativeType = GetNativeType($returnType);
+ my $nativeValue = JSValueToNative($type, $indexedSetterFunction->signature->extendedAttributes, "value", "info.GetIsolate()");
+ my $raisesExceptions = $indexedSetterFunction->signature->extendedAttributes->{"RaisesException"};
+ my $code = "v8::Handle<v8::Value> ${v8ClassName}::indexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\n";
+ $code .= "{\n";
+ $code .= " ${implClassName}* collection = toNative(info.Holder());\n";
+ my $extraArguments = "";
+ if ($raisesExceptions) {
+ $code .= " ExceptionCode ec = 0;\n";
+ $extraArguments = ", ec";
+ }
+ if ($type eq "DOMString") {
kojih 2013/05/28 06:51:28 I'd like to remove this branch by modifying JSValu
+ my $nullCheck = "";
+ my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttributes->{"TreatNullAs"};
+ if ($treatNullAs && $treatNullAs eq "NullString") {
+ $nullCheck = "WithNullCheck";
+ }
+ $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullCheck}>, propertyValue, value);\n";
+ } else {
+ $code .= " $nativeType propertyValue = $nativeValue;\n";
+ }
+ my $passNativeValue = "propertyValue";
+ $passNativeValue .= ".release()" if (IsRefPtrType($type));
+ $code .= " bool result = collection->${methodName}(index, $passNativeValue, value->IsNull(), value->IsUndefined()$extraArguments);\n";
+ $code .= " if (!result)\n";
+ $code .= " return v8Undefined();\n";
+ if ($raisesExceptions) {
+ $code .= " if (ec)\n";
+ $code .= " return setDOMException(ec, info.GetIsolate());\n";
+ }
+ $code .= " return value;\n";
+ $code .= "}\n\n";
+ $implementation{nameSpaceWebCore}->add($code);
+}
+
sub GenerateImplementationNamedPropertyAccessors
{
my $interface = shift;
@@ -3355,7 +3403,7 @@ sub GenerateImplementationNamedPropertySetter
} else {
$code .= " $nativeType propertyValue = $nativeValue;\n";
}
- $code .= " bool result = collection->${methodName}(propertyName, propertyValue$extraArguments);\n";
+ $code .= " bool result = collection->${methodName}(propertyName, propertyValue, value->IsNull(), value->IsUndefined()$extraArguments);\n";
$code .= " if (!result)\n";
$code .= " return v8Undefined();\n";
if ($raisesExceptions) {

Powered by Google App Engine
This is Rietveld 408576698