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

Side by Side 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 unified diff | Download patch
OLDNEW
1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> 1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com> 2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> 3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> 4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
5 # Copyright (C) 2006 Apple Computer, Inc. 5 # Copyright (C) 2006 Apple Computer, Inc.
6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc. 6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc.
7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> 7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
8 # Copyright (C) Research In Motion Limited 2010. All rights reserved. 8 # Copyright (C) Research In Motion Limited 2010. All rights reserved.
9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 # Copyright (C) 2012 Ericsson AB. All rights reserved. 10 # Copyright (C) 2012 Ericsson AB. All rights reserved.
(...skipping 1585 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 $code .= " return toV8Fast$forMainWorldSuffix($wrappedValue, info, im p);\n"; 1596 $code .= " return toV8Fast$forMainWorldSuffix($wrappedValue, info, im p);\n";
1597 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) { 1597 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) {
1598 my $getterFunc = ToMethodName($attribute->signature->name); 1598 my $getterFunc = ToMethodName($attribute->signature->name);
1599 $code .= <<END; 1599 $code .= <<END;
1600 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}(); 1600 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}();
1601 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate())); 1601 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate()));
1602 info.Holder()->SetHiddenValue(propertyName, value); 1602 info.Holder()->SetHiddenValue(propertyName, value);
1603 return value; 1603 return value;
1604 END 1604 END
1605 } else { 1605 } else {
1606 $code .= " return " . NativeToJSValue($attribute->signature, $express ion, "info.Holder()", "info.GetIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix).";\n"; 1606 $code .= NativeToJSValue($attribute->signature->type, $attribute->signat ure->extendedAttributes, $expression, " ", "return", "info.Holder()", "info.G etIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix) . "\n";
1607 } 1607 }
1608 1608
1609 $code .= "}\n\n"; # end of getter 1609 $code .= "}\n\n"; # end of getter
1610 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString; 1610 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString;
1611 $implementation{nameSpaceInternal}->add($code); 1611 $implementation{nameSpaceInternal}->add($code);
1612 } 1612 }
1613 1613
1614 sub ShouldKeepAttributeAlive 1614 sub ShouldKeepAttributeAlive
1615 { 1615 {
1616 my ($interface, $attribute, $returnType) = @_; 1616 my ($interface, $attribute, $returnType) = @_;
(...skipping 1489 matching lines...) Expand 10 before | Expand all | Expand 10 after
3106 $code .= " } else {\n"; 3106 $code .= " } else {\n";
3107 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; 3107 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n";
3108 $code .= " }\n"; 3108 $code .= " }\n";
3109 } else { 3109 } else {
3110 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; 3110 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n";
3111 } 3111 }
3112 $code .= "#endif // ${conditionalString}\n" if $conditionalString; 3112 $code .= "#endif // ${conditionalString}\n" if $conditionalString;
3113 return $code; 3113 return $code;
3114 } 3114 }
3115 3115
3116 sub GetIsNullExpression
3117 {
3118 my $type = shift;
3119 my $variableName = shift;
3120 if (IsRefPtrType($type)) {
3121 return "!${variableName}";
3122 } else {
3123 return "${variableName}.isNull()";
3124 }
3125 }
3126
3116 sub GenerateImplementationIndexedProperty 3127 sub GenerateImplementationIndexedProperty
3117 { 3128 {
3118 my $interface = shift; 3129 my $interface = shift;
3119 my $interfaceName = $interface->name; 3130 my $interfaceName = $interface->name;
3120 my $implClassName = GetImplClassName($interface); 3131 my $implClassName = GetImplClassName($interface);
3121 my $v8ClassName = GetV8ClassName($interface); 3132 my $v8ClassName = GetV8ClassName($interface);
3122 3133
3123 my $indexedGetterfunction = GetIndexedGetterFunction($interface); 3134 my $indexedGetterfunction = GetIndexedGetterFunction($interface);
3124 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; 3135 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"};
3125 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; 3136 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"};
(...skipping 27 matching lines...) Expand all
3153 my $code = ""; 3164 my $code = "";
3154 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; 3165 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter";
3155 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; 3166 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0";
3156 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. 3167 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment.
3157 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; 3168 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0";
3158 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; 3169 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator;
3159 $code .= ");\n"; 3170 $code .= ");\n";
3160 3171
3161 if ($indexedGetterfunction && !$hasCustomIndexedGetter) { 3172 if ($indexedGetterfunction && !$hasCustomIndexedGetter) {
3162 my $returnType = $indexedGetterfunction->signature->type; 3173 my $returnType = $indexedGetterfunction->signature->type;
3174 my $nativeType = GetNativeType($returnType);
3163 my $methodName = $indexedGetterfunction->signature->name; 3175 my $methodName = $indexedGetterfunction->signature->name;
3164 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"}; 3176 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"};
3165 AddToImplIncludes("bindings/v8/V8Collection.h"); 3177 AddToImplIncludes("bindings/v8/V8Collection.h");
3166 my $jsValue = ""; 3178 my $nativeExpression = "element";
haraken 2013/05/16 05:38:05 Nit: $nativeExpression => $nativeValue
3167 my $nativeType = GetNativeType($returnType); 3179 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3168 my $isNull = ""; 3180 my $isNull = GetIsNullExpression($returnType, "element");
3169 3181 my $returnJSValueCode = NativeToJSValue($indexedGetterfunction->signatur e->type, $indexedGetterfunction->signature->extendedAttributes, $nativeExpressio n, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", "");
haraken 2013/05/16 05:38:05 Nit: You can omit the last two ""s.
3170 if (IsRefPtrType($returnType)) {
3171 AddToImplIncludes("V8$returnType.h");
3172 $isNull = "!element";
3173 $jsValue = NativeToJSValue($indexedGetterfunction->signature, "eleme nt.release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", " ");
3174 } else {
3175 $isNull = "element.isNull()";
3176 $jsValue = NativeToJSValue($indexedGetterfunction->signature, "eleme nt", "info.Holder()", "info.GetIsolate()");
3177 }
3178 3182
3179 $implementation{nameSpaceWebCore}->add(<<END); 3183 $implementation{nameSpaceWebCore}->add(<<END);
3180 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) 3184 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info)
3181 { 3185 {
3182 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3186 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3183 ${implClassName}* collection = toNative(info.Holder()); 3187 ${implClassName}* collection = toNative(info.Holder());
3184 $nativeType element = collection->$methodName(index); 3188 $nativeType element = collection->$methodName(index);
3185 if ($isNull) 3189 if (${isNull})
3186 return v8Undefined(); 3190 return v8Undefined();
3187 return $jsValue; 3191 ${returnJSValueCode}
3188 } 3192 }
3189 3193
3190 END 3194 END
3191 } 3195 }
3192 return $code; 3196 return $code;
3193 } 3197 }
3194 3198
3195 sub GenerateImplementationNamedPropertyGetter 3199 sub GenerateImplementationNamedPropertyGetter
3196 { 3200 {
3197 my $interface = shift; 3201 my $interface = shift;
3198 3202
3199 my $subCode = ""; 3203 my $subCode = "";
3200 my $interfaceName = $interface->name; 3204 my $interfaceName = $interface->name;
3201 my $implClassName = GetImplClassName($interface); 3205 my $implClassName = GetImplClassName($interface);
3202 my $v8ClassName = GetV8ClassName($interface); 3206 my $v8ClassName = GetV8ClassName($interface);
3203 3207
3204 my $namedGetterFunction = GetNamedGetterFunction($interface); 3208 my $namedGetterFunction = GetNamedGetterFunction($interface);
3205 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"}; 3209 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"};
3206 3210
3207 if ($namedGetterFunction && !$hasCustomNamedGetter) { 3211 if ($namedGetterFunction && !$hasCustomNamedGetter) {
3212 $subCode .= <<END;
3213 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0);
3214 END
3208 my $returnType = $namedGetterFunction->signature->type; 3215 my $returnType = $namedGetterFunction->signature->type;
3216 my $nativeType = GetNativeType($namedGetterFunction->signature->type);
3209 my $methodName = $namedGetterFunction->signature->name; 3217 my $methodName = $namedGetterFunction->signature->name;
3210 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"}; 3218 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"};
3211 AddToImplIncludes("bindings/v8/V8Collection.h"); 3219 AddToImplIncludes("bindings/v8/V8Collection.h");
3212 $subCode .= <<END; 3220 my $nativeExpression = "element";
haraken 2013/05/16 05:38:05 Nit: $nativeExpression => $nativeValue
3213 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0); 3221 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3214 END 3222 my $isNull = GetIsNullExpression($returnType, "element");
3215 my $jsValue = ""; 3223 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.
3216 my $nativeType = GetNativeType($returnType);
3217 my $isNull = "";
3218
3219 if (IsRefPtrType($returnType)) {
3220 AddToImplIncludes("V8$returnType.h");
3221 $isNull = "!element";
3222 $jsValue = NativeToJSValue($namedGetterFunction->signature, "element .release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", "") ;
3223 } else {
3224 $isNull = "element.isNull()";
3225 $jsValue = NativeToJSValue($namedGetterFunction->signature, "element ", "info.Holder()", "info.GetIsolate()");
3226 }
3227 3224
3228 $implementation{nameSpaceWebCore}->add(<<END); 3225 $implementation{nameSpaceWebCore}->add(<<END);
3229 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 3226 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
3230 { 3227 {
3231 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) 3228 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty())
3232 return v8Undefined(); 3229 return v8Undefined();
3233 if (info.Holder()->HasRealNamedCallbackProperty(name)) 3230 if (info.Holder()->HasRealNamedCallbackProperty(name))
3234 return v8Undefined(); 3231 return v8Undefined();
3235 3232
3236 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3233 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3237 ${implClassName}* collection = toNative(info.Holder()); 3234 ${implClassName}* collection = toNative(info.Holder());
3238 AtomicString propertyName = toWebCoreAtomicString(name); 3235 AtomicString propertyName = toWebCoreAtomicString(name);
3239 ${nativeType} element = collection->${methodName}(propertyName); 3236 ${nativeType} element = collection->${methodName}(propertyName);
3240 if (${isNull}) 3237 if (${isNull})
3241 return v8Undefined(); 3238 return v8Undefined();
3242 return ${jsValue}; 3239 ${returnJSValueCode}
3243 } 3240 }
3244 3241
3245 END 3242 END
3246 } 3243 }
3247 3244
3248 if ($hasCustomNamedGetter) { 3245 if ($hasCustomNamedGetter) {
3249 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"}; 3246 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"};
3250 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" }; 3247 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" };
3251 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"}; 3248 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"};
3252 my $setOn = "Instance"; 3249 my $setOn = "Instance";
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after
4112 $code .= " return true;\n\n"; 4109 $code .= " return true;\n\n";
4113 $code .= " v8::HandleScope handleScope;\n\n"; 4110 $code .= " v8::HandleScope handleScope;\n\n";
4114 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; 4111 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n";
4115 $code .= " if (v8Context.IsEmpty())\n"; 4112 $code .= " if (v8Context.IsEmpty())\n";
4116 $code .= " return true;\n\n"; 4113 $code .= " return true;\n\n";
4117 $code .= " v8::Context::Scope scope(v8Context);\n\n"; 4114 $code .= " v8::Context::Scope scope(v8Context);\n\n";
4118 4115
4119 @args = (); 4116 @args = ();
4120 foreach my $param (@params) { 4117 foreach my $param (@params) {
4121 my $paramName = $param->name; 4118 my $paramName = $param->name;
4122 $code .= " v8::Handle<v8::Value> ${paramName}Handle = " . Nat iveToJSValue($param, $paramName, "v8::Handle<v8::Object>()", "v8Context->GetIsol ate()", "") . ";\n"; 4119 $code .= NativeToJSValue($param->type, $param->extendedAttribute s, $paramName, " ", "v8::Handle<v8::Value> ${paramName}Handle =", "v8::Handle <v8::Object>()", "v8Context->GetIsolate()", "") . "\n";
4123 $code .= " if (${paramName}Handle.IsEmpty()) {\n"; 4120 $code .= " if (${paramName}Handle.IsEmpty()) {\n";
4124 $code .= " if (!isScriptControllerTerminating())\n"; 4121 $code .= " if (!isScriptControllerTerminating())\n";
4125 $code .= " CRASH();\n"; 4122 $code .= " CRASH();\n";
4126 $code .= " return true;\n"; 4123 $code .= " return true;\n";
4127 $code .= " }\n"; 4124 $code .= " }\n";
4128 push(@args, " ${paramName}Handle"); 4125 push(@args, " ${paramName}Handle");
4129 } 4126 }
4130 4127
4131 if (scalar(@args) > 0) { 4128 if (scalar(@args) > 0) {
4132 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; 4129 $code .= "\n v8::Handle<v8::Value> argv[] = {\n";
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
4370 # If the implementing class is a POD type, commit changes 4367 # If the implementing class is a POD type, commit changes
4371 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { 4368 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) {
4372 $code .= $indent . "wrapper->commitChange();\n"; 4369 $code .= $indent . "wrapper->commitChange();\n";
4373 } 4370 }
4374 4371
4375 $return .= ".release()" if ($returnIsRef); 4372 $return .= ".release()" if ($returnIsRef);
4376 4373
4377 my $nativeValue; 4374 my $nativeValue;
4378 # FIXME: Update for all ScriptWrappables. 4375 # FIXME: Update for all ScriptWrappables.
4379 if (IsDOMNodeType($interfaceName)) { 4376 if (IsDOMNodeType($interfaceName)) {
4380 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSu ffix); 4377 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix);
4381 } else { 4378 } else {
4382 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); 4379 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix);
4383 } 4380 }
4384 4381
4385 $code .= $indent . "return " . $nativeValue . ";\n"; 4382 $code .= $nativeValue . "\n";
4386 4383
4387 return $code; 4384 return $code;
4388 } 4385 }
4389 4386
4390 sub GetNativeTypeFromSignature 4387 sub GetNativeTypeFromSignature
4391 { 4388 {
4392 my $signature = shift; 4389 my $signature = shift;
4393 my $parameterIndex = shift; 4390 my $parameterIndex = shift;
4394 4391
4395 my $type = $signature->type; 4392 my $type = $signature->type;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4447 return "double" if $type eq "Date"; 4444 return "double" if $type eq "Date";
4448 return "ScriptValue" if $type eq "any"; 4445 return "ScriptValue" if $type eq "any";
4449 return "Dictionary" if $type eq "Dictionary"; 4446 return "Dictionary" if $type eq "Dictionary";
4450 4447
4451 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; 4448 return "RefPtr<DOMStringList>" if $type eq "DOMStringList";
4452 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; 4449 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ;
4453 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; 4450 return "RefPtr<NodeFilter>" if $type eq "NodeFilter";
4454 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; 4451 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
4455 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; 4452 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver";
4456 4453
4454 if (IsUnionType($type)) {
4455 my $types = $type->unionMemberTypes;
4456 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless scalar(@$types)==2;
haraken 2013/05/16 05:38:05 Nit: Spaces are needed around ==. You can add thi
4457 return "WTF::UnionType2<" . (join ", ", @$types) . ">";
4458 }
4459
4457 # We need to check [ImplementedBy] extended attribute for wrapper types. 4460 # We need to check [ImplementedBy] extended attribute for wrapper types.
4458 if (IsWrapperType($type)) { 4461 if (IsWrapperType($type)) {
4459 my $interface = ParseInterface($type); 4462 my $interface = ParseInterface($type);
4460 my $implClassName = GetImplClassName($interface); 4463 my $implClassName = GetImplClassName($interface);
4461 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; 4464 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>";
4462 } 4465 }
4463 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; 4466 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter;
4464 4467
4465 my $arrayType = GetArrayType($type); 4468 my $arrayType = GetArrayType($type);
4466 my $sequenceType = GetSequenceType($type); 4469 my $sequenceType = GetSequenceType($type);
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
4679 'long long' => 1, 4682 'long long' => 1,
4680 'long' => 1, 4683 'long' => 1,
4681 'short' => 1, 4684 'short' => 1,
4682 'unsigned int' => 1, 4685 'unsigned int' => 1,
4683 'unsigned long long' => 1, 4686 'unsigned long long' => 1,
4684 'unsigned long' => 1, 4687 'unsigned long' => 1,
4685 'unsigned short' => 1, 4688 'unsigned short' => 1,
4686 'void' => 1 4689 'void' => 1
4687 ); 4690 );
4688 4691
4692 sub IsUnionType
4693 {
4694 my $type = shift; # string or UnionType
4695 return 1 if ref($type) eq "UnionType";
4696 return 0;
4697 }
4689 4698
4690 sub IsWrapperType 4699 sub IsWrapperType
4691 { 4700 {
4692 my $type = shift; 4701 my $type = shift;
4693 return 0 if GetArrayType($type); 4702 return 0 if GetArrayType($type);
4694 return 0 if GetSequenceType($type); 4703 return 0 if GetSequenceType($type);
4695 return 0 if IsEnumType($type); 4704 return 0 if IsEnumType($type);
4696 return !($non_wrapper_types{$type}); 4705 return !($non_wrapper_types{$type});
4697 } 4706 }
4698 4707
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
4755 return 1 if $type =~ /^SVG.*Element$/; 4764 return 1 if $type =~ /^SVG.*Element$/;
4756 4765
4757 return 1 if $type eq 'TestNode'; 4766 return 1 if $type eq 'TestNode';
4758 4767
4759 return 0; 4768 return 0;
4760 } 4769 }
4761 4770
4762 4771
4763 sub NativeToJSValue 4772 sub NativeToJSValue
4764 { 4773 {
4765 my $signature = shift; 4774 my $type = shift;
4766 my $value = shift; 4775 my $extendedAttributes = shift;
4776 my $nativeValue = shift;
4777 my $indent = shift; # added before every line
4778 my $receiver = shift; # "return" or "<variableName> ="
4767 my $getCreationContext = shift; 4779 my $getCreationContext = shift;
4768 my $getIsolate = shift; 4780 my $getIsolate = shift;
4769 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; 4781 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate;
4770 my $getHolderContainer = shift; 4782 my $getHolderContainer = shift;
4771 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; 4783 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : "";
4772 my $getScriptWrappable = shift; 4784 my $getScriptWrappable = shift;
4773 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; 4785 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : "";
4774 my $returnHandleType = shift; 4786 my $returnHandleType = shift;
4775 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; 4787 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : "";
4776 my $forMainWorldSuffix = shift; 4788 my $forMainWorldSuffix = shift;
4777 4789
4778 my $type = $signature->type; 4790 if (IsUnionType($type)) {
4791 my $types = $type->unionMemberTypes;
4792 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless scalar(@$types)==2;
haraken 2013/05/16 05:38:05 You can move the check to IsUnionType().
4793 my $code = "";
4794 for my $i (0 .. scalar(@$types)-1) {
4795 my $unionMemberType = $types->[$i];
4796 my $memberNumber = $i + 1;
4797 my $returnJSValueCode = NativeToJSValue($unionMemberType, $extendedA ttributes, "${nativeValue}.member${memberNumber}()", $indent . " ", $receiver , $getCreationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $r eturnHandleType, $forMainWorldSuffix);
4798 $code .= <<END;
4799 ${indent}if (${nativeValue}.member${memberNumber}())
4800 ${returnJSValueCode}
4801 END
4802 }
4803 $code .= $indent . "ASSERT_NOT_REACHED();\n";
4804 $code .= $indent . "return v8Undefined();";
4805 return $code;
4806 }
4779 4807
4780 return "v8Boolean($value, $getIsolate)" if $type eq "boolean"; 4808 return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean";
4781 return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined() 4809 return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalen t to v8Undefined()
4782 4810
4783 # HTML5 says that unsigned reflected attributes should be in the range 4811 # HTML5 says that unsigned reflected attributes should be in the range
4784 # [0, 2^31). When a value isn't in this range, a default value (or 0) 4812 # [0, 2^31). When a value isn't in this range, a default value (or 0)
4785 # should be returned instead. 4813 # should be returned instead.
4786 if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long " or $type eq "unsigned short")) { 4814 if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) {
4787 $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; 4815 $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g;
4788 return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)"; 4816 return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);";
4789 } 4817 }
4790 4818
4791 # For all the types where we use 'int' as the representation type, 4819 # For all the types where we use 'int' as the representation type,
4792 # we use v8Integer() which has a fast small integer conversion check. 4820 # we use v8Integer() which has a fast small integer conversion check.
4793 my $nativeType = GetNativeType($type); 4821 my $nativeType = GetNativeType($type);
4794 return "v8Integer($value, $getIsolate)" if $nativeType eq "int"; 4822 return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeTy pe eq "int";
4795 return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned" ; 4823 return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $ nativeType eq "unsigned";
4796 4824
4797 return "v8DateOrNull($value, $getIsolate)" if $type eq "Date"; 4825 return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date";
4798 # long long and unsigned long long are not representable in ECMAScript. 4826 # long long and unsigned long long are not representable in ECMAScript.
4799 return "v8::Number::New(static_cast<double>($value))" if $type eq "long long " or $type eq "unsigned long long" or $type eq "DOMTimeStamp"; 4827 return "$indent$receiver v8::Number::New(static_cast<double>($nativeValue)); " if $type eq "long long" or $type eq "unsigned long long" or $type eq "DOMTimeS tamp";
4800 return "v8::Number::New($value)" if IsPrimitiveType($type); 4828 return "$indent$receiver v8::Number::New($nativeValue);" if IsPrimitiveType( $type);
4801 return "$value.v8Value()" if $nativeType eq "ScriptValue"; 4829 return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptV alue";
4802 4830
4803 if ($type eq "DOMString" or IsEnumType($type)) { 4831 if ($type eq "DOMString" or IsEnumType($type)) {
4804 my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"} ; 4832 my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"};
4805 if (defined $conv) { 4833 if (defined $conv) {
4806 return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null"; 4834 return "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$re turnHandleTypeArg);" if $conv eq "Null";
4807 return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg) " if $conv eq "Undefined"; 4835 return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsola te$returnHandleTypeArg);" if $conv eq "Undefined";
4808 4836
4809 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; 4837 die "Unknown value for TreatReturnedNullStringAs extended attribute" ;
4810 } 4838 }
4811 return "v8String($value, $getIsolate$returnHandleTypeArg)"; 4839 return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandle TypeArg);";
4812 } 4840 }
4813 4841
4814 my $arrayType = GetArrayType($type); 4842 my $arrayType = GetArrayType($type);
4815 my $sequenceType = GetSequenceType($type); 4843 my $sequenceType = GetSequenceType($type);
4816 my $arrayOrSequenceType = $arrayType || $sequenceType; 4844 my $arrayOrSequenceType = $arrayType || $sequenceType;
4817 4845
4818 if ($arrayOrSequenceType) { 4846 if ($arrayOrSequenceType) {
4819 if (IsRefPtrType($arrayOrSequenceType)) { 4847 if (IsRefPtrType($arrayOrSequenceType)) {
4820 AddIncludesForType($arrayOrSequenceType); 4848 AddIncludesForType($arrayOrSequenceType);
4821 } 4849 }
4822 return "v8Array($value, $getIsolate)"; 4850 return "$indent$receiver v8Array($nativeValue, $getIsolate);";
4823 } 4851 }
4824 4852
4825 AddIncludesForType($type); 4853 AddIncludesForType($type);
4826 4854
4827 if (IsDOMNodeType($type) || $type eq "EventTarget") { 4855 if (IsDOMNodeType($type) || $type eq "EventTarget") {
4828 if ($getScriptWrappable) { 4856 if ($getScriptWrappable) {
4829 return "toV8Fast${forMainWorldSuffix}($value$getHolderContainerArg$get ScriptWrappableArg)"; 4857 return "$indent$receiver toV8Fast${forMainWorldSuffix}($nativeValue$ge tHolderContainerArg$getScriptWrappableArg);";
4830 } 4858 }
4831 return "toV8($value, $getCreationContext, $getIsolate)"; 4859 return "$indent$receiver toV8($nativeValue, $getCreationContext, $getIsola te);";
4832 } 4860 }
4833 4861
4834 if ($type eq "EventListener") { 4862 if ($type eq "EventListener") {
4835 AddToImplIncludes("bindings/v8/V8AbstractEventListener.h"); 4863 AddToImplIncludes("bindings/v8/V8AbstractEventListener.h");
4836 return "${value} ? v8::Handle<v8::Value>(static_cast<V8AbstractEventList ener*>(${value})->getListenerObject(imp->scriptExecutionContext())) : v8::Handle <v8::Value>(v8Null($getIsolate))"; 4864 return "$indent$receiver $nativeValue ? v8::Handle<v8::Value>(static_cas t<V8AbstractEventListener*>(${nativeValue})->getListenerObject(imp->scriptExecut ionContext())) : v8::Handle<v8::Value>(v8Null($getIsolate));";
4837 } 4865 }
4838 4866
4839 if ($type eq "SerializedScriptValue") { 4867 if ($type eq "SerializedScriptValue") {
4840 AddToImplIncludes("$type.h"); 4868 AddToImplIncludes("$type.h");
4841 return "$value ? $value->deserialize() : v8::Handle<v8::Value>(v8Null($g etIsolate))"; 4869 return "$indent$receiver $nativeValue ? $nativeValue->deserialize() : v8 ::Handle<v8::Value>(v8Null($getIsolate));";
4842 } 4870 }
4843 4871
4844 AddToImplIncludes("wtf/RefCounted.h"); 4872 AddToImplIncludes("wtf/RefCounted.h");
4845 AddToImplIncludes("wtf/RefPtr.h"); 4873 AddToImplIncludes("wtf/RefPtr.h");
4846 AddToImplIncludes("wtf/GetPtr.h"); 4874 AddToImplIncludes("wtf/GetPtr.h");
4847 4875
4848 if ($getScriptWrappable) { 4876 if ($getScriptWrappable) {
4849 return "toV8Fast$forMainWorldSuffix($value$getHolderContainerArg$getSc riptWrappableArg)"; 4877 return "$indent$receiver toV8Fast$forMainWorldSuffix($nativeValue$getH olderContainerArg$getScriptWrappableArg);";
4850 } 4878 }
4851 return "toV8($value, $getCreationContext, $getIsolate)"; 4879 return "$indent$receiver toV8($nativeValue, $getCreationContext, $getIsolate );";
4852 } 4880 }
4853 4881
4854 sub WriteData 4882 sub WriteData
4855 { 4883 {
4856 my $object = shift; 4884 my $object = shift;
4857 my $interface = shift; 4885 my $interface = shift;
4858 my $outputDirectory = shift; 4886 my $outputDirectory = shift;
4859 my $outputHeadersDirectory = shift; 4887 my $outputHeadersDirectory = shift;
4860 4888
4861 my $name = $interface->name; 4889 my $name = $interface->name;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
5113 5141
5114 sub IsRefPtrType 5142 sub IsRefPtrType
5115 { 5143 {
5116 my $type = shift; 5144 my $type = shift;
5117 5145
5118 return 0 if IsPrimitiveType($type); 5146 return 0 if IsPrimitiveType($type);
5119 return 0 if GetArrayType($type); 5147 return 0 if GetArrayType($type);
5120 return 0 if GetSequenceType($type); 5148 return 0 if GetSequenceType($type);
5121 return 0 if $type eq "DOMString"; 5149 return 0 if $type eq "DOMString";
5122 return 0 if IsEnumType($type); 5150 return 0 if IsEnumType($type);
5151 return 0 if IsUnionType($type);
5123 5152
5124 return 1; 5153 return 1;
5125 } 5154 }
5126 5155
5127 sub GetSVGTypeNeedingTearOff 5156 sub GetSVGTypeNeedingTearOff
5128 { 5157 {
5129 my $type = shift; 5158 my $type = shift;
5130 5159
5131 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; 5160 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ;
5132 return undef; 5161 return undef;
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
5459 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { 5488 if ($currentInterface->extendedAttributes->{$extendedAttribute}) {
5460 $found = 1; 5489 $found = 1;
5461 } 5490 }
5462 return 1 if $found; 5491 return 1 if $found;
5463 }, 0); 5492 }, 0);
5464 5493
5465 return $found; 5494 return $found;
5466 } 5495 }
5467 5496
5468 1; 5497 1;
OLDNEW
« 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