Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index 1d74697f1387891dcfa95fecb9a92e8e558e76e1..f14ff99ca3dc3b0dff9a348ab57b7359fb8ed86a 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -3170,6 +3170,31 @@ sub GenerateIsNullExpression |
| } |
| } |
| +sub GenerateIfElseStatement |
| +{ |
| + my $type = shift; |
| + my $outputVariableName = shift; |
| + my $conditions = shift; |
| + my $statements = shift; |
| + |
| + my $code = ""; |
| + if (@$conditions == 1) { |
| + $code .= " ${type} ${outputVariableName} = " . $statements->[0] . "\n"; |
| + } else { |
| + $code .= " ${type} ${outputVariableName};\n"; |
| + for my $i (0 .. @$conditions-1) { |
|
haraken
2013/05/29 08:51:05
Nit: Spaced needed around '-'.
|
| + my $token = "else if"; |
| + $token = "if" if $i == 0; |
| + $token = "else" if $i == @$conditions-1; |
|
haraken
2013/05/29 08:51:05
Ditto.
|
| + $code .= " ${token}"; |
| + $code .= " (" . $conditions->[$i] . ")" if $conditions->[$i]; |
| + $code .= "\n"; |
| + $code .= " ${outputVariableName} = " . $statements->[$i] . "\n"; |
| + } |
| + } |
| + return $code; |
| +} |
| + |
| sub GenerateImplementationIndexedPropertyAccessors |
| { |
| my $interface = shift; |
| @@ -3183,9 +3208,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); |
| + } |
| my $indexedDeleterFunction = GetIndexedDeleterFunction($interface); |
| my $hasCustomIndexedDeleter = $indexedDeleterFunction ? $indexedDeleterFunction->signature->extendedAttributes->{"Custom"} : 0; |
| @@ -3273,6 +3300,57 @@ 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 $raisesExceptions = $indexedSetterFunction->signature->extendedAttributes->{"RaisesException"}; |
| + my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttributes->{"TreatNullAs"}; |
| + my $treatUndefinedAs = $indexedSetterFunction->parameters->[1]->extendedAttributes->{"TreatUndefinedAs"}; |
| + 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"; |
| + $code .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($indexedSetterFunction, 1, "value", "propertyValue", "info.GetIsolate()"); |
| + |
| + my $extraArguments = ""; |
| + if ($raisesExceptions) { |
| + $code .= " ExceptionCode ec = 0;\n"; |
| + $extraArguments = ", ec"; |
| + } |
| + my $passNativeValue = "propertyValue"; |
| + $passNativeValue .= ".release()" if (IsRefPtrType($type)); |
| + |
| + my @conditions = (); |
| + my @statements = (); |
| + if ($treatNullAs && $treatNullAs ne "NullString") { |
| + push @conditions, "value->IsNull()"; |
| + push @statements, "collection->${treatNullAs}(index$extraArguments);"; |
| + } |
| + if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { |
| + push @conditions, "value->IsUndefined()"; |
| + push @statements, "collection->${treatUndefinedAs}(index$extraArguments);"; |
| + } |
| + push @conditions, ""; |
| + push @statements, "collection->${methodName}(index, $passNativeValue$extraArguments);"; |
| + $code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statements); |
| + |
| + $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; |
| @@ -3419,6 +3497,39 @@ sub GenerateImplementationNamedPropertyGetter |
| $implementation{nameSpaceWebCore}->add($code); |
| } |
| +# Example: |
| +# GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($function, 0, "name", "propertyName", "info.GetIsolate()") |
| +# return |
| +# "V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<>, propertyName, name);" |
|
haraken
2013/05/29 08:51:05
Nit: I don't think this comment is needed. (If you
|
| +sub GenerateNativeVariableDefinitionCorrespondingToJSValueParameter |
|
kojih
2013/05/29 08:40:54
I think I can simplify some more code using this i
haraken
2013/05/29 08:51:05
Yes, let's do it.
BTW, the method name is too lon
|
| +{ |
| + my $function = shift; # domFunction |
|
haraken
2013/05/29 08:51:05
Nit: Remove the comment.
|
| + my $parameterIndex = shift; |
|
haraken
2013/05/29 08:51:05
You can pass $parameter instead of index.
|
| + my $jsValue = shift; |
| + my $nativeValueName = shift; |
| + my $getIsolate = shift; |
| + |
| + my $parameter = $function->parameters->[$parameterIndex]; |
| + my $treatNullAs = $parameter->extendedAttributes->{"TreatNullAs"} || ""; |
| + my $treatUndefinedAs = $parameter->extendedAttributes->{"TreatUndefinedAs"} || ""; |
| + my $code = ""; |
| + my $nativeType = GetNativeType($parameter->type); |
| + my $nativeValue = JSValueToNative($parameter->type, $function->signature->extendedAttributes, $jsValue, $getIsolate); |
| + if ($parameter->type eq "DOMString") { |
| + my $nullCheck = ""; |
| + if ($treatNullAs eq "NullString") { |
| + $nullCheck = "WithUndefinedOrNullCheck"; |
| + if ($treatUndefinedAs eq "NullString") { |
| + $nullCheck = "WithNullCheck"; |
| + } |
| + } |
| + $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullCheck}>, ${nativeValueName}, ${jsValue});\n"; |
| + } else { |
| + $code .= " ${nativeType} ${nativeValueName} = ${nativeValue};\n"; |
| + } |
| + return $code; |
| +} |
| + |
| sub GenerateImplementationNamedPropertySetter |
| { |
| my $interface = shift; |
| @@ -3428,10 +3539,9 @@ sub GenerateImplementationNamedPropertySetter |
| my $methodName = GetImplName($namedSetterFunction->signature); |
| AddToImplIncludes("bindings/v8/V8Collection.h"); |
| - my $type = $namedSetterFunction->parameters->[1]->type; |
| - my $nativeType = GetNativeType($type); |
| my $raisesExceptions = $namedSetterFunction->signature->extendedAttributes->{"RaisesException"}; |
| - my $nativeValue = JSValueToNative($type, $namedSetterFunction->signature->extendedAttributes, "value", "info.GetIsolate()"); |
| + my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttributes->{"TreatNullAs"}; |
| + my $treatUndefinedAs = $namedSetterFunction->parameters->[1]->extendedAttributes->{"TreatUndefinedAs"}; |
| my $code = "v8::Handle<v8::Value> ${v8ClassName}::namedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\n"; |
| $code .= "{\n"; |
| @@ -3442,23 +3552,28 @@ sub GenerateImplementationNamedPropertySetter |
| $code .= " return v8Undefined();\n"; |
| } |
| $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; |
| - $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<>, propertyName, name);\n"; |
| + $code .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($namedSetterFunction, 0, "name", "propertyName", "info.GetIsolate()"); |
| + $code .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($namedSetterFunction, 1, "value", "propertyValue", "info.GetIsolate()"); |
| my $extraArguments = ""; |
| if ($raisesExceptions) { |
| $code .= " ExceptionCode ec = 0;\n"; |
| $extraArguments = ", ec"; |
| } |
| - if ($type eq "DOMString") { |
| - my $nullCheck = ""; |
| - my $treatNullAs = $namedSetterFunction->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 @conditions = (); |
| + my @statements = (); |
| + if ($treatNullAs && $treatNullAs ne "NullString") { |
| + push @conditions, "value->IsNull()"; |
| + push @statements, "collection->${treatNullAs}(propertyName$extraArguments);"; |
| + } |
| + if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { |
| + push @conditions, "value->IsUndefined()"; |
| + push @statements, "collection->${treatUndefinedAs}(propertyName$extraArguments);"; |
| } |
| - $code .= " bool result = collection->${methodName}(propertyName, propertyValue$extraArguments);\n"; |
| + push @conditions, ""; |
| + push @statements, "collection->${methodName}(propertyName, propertyValue$extraArguments);"; |
| + $code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statements); |
| + |
| $code .= " if (!result)\n"; |
| $code .= " return v8Undefined();\n"; |
| if ($raisesExceptions) { |