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

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

Issue 15076011: Support union return type for anonymous named/indexed getter (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 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;
}
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/bindings/tests/results/V8TestInterface.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698