Index: Source/bindings/scripts/CodeGeneratorV8.pm |
diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
index bdcc152e675e4c9dfeec36a93ca9d13ca3bfb01d..cba0cfc0539001b732df45df07efe4980e7af015 100644 |
--- a/Source/bindings/scripts/CodeGeneratorV8.pm |
+++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
@@ -1580,7 +1580,7 @@ END |
return value; |
END |
} else { |
- $code .= NativeToJSValue($attribute->signature, $expression, " ", "return", "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 |
@@ -3060,6 +3060,49 @@ END |
return $code; |
} |
+sub GetUnionMemberVariableName |
haraken
2013/05/17 05:44:48
This method can simply return '"member" . $index'.
|
+{ |
+ my $variableName = shift; |
+ my $unionMemberIndex = shift; |
+ my $unionMemberNumber = $unionMemberIndex + 1; |
+ return sprintf("%sMember%d", $variableName, $unionMemberIndex+1); |
+} |
+ |
+sub GetIsNullExpression |
haraken
2013/05/17 05:44:48
Nit: GetIsNullExpression => GenerateIsNullExpressi
|
+{ |
+ my $type = shift; |
+ my $variableName = shift; |
+ if (IsUnionType($type)) { |
+ my $types = $type->unionMemberTypes; |
+ my @expression = (); |
+ for my $i (0 .. scalar(@$types)-1) { |
+ my $unionMemberType = $types->[$i]; |
+ my $unionMemberVariable = GetUnionMemberVariableName($variableName, $i); |
+ my $isNull = GetIsNullExpression($unionMemberType, $unionMemberVariable); |
+ push @expression, $isNull; |
+ } |
+ return join " && ", @expression; |
+ } |
+ if (IsRefPtrType($type)) { |
+ return "!${variableName}"; |
+ } else { |
+ return "${variableName}.isNull()"; |
+ } |
+} |
+ |
+sub GetIsNotNullExpression |
haraken
2013/05/17 05:44:48
I don't think we need this. We can simply use:
|
+{ |
+ my $type = shift; |
+ my $variableName = shift; |
+ my $expression = GetIsNullExpression($type, $variableName); |
+ if ($expression =~ /^!/) { |
+ $expression =~ s/^!//; |
+ } else { |
+ $expression = "!" . $expression; |
+ } |
+ return $expression; |
+} |
+ |
sub GenerateImplementationIndexedProperty |
{ |
my $interface = shift; |
@@ -3107,33 +3150,33 @@ sub GenerateImplementationIndexedProperty |
if ($indexedGetterFunction && !$hasCustomIndexedGetter) { |
my $returnType = $indexedGetterFunction->signature->type; |
+ my $nativeType = GetNativeType($returnType); |
my $methodName = GetImplName($indexedGetterFunction->signature); |
AddToImplIncludes("bindings/v8/V8Collection.h"); |
- my $returnJSValueCode = ""; |
- my $nativeType = GetNativeType($returnType); |
- my $isNull = ""; |
- |
- if (IsRefPtrType($returnType)) { |
- AddToImplIncludes("V8$returnType.h"); |
- $isNull = "!element"; |
- $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signature, "element.release()", " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
- } else { |
- $isNull = "element.isNull()"; |
- $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signature, "element", " ", "return", "info.Holder()", "info.GetIsolate()"); |
- } |
- |
- $implementation{nameSpaceWebCore}->add(<<END); |
+ my $nativeValue = "element"; |
+ $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
+ my $isNull = GetIsNullExpression($returnType, "element"); |
+ my $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signature->type, $indexedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection"); |
+ my $callMethodCode = GetCallMethodCode($returnType, "element", "collection->${methodName}", "index"); |
+ my $getterCode = <<END; |
v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, const v8::AccessorInfo& info) |
{ |
ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
${implClassName}* collection = toNative(info.Holder()); |
- $nativeType element = collection->$methodName(index); |
- if ($isNull) |
+$callMethodCode |
+ if (${isNull}) |
return v8Undefined(); |
${returnJSValueCode} |
+END |
+ if (IsUnionType($returnType)) { |
+ $getterCode .= " ASSERT_NOT_REACHED();\n"; |
+ $getterCode .= " return v8Undefined();\n"; |
+ } |
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
|
+ $getterCode .= <<END; |
} |
END |
+ $implementation{nameSpaceWebCore}->add($getterCode); |
} |
return $code; |
} |
@@ -3197,6 +3240,31 @@ sub GenerateImplementationNamedPropertyAccessors |
return $subCode; |
} |
+sub GetCallMethodCode |
haraken
2013/05/17 05:44:48
Nit: GetCallMethodCode => GenerateMethodCall
|
+{ |
+ my $returnType = shift; # string or UnionType |
+ my $returnName = shift; |
+ my $functionExpression = shift; |
+ my $firstArgument = shift; |
+ if (IsUnionType($returnType)) { |
+ my $code = ""; |
+ my @extraArguments = (); |
+ for my $i (0..scalar(@{$returnType->unionMemberTypes})-1) { |
+ my $unionMemberType = $returnType->unionMemberTypes->[$i]; |
+ my $nativeType = GetNativeType($unionMemberType); |
+ my $unionMemberVariable = GetUnionMemberVariableName($returnName, $i); |
+ $code .= " ${nativeType} ${unionMemberVariable};\n"; |
+ push @extraArguments, $unionMemberVariable; |
+ } |
+ $code .= " ${functionExpression}(${firstArgument}, " . (join ", ", @extraArguments) . ");"; |
+ return $code; |
+ } else { |
+ my $nativeType = GetNativeType($returnType); |
+ return " ${nativeType} element = ${functionExpression}(${firstArgument});" |
+ } |
+} |
+ |
+ |
sub GenerateImplementationNamedPropertyGetter |
{ |
my $interface = shift; |
@@ -3207,20 +3275,18 @@ sub GenerateImplementationNamedPropertyGetter |
AddToImplIncludes("bindings/v8/V8Collection.h"); |
my $returnType = $namedGetterFunction->signature->type; |
- my $nativeType = GetNativeType($returnType); |
- my $isNull = ""; |
- my $returnJSValueCode = ""; |
+ my $isNull = GetIsNullExpression($returnType, "element"); |
+ my $nativeValue = "element"; |
+ $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
+ my $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature->type, $namedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection"); |
+ my $callMethodCode = GetCallMethodCode($returnType, "element", "collection->${methodName}", "propertyName"); |
- if (IsRefPtrType($returnType)) { |
- AddToImplIncludes("V8$returnType.h"); |
- $isNull = "!element"; |
- $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "element.release()", " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); |
- } else { |
- $isNull = "element.isNull()"; |
- $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "element", " ", "return", "info.Holder()", "info.GetIsolate()"); |
+ my $unionTypeAssertion = ""; |
+ if (IsUnionType($returnType)) { |
+ $unionTypeAssertion .= " ASSERT_NOT_REACHED();\n"; |
+ $unionTypeAssertion .= " return v8Undefined();"; |
} |
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
|
- |
- $implementation{nameSpaceWebCore}->add(<<END); |
+ my $code = <<END; |
v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) |
{ |
if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) |
@@ -3231,13 +3297,20 @@ v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> |
ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
${implClassName}* collection = toNative(info.Holder()); |
AtomicString propertyName = toWebCoreAtomicString(name); |
- ${nativeType} element = collection->${methodName}(propertyName); |
+$callMethodCode |
if (${isNull}) |
return v8Undefined(); |
${returnJSValueCode} |
+END |
+ if (IsUnionType($returnType)) { |
+ $code .= " ASSERT_NOT_REACHED();\n"; |
+ $code .= " return v8Undefined();\n"; |
+ } |
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
|
+ $code .= <<END; |
} |
END |
+ $implementation{nameSpaceWebCore}->add($code); |
} |
sub GenerateImplementationCustomCall |
@@ -4086,7 +4159,7 @@ END |
@args = (); |
foreach my $param (@params) { |
my $paramName = $param->name; |
- $code .= NativeToJSValue($param, $paramName, " ", "v8::Handle<v8::Value> ${paramName}Handle =", "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"; |
@@ -4351,9 +4424,9 @@ sub GenerateFunctionCallString |
my $nativeValue; |
# FIXME: Update for all ScriptWrappables. |
if (IsDOMNodeType($interfaceName)) { |
- $nativeValue = NativeToJSValue($function->signature, $return, $indent, "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, $indent, "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 .= $nativeValue . "\n"; |
@@ -4428,6 +4501,10 @@ sub GetNativeType |
return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; |
return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; |
+ if (IsUnionType($type)) { |
+ return ""; |
haraken
2013/05/17 05:44:48
Is it correct to return ""? Or should this simply
|
+ } |
+ |
# We need to check [ImplementedBy] extended attribute for wrapper types. |
if (IsWrapperType($type)) { |
my $interface = ParseInterface($type); |
@@ -4650,6 +4727,15 @@ my %non_wrapper_types = ( |
'void' => 1 |
); |
+sub IsUnionType |
+{ |
+ my $type = shift; # string or UnionType |
+ if(ref($type) eq "UnionType") { |
+ die "Currently only 2 values of non-union type is supported as union type.\n" unless scalar(@{$type->unionMemberTypes}) == 2; |
haraken
2013/05/17 05:44:48
Nit: 'scalar' is not needed.
|
+ return 1; |
+ } |
+ return 0; |
+} |
sub IsWrapperType |
{ |
@@ -4726,22 +4812,40 @@ sub IsDOMNodeType |
sub NativeToJSValue |
{ |
- my $signature = 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; |
- my $getHolderContainer = shift; |
+ my $getHolderContainer = shift || ""; |
my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; |
- my $getScriptWrappable = shift; |
+ my $getScriptWrappable = shift || ""; |
my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; |
- my $returnHandleType = shift; |
+ my $returnHandleType = shift || ""; |
my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; |
- my $forMainWorldSuffix = shift; |
- |
- my $type = $signature->type; |
+ my $forMainWorldSuffix = shift || ""; |
+ |
+ if (IsUnionType($type)) { |
+ my $types = $type->unionMemberTypes; |
+ my @codes = (); |
+ for my $i (0 .. scalar(@$types)-1) { |
+ my $unionMemberType = $types->[$i]; |
+ my $unionMemberNumber = $i + 1; |
+ my $unionMemberVariable = GetUnionMemberVariableName($nativeValue, $i); |
+ my $nativeValue = $unionMemberVariable; |
+ $nativeValue .= ".release()" if (IsRefPtrType($unionMemberType)); |
+ my $returnJSValueCode = NativeToJSValue($unionMemberType, $extendedAttributes, $nativeValue, $indent . " ", $receiver, $getCreationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHandleType, $forMainWorldSuffix); |
+ my $isNotNull = GetIsNotNullExpression($unionMemberType, $unionMemberVariable); |
+ my $code = ""; |
+ $code .= "${indent}if (${isNotNull})\n"; |
+ $code .= "${returnJSValueCode}"; |
+ push @codes, $code; |
haraken
2013/05/17 05:44:48
You can put 'return v8Undefined()' at the last of
|
+ } |
+ return join "\n", @codes; |
+ } |
return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; |
return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalent to v8Undefined() |
@@ -4749,7 +4853,7 @@ sub NativeToJSValue |
# 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")) { |
+ 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);"; |
} |
@@ -4767,7 +4871,7 @@ sub NativeToJSValue |
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 "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$returnHandleTypeArg);" if $conv eq "Null"; |
return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsolate$returnHandleTypeArg);" if $conv eq "Undefined"; |
@@ -5067,6 +5171,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; |
} |