Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index 19e2416949dafbbad4620b7c1c7d16cb3c108441..3ba255f9cb982f679e662f5f10713acbaa198d61 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -1603,7 +1603,7 @@ END |
| return value; |
| END |
| } else { |
| - $code .= " return " . NativeToJSValue($attribute->signature, $expression, "info.Holder()", "info.GetIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix).";\n"; |
| + $code .= NativeToJSValue($attribute->signature->type, $attribute->signature->extendedAttributes, $expression, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix) . "\n"; |
| } |
| $code .= "}\n\n"; # end of getter |
| @@ -3113,6 +3113,17 @@ END |
| return $code; |
| } |
| +sub GetIsNullExpression |
| +{ |
| + my $type = shift; |
| + my $variableName = shift; |
| + if (IsRefPtrType($type)) { |
| + return "!${variableName}"; |
| + } else { |
| + return "${variableName}.isNull()"; |
| + } |
| +} |
| + |
| sub GenerateImplementationIndexedProperty |
| { |
| my $interface = shift; |
| @@ -3160,21 +3171,14 @@ sub GenerateImplementationIndexedProperty |
| if ($indexedGetterfunction && !$hasCustomIndexedGetter) { |
| my $returnType = $indexedGetterfunction->signature->type; |
| + my $nativeType = GetNativeType($returnType); |
| my $methodName = $indexedGetterfunction->signature->name; |
| $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{"ImplementedAs"}; |
| AddToImplIncludes("bindings/v8/V8Collection.h"); |
| - my $jsValue = ""; |
| - my $nativeType = GetNativeType($returnType); |
| - my $isNull = ""; |
| - |
| - if (IsRefPtrType($returnType)) { |
| - AddToImplIncludes("V8$returnType.h"); |
| - $isNull = "!element"; |
| - $jsValue = NativeToJSValue($indexedGetterfunction->signature, "element.release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
| - } else { |
| - $isNull = "element.isNull()"; |
| - $jsValue = NativeToJSValue($indexedGetterfunction->signature, "element", "info.Holder()", "info.GetIsolate()"); |
| - } |
| + my $nativeExpression = "element"; |
|
haraken
2013/05/16 05:38:05
Nit: $nativeExpression => $nativeValue
|
| + $nativeExpression .= ".release()" if (IsRefPtrType($returnType)); |
| + my $isNull = GetIsNullExpression($returnType, "element"); |
| + my $returnJSValueCode = NativeToJSValue($indexedGetterfunction->signature->type, $indexedGetterfunction->signature->extendedAttributes, $nativeExpression, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
|
haraken
2013/05/16 05:38:05
Nit: You can omit the last two ""s.
|
| $implementation{nameSpaceWebCore}->add(<<END); |
| v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info) |
| @@ -3182,9 +3186,9 @@ v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons |
| ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
| ${implClassName}* collection = toNative(info.Holder()); |
| $nativeType element = collection->$methodName(index); |
| - if ($isNull) |
| + if (${isNull}) |
| return v8Undefined(); |
| - return $jsValue; |
| +${returnJSValueCode} |
| } |
| END |
| @@ -3205,25 +3209,18 @@ sub GenerateImplementationNamedPropertyGetter |
| my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGetter"}; |
| if ($namedGetterFunction && !$hasCustomNamedGetter) { |
| + $subCode .= <<END; |
| + desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPropertyGetter, 0, 0, 0, 0); |
| +END |
| my $returnType = $namedGetterFunction->signature->type; |
| + my $nativeType = GetNativeType($namedGetterFunction->signature->type); |
| my $methodName = $namedGetterFunction->signature->name; |
| $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"ImplementedAs"}; |
| AddToImplIncludes("bindings/v8/V8Collection.h"); |
| - $subCode .= <<END; |
| - desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPropertyGetter, 0, 0, 0, 0); |
| -END |
| - my $jsValue = ""; |
| - my $nativeType = GetNativeType($returnType); |
| - my $isNull = ""; |
| - |
| - if (IsRefPtrType($returnType)) { |
| - AddToImplIncludes("V8$returnType.h"); |
| - $isNull = "!element"; |
| - $jsValue = NativeToJSValue($namedGetterFunction->signature, "element.release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
| - } else { |
| - $isNull = "element.isNull()"; |
| - $jsValue = NativeToJSValue($namedGetterFunction->signature, "element", "info.Holder()", "info.GetIsolate()"); |
| - } |
| + my $nativeExpression = "element"; |
|
haraken
2013/05/16 05:38:05
Nit: $nativeExpression => $nativeValue
|
| + $nativeExpression .= ".release()" if (IsRefPtrType($returnType)); |
| + my $isNull = GetIsNullExpression($returnType, "element"); |
| + my $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature->type, $namedGetterFunction->signature->extendedAttributes, $nativeExpression, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
|
haraken
2013/05/16 05:38:05
Nit: You can omit the ""s.
|
| $implementation{nameSpaceWebCore}->add(<<END); |
| v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) |
| @@ -3239,7 +3236,7 @@ v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> |
| ${nativeType} element = collection->${methodName}(propertyName); |
| if (${isNull}) |
| return v8Undefined(); |
| - return ${jsValue}; |
| +${returnJSValueCode} |
| } |
| END |
| @@ -4119,7 +4116,7 @@ END |
| @args = (); |
| foreach my $param (@params) { |
| my $paramName = $param->name; |
| - $code .= " v8::Handle<v8::Value> ${paramName}Handle = " . NativeToJSValue($param, $paramName, "v8::Handle<v8::Object>()", "v8Context->GetIsolate()", "") . ";\n"; |
| + $code .= NativeToJSValue($param->type, $param->extendedAttributes, $paramName, " ", "v8::Handle<v8::Value> ${paramName}Handle =", "v8::Handle<v8::Object>()", "v8Context->GetIsolate()", "") . "\n"; |
| $code .= " if (${paramName}Handle.IsEmpty()) {\n"; |
| $code .= " if (!isScriptControllerTerminating())\n"; |
| $code .= " CRASH();\n"; |
| @@ -4377,12 +4374,12 @@ sub GenerateFunctionCallString |
| my $nativeValue; |
| # FIXME: Update for all ScriptWrappables. |
| if (IsDOMNodeType($interfaceName)) { |
| - $nativeValue = NativeToJSValue($function->signature, $return, "args.Holder()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix); |
| + $nativeValue = NativeToJSValue($function->signature->type, $function->signature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix); |
| } else { |
| - $nativeValue = NativeToJSValue($function->signature, $return, "args.Holder()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); |
| + $nativeValue = NativeToJSValue($function->signature->type, $function->signature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); |
| } |
| - $code .= $indent . "return " . $nativeValue . ";\n"; |
| + $code .= $nativeValue . "\n"; |
| return $code; |
| } |
| @@ -4454,6 +4451,12 @@ sub GetNativeType |
| return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; |
| return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; |
| + if (IsUnionType($type)) { |
| + my $types = $type->unionMemberTypes; |
| + die "Currently only 2 values of non-union type is supported as union type.\n" unless scalar(@$types)==2; |
|
haraken
2013/05/16 05:38:05
Nit: Spaces are needed around ==.
You can add thi
|
| + return "WTF::UnionType2<" . (join ", ", @$types) . ">"; |
| + } |
| + |
| # We need to check [ImplementedBy] extended attribute for wrapper types. |
| if (IsWrapperType($type)) { |
| my $interface = ParseInterface($type); |
| @@ -4686,6 +4689,12 @@ my %non_wrapper_types = ( |
| 'void' => 1 |
| ); |
| +sub IsUnionType |
| +{ |
| + my $type = shift; # string or UnionType |
| + return 1 if ref($type) eq "UnionType"; |
| + return 0; |
| +} |
| sub IsWrapperType |
| { |
| @@ -4762,8 +4771,11 @@ sub IsDOMNodeType |
| sub NativeToJSValue |
| { |
| - my $signature = shift; |
| - my $value = shift; |
| + my $type = shift; |
| + my $extendedAttributes = shift; |
| + my $nativeValue = shift; |
| + my $indent = shift; # added before every line |
| + my $receiver = shift; # "return" or "<variableName> =" |
| my $getCreationContext = shift; |
| my $getIsolate = shift; |
| die "An Isolate is mandatory for native value => JS value conversion." unless $getIsolate; |
| @@ -4775,40 +4787,56 @@ sub NativeToJSValue |
| my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; |
| my $forMainWorldSuffix = shift; |
| - my $type = $signature->type; |
| + if (IsUnionType($type)) { |
| + my $types = $type->unionMemberTypes; |
| + die "Currently only 2 values of non-union type is supported as union type.\n" unless scalar(@$types)==2; |
|
haraken
2013/05/16 05:38:05
You can move the check to IsUnionType().
|
| + my $code = ""; |
| + for my $i (0 .. scalar(@$types)-1) { |
| + my $unionMemberType = $types->[$i]; |
| + my $memberNumber = $i + 1; |
| + my $returnJSValueCode = NativeToJSValue($unionMemberType, $extendedAttributes, "${nativeValue}.member${memberNumber}()", $indent . " ", $receiver, $getCreationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHandleType, $forMainWorldSuffix); |
| + $code .= <<END; |
| +${indent}if (${nativeValue}.member${memberNumber}()) |
| +${returnJSValueCode} |
| +END |
| + } |
| + $code .= $indent . "ASSERT_NOT_REACHED();\n"; |
| + $code .= $indent . "return v8Undefined();"; |
| + return $code; |
| + } |
| - return "v8Boolean($value, $getIsolate)" if $type eq "boolean"; |
| - return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined() |
| + return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; |
| + return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalent to v8Undefined() |
| # HTML5 says that unsigned reflected attributes should be in the range |
| # [0, 2^31). When a value isn't in this range, a default value (or 0) |
| # should be returned instead. |
| - if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) { |
| - $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; |
| - return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)"; |
| + if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) { |
| + $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; |
| + return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);"; |
| } |
| # For all the types where we use 'int' as the representation type, |
| # we use v8Integer() which has a fast small integer conversion check. |
| my $nativeType = GetNativeType($type); |
| - return "v8Integer($value, $getIsolate)" if $nativeType eq "int"; |
| - return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned"; |
| + return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeType eq "int"; |
| + return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $nativeType eq "unsigned"; |
| - return "v8DateOrNull($value, $getIsolate)" if $type eq "Date"; |
| + return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date"; |
| # long long and unsigned long long are not representable in ECMAScript. |
| - return "v8::Number::New(static_cast<double>($value))" if $type eq "long long" or $type eq "unsigned long long" or $type eq "DOMTimeStamp"; |
| - return "v8::Number::New($value)" if IsPrimitiveType($type); |
| - return "$value.v8Value()" if $nativeType eq "ScriptValue"; |
| + return "$indent$receiver v8::Number::New(static_cast<double>($nativeValue));" if $type eq "long long" or $type eq "unsigned long long" or $type eq "DOMTimeStamp"; |
| + return "$indent$receiver v8::Number::New($nativeValue);" if IsPrimitiveType($type); |
| + return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptValue"; |
| if ($type eq "DOMString" or IsEnumType($type)) { |
| - my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"}; |
| + my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"}; |
| if (defined $conv) { |
| - return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null"; |
| - return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Undefined"; |
| + return "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$returnHandleTypeArg);" if $conv eq "Null"; |
| + return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsolate$returnHandleTypeArg);" if $conv eq "Undefined"; |
| die "Unknown value for TreatReturnedNullStringAs extended attribute"; |
| } |
| - return "v8String($value, $getIsolate$returnHandleTypeArg)"; |
| + return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandleTypeArg);"; |
| } |
| my $arrayType = GetArrayType($type); |
| @@ -4819,26 +4847,26 @@ sub NativeToJSValue |
| if (IsRefPtrType($arrayOrSequenceType)) { |
| AddIncludesForType($arrayOrSequenceType); |
| } |
| - return "v8Array($value, $getIsolate)"; |
| + return "$indent$receiver v8Array($nativeValue, $getIsolate);"; |
| } |
| AddIncludesForType($type); |
| if (IsDOMNodeType($type) || $type eq "EventTarget") { |
| if ($getScriptWrappable) { |
| - return "toV8Fast${forMainWorldSuffix}($value$getHolderContainerArg$getScriptWrappableArg)"; |
| + return "$indent$receiver toV8Fast${forMainWorldSuffix}($nativeValue$getHolderContainerArg$getScriptWrappableArg);"; |
| } |
| - return "toV8($value, $getCreationContext, $getIsolate)"; |
| + return "$indent$receiver toV8($nativeValue, $getCreationContext, $getIsolate);"; |
| } |
| if ($type eq "EventListener") { |
| AddToImplIncludes("bindings/v8/V8AbstractEventListener.h"); |
| - return "${value} ? v8::Handle<v8::Value>(static_cast<V8AbstractEventListener*>(${value})->getListenerObject(imp->scriptExecutionContext())) : v8::Handle<v8::Value>(v8Null($getIsolate))"; |
| + return "$indent$receiver $nativeValue ? v8::Handle<v8::Value>(static_cast<V8AbstractEventListener*>(${nativeValue})->getListenerObject(imp->scriptExecutionContext())) : v8::Handle<v8::Value>(v8Null($getIsolate));"; |
| } |
| if ($type eq "SerializedScriptValue") { |
| AddToImplIncludes("$type.h"); |
| - return "$value ? $value->deserialize() : v8::Handle<v8::Value>(v8Null($getIsolate))"; |
| + return "$indent$receiver $nativeValue ? $nativeValue->deserialize() : v8::Handle<v8::Value>(v8Null($getIsolate));"; |
| } |
| AddToImplIncludes("wtf/RefCounted.h"); |
| @@ -4846,9 +4874,9 @@ sub NativeToJSValue |
| AddToImplIncludes("wtf/GetPtr.h"); |
| if ($getScriptWrappable) { |
| - return "toV8Fast$forMainWorldSuffix($value$getHolderContainerArg$getScriptWrappableArg)"; |
| + return "$indent$receiver toV8Fast$forMainWorldSuffix($nativeValue$getHolderContainerArg$getScriptWrappableArg);"; |
| } |
| - return "toV8($value, $getCreationContext, $getIsolate)"; |
| + return "$indent$receiver toV8($nativeValue, $getCreationContext, $getIsolate);"; |
| } |
| sub WriteData |
| @@ -5120,6 +5148,7 @@ sub IsRefPtrType |
| return 0 if GetSequenceType($type); |
| return 0 if $type eq "DOMString"; |
| return 0 if IsEnumType($type); |
| + return 0 if IsUnionType($type); |
| return 1; |
| } |