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

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: update 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
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/bindings/scripts/IDLParser.pm » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/bindings/scripts/IDLParser.pm » ('J')

Powered by Google App Engine
This is Rietveld 408576698