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

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: updated 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 1624 matching lines...) Expand 10 before | Expand all | Expand 10 after
1635 END 1635 END
1636 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) { 1636 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) {
1637 my $getterFunc = ToMethodName($attribute->signature->name); 1637 my $getterFunc = ToMethodName($attribute->signature->name);
1638 $code .= <<END; 1638 $code .= <<END;
1639 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}(); 1639 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}();
1640 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate())); 1640 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate()));
1641 info.Holder()->SetHiddenValue(propertyName, value); 1641 info.Holder()->SetHiddenValue(propertyName, value);
1642 return value; 1642 return value;
1643 END 1643 END
1644 } else { 1644 } else {
1645 $code .= " return " . NativeToJSValue($attribute->signature, $express ion, "info.Holder()", "info.GetIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix).";\n"; 1645 $code .= " return " . NativeToJSValue($attribute->signature->type, $a ttribute->signature->extendedAttributes, $expression, "info.Holder()", "info.Get Isolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix).";\n";
haraken 2013/05/15 12:09:43 You can pass $attribute->signature instead of pass
1646 } 1646 }
1647 1647
1648 $code .= "}\n\n"; # end of getter 1648 $code .= "}\n\n"; # end of getter
1649 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString; 1649 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString;
1650 $implementation{nameSpaceInternal}->add($code); 1650 $implementation{nameSpaceInternal}->add($code);
1651 } 1651 }
1652 1652
1653 sub ShouldKeepAttributeAlive 1653 sub ShouldKeepAttributeAlive
1654 { 1654 {
1655 my ($interface, $attribute, $returnType) = @_; 1655 my ($interface, $attribute, $returnType) = @_;
(...skipping 1490 matching lines...) Expand 10 before | Expand all | Expand 10 after
3146 $code .= " } else {\n"; 3146 $code .= " } else {\n";
3147 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; 3147 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n";
3148 $code .= " }\n"; 3148 $code .= " }\n";
3149 } else { 3149 } else {
3150 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; 3150 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n";
3151 } 3151 }
3152 $code .= "#endif // ${conditionalString}\n" if $conditionalString; 3152 $code .= "#endif // ${conditionalString}\n" if $conditionalString;
3153 return $code; 3153 return $code;
3154 } 3154 }
3155 3155
3156 sub GetIsNullExpression
3157 {
3158 my $type = shift;
3159 my $variableName = shift;
3160 if (IsRefPtrType($type)) {
3161 return "!${variableName}";
3162 } else {
3163 return "${variableName}.isNull()";
3164 }
3165 }
3166
3167 sub GetReturnJSValueStatements
haraken 2013/05/15 12:09:43 This looks like a duplication of NativeToJSValue()
3168 {
3169 my $type = shift;
3170 my $extendedAttributes = shift;
3171 my $value = shift; # expression of native value
3172 my $getCreationContext = shift;
3173 my $getIsolate = shift;
3174 my $getHolderContainer = shift;
3175 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : "";
3176 my $getScriptWrappable = shift;
3177 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : "";
3178 my $returnHandleType = shift;
3179 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : "";
3180 my $forMainWorldSuffix = shift;
3181
3182 # Union type
3183 if (ref $type) {
haraken 2013/05/15 12:09:43 'ref $type' is hard to understand. Let's implement
3184 my $types = $type->unionType->unionMemberTypes;
3185 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless scalar(@$types)==2 && scalar(grep {ref $_} @$types)==0;
3186 my $code = "";
3187 for my $i (0 .. scalar(@$types)-1) {
3188 my $unionMemberType = $types->[$i];
3189 my $jsValue = NativeToJSValue($unionMemberType, $extendedAttributes, "$value.enabledValue${i}()", $getCreationContext, $getIsolate, $getHolderContai ner, $getScriptWrappable, $returnHandleType, $forMainWorldSuffix);
3190 $code .= <<END;
3191 if (${value}.enabledValue${i}())
3192 return ${jsValue};
3193 END
3194 }
3195 $code .= <<END;
3196 return v8Undefined();
3197 END
3198 return $code;
3199 } else {
3200 my $jsValue = NativeToJSValue($type, $extendedAttributes, $value, $getCr eationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHan dleType, $forMainWorldSuffix);
3201 return " return ${jsValue};";
3202 }
3203 }
3204
3156 sub GenerateImplementationIndexedProperty 3205 sub GenerateImplementationIndexedProperty
3157 { 3206 {
3158 my $interface = shift; 3207 my $interface = shift;
3159 my $interfaceName = $interface->name; 3208 my $interfaceName = $interface->name;
3160 my $implClassName = GetImplClassName($interface); 3209 my $implClassName = GetImplClassName($interface);
3161 my $v8ClassName = GetV8ClassName($interface); 3210 my $v8ClassName = GetV8ClassName($interface);
3162 3211
3163 my $indexedGetterfunction = GetIndexedGetterFunction($interface); 3212 my $indexedGetterfunction = GetIndexedGetterFunction($interface);
3164 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; 3213 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"};
3165 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; 3214 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"};
(...skipping 27 matching lines...) Expand all
3193 my $code = ""; 3242 my $code = "";
3194 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; 3243 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter";
3195 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; 3244 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0";
3196 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. 3245 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment.
3197 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; 3246 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0";
3198 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; 3247 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator;
3199 $code .= ");\n"; 3248 $code .= ");\n";
3200 3249
3201 if ($indexedGetterfunction && !$hasCustomIndexedGetter) { 3250 if ($indexedGetterfunction && !$hasCustomIndexedGetter) {
3202 my $returnType = $indexedGetterfunction->signature->type; 3251 my $returnType = $indexedGetterfunction->signature->type;
3252 my $nativeType = GetNativeType($returnType);
3203 my $methodName = $indexedGetterfunction->signature->name; 3253 my $methodName = $indexedGetterfunction->signature->name;
3204 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"}; 3254 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"};
3205 AddToImplIncludes("bindings/v8/V8Collection.h"); 3255 AddToImplIncludes("bindings/v8/V8Collection.h");
3206 my $jsValue = ""; 3256 my $nativeExpression = "element";
3207 my $nativeType = GetNativeType($returnType); 3257 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3208 my $isNull = ""; 3258 my $isNull = GetIsNullExpression($returnType, "element");
3209 3259 my $returnJSValueStatements = GetReturnJSValueStatements($returnType, $i ndexedGetterfunction->signature->extendedAttributes, $nativeExpression, "info.Ho lder()", "info.GetIsolate()", "info", "collection", "", "");
3210 if (IsRefPtrType($returnType)) {
3211 AddToImplIncludes("V8$returnType.h");
3212 $isNull = "!element";
3213 $jsValue = NativeToJSValue($indexedGetterfunction->signature, "eleme nt.release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", " ");
3214 } else {
3215 $isNull = "element.isNull()";
3216 $jsValue = NativeToJSValue($indexedGetterfunction->signature, "eleme nt", "info.Holder()", "info.GetIsolate()");
3217 }
3218 3260
3219 $implementation{nameSpaceWebCore}->add(<<END); 3261 $implementation{nameSpaceWebCore}->add(<<END);
3220 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) 3262 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info)
3221 { 3263 {
3222 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3264 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3223 ${implClassName}* collection = toNative(info.Holder()); 3265 ${implClassName}* collection = toNative(info.Holder());
3224 $nativeType element = collection->$methodName(index); 3266 $nativeType element = collection->$methodName(index);
3225 if ($isNull) 3267 if (${isNull})
3226 return v8Undefined(); 3268 return v8Undefined();
3227 return $jsValue; 3269 $returnJSValueStatements
3228 } 3270 }
3229 3271
3230 END 3272 END
3231 } 3273 }
3232 return $code; 3274 return $code;
3233 } 3275 }
3234 3276
3235 sub GenerateImplementationNamedPropertyGetter 3277 sub GenerateImplementationNamedPropertyGetter
3236 { 3278 {
3237 my $interface = shift; 3279 my $interface = shift;
3238 3280
3239 my $subCode = ""; 3281 my $subCode = "";
3240 my $interfaceName = $interface->name; 3282 my $interfaceName = $interface->name;
3241 my $implClassName = GetImplClassName($interface); 3283 my $implClassName = GetImplClassName($interface);
3242 my $v8ClassName = GetV8ClassName($interface); 3284 my $v8ClassName = GetV8ClassName($interface);
3243 3285
3244 my $namedGetterFunction = GetNamedGetterFunction($interface); 3286 my $namedGetterFunction = GetNamedGetterFunction($interface);
3245 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"}; 3287 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"};
3246 3288
3247 if ($namedGetterFunction && !$hasCustomNamedGetter) { 3289 if ($namedGetterFunction && !$hasCustomNamedGetter) {
3290 $subCode .= <<END;
3291 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0);
3292 END
3248 my $returnType = $namedGetterFunction->signature->type; 3293 my $returnType = $namedGetterFunction->signature->type;
3294 my $nativeType = GetNativeType($namedGetterFunction->signature->type);
3249 my $methodName = $namedGetterFunction->signature->name; 3295 my $methodName = $namedGetterFunction->signature->name;
3250 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"}; 3296 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"};
3251 AddToImplIncludes("bindings/v8/V8Collection.h"); 3297 AddToImplIncludes("bindings/v8/V8Collection.h");
3252 $subCode .= <<END; 3298 my $nativeExpression = "element";
3253 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0); 3299 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3254 END 3300 my $isNull = GetIsNullExpression($returnType, "element");
3255 my $jsValue = ""; 3301 my $returnJSValueStatements = GetReturnJSValueStatements($returnType, $n amedGetterFunction->signature->extendedAttributes, $nativeExpression, "info.Hold er()", "info.GetIsolate()", "info", "collection", "", "");
3256 my $nativeType = GetNativeType($returnType);
3257 my $isNull = "";
3258
3259 if (IsRefPtrType($returnType)) {
3260 AddToImplIncludes("V8$returnType.h");
3261 $isNull = "!element";
3262 $jsValue = NativeToJSValue($namedGetterFunction->signature, "element .release()", "info.Holder()", "info.GetIsolate()", "info", "collection", "", "") ;
3263 } else {
3264 $isNull = "element.isNull()";
3265 $jsValue = NativeToJSValue($namedGetterFunction->signature, "element ", "info.Holder()", "info.GetIsolate()");
3266 }
3267 3302
3268 $implementation{nameSpaceWebCore}->add(<<END); 3303 $implementation{nameSpaceWebCore}->add(<<END);
3269 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 3304 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
3270 { 3305 {
3271 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) 3306 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty())
3272 return v8Undefined(); 3307 return v8Undefined();
3273 if (info.Holder()->HasRealNamedCallbackProperty(name)) 3308 if (info.Holder()->HasRealNamedCallbackProperty(name))
3274 return v8Undefined(); 3309 return v8Undefined();
3275 3310
3276 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3311 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3277 ${implClassName}* collection = toNative(info.Holder()); 3312 ${implClassName}* collection = toNative(info.Holder());
3278 AtomicString propertyName = toWebCoreAtomicString(name); 3313 AtomicString propertyName = toWebCoreAtomicString(name);
3279 ${nativeType} element = collection->${methodName}(propertyName); 3314 ${nativeType} element = collection->${methodName}(propertyName);
3280 if (${isNull}) 3315 if (${isNull})
3281 return v8Undefined(); 3316 return v8Undefined();
3282 return ${jsValue}; 3317 $returnJSValueStatements
3283 } 3318 }
3284 3319
3285 END 3320 END
3286 } 3321 }
3287 3322
3288 if ($hasCustomNamedGetter) { 3323 if ($hasCustomNamedGetter) {
3289 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"}; 3324 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"};
3290 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" }; 3325 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" };
3291 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"}; 3326 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"};
3292 my $setOn = "Instance"; 3327 my $setOn = "Instance";
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
4192 $code .= " return true;\n\n"; 4227 $code .= " return true;\n\n";
4193 $code .= " v8::HandleScope handleScope;\n\n"; 4228 $code .= " v8::HandleScope handleScope;\n\n";
4194 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; 4229 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n";
4195 $code .= " if (v8Context.IsEmpty())\n"; 4230 $code .= " if (v8Context.IsEmpty())\n";
4196 $code .= " return true;\n\n"; 4231 $code .= " return true;\n\n";
4197 $code .= " v8::Context::Scope scope(v8Context);\n\n"; 4232 $code .= " v8::Context::Scope scope(v8Context);\n\n";
4198 4233
4199 @args = (); 4234 @args = ();
4200 foreach my $param (@params) { 4235 foreach my $param (@params) {
4201 my $paramName = $param->name; 4236 my $paramName = $param->name;
4202 $code .= " v8::Handle<v8::Value> ${paramName}Handle = " . Nat iveToJSValue($param, $paramName, "v8::Handle<v8::Object>()", "v8Context->GetIsol ate()", "") . ";\n"; 4237 $code .= " v8::Handle<v8::Value> ${paramName}Handle = " . Nat iveToJSValue($param->type, $param->extendedAttributes, $paramName, "v8::Handle<v 8::Object>()", "v8Context->GetIsolate()", "") . ";\n";
4203 $code .= " if (${paramName}Handle.IsEmpty()) {\n"; 4238 $code .= " if (${paramName}Handle.IsEmpty()) {\n";
4204 $code .= " if (!isScriptControllerTerminating())\n"; 4239 $code .= " if (!isScriptControllerTerminating())\n";
4205 $code .= " CRASH();\n"; 4240 $code .= " CRASH();\n";
4206 $code .= " return true;\n"; 4241 $code .= " return true;\n";
4207 $code .= " }\n"; 4242 $code .= " }\n";
4208 push(@args, " ${paramName}Handle"); 4243 push(@args, " ${paramName}Handle");
4209 } 4244 }
4210 4245
4211 if (scalar(@args) > 0) { 4246 if (scalar(@args) > 0) {
4212 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; 4247 $code .= "\n v8::Handle<v8::Value> argv[] = {\n";
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
4565 # If the implementing class is a POD type, commit changes 4600 # If the implementing class is a POD type, commit changes
4566 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { 4601 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) {
4567 $code .= $indent . "wrapper->commitChange();\n"; 4602 $code .= $indent . "wrapper->commitChange();\n";
4568 } 4603 }
4569 4604
4570 $return .= ".release()" if ($returnIsRef); 4605 $return .= ".release()" if ($returnIsRef);
4571 4606
4572 my $nativeValue; 4607 my $nativeValue;
4573 # FIXME: Update for all ScriptWrappables. 4608 # FIXME: Update for all ScriptWrappables.
4574 if (IsDOMNodeType($interfaceName)) { 4609 if (IsDOMNodeType($interfaceName)) {
4575 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSu ffix); 4610 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, "args.Holder()", "args.GetIsolate()", "arg s", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix);
4576 } else { 4611 } else {
4577 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); 4612 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, "args.Holder()", "args.GetIsolate()", 0, 0 , "ReturnUnsafeHandle", $forMainWorldSuffix);
4578 } 4613 }
4579 4614
4580 $code .= $indent . "return " . $nativeValue . ";\n"; 4615 $code .= $indent . "return " . $nativeValue . ";\n";
4581 4616
4582 return $code; 4617 return $code;
4583 } 4618 }
4584 4619
4585 sub GetNativeTypeFromSignature 4620 sub GetNativeTypeFromSignature
4586 { 4621 {
4587 my $signature = shift; 4622 my $signature = shift;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4642 return "double" if $type eq "Date"; 4677 return "double" if $type eq "Date";
4643 return "ScriptValue" if $type eq "any"; 4678 return "ScriptValue" if $type eq "any";
4644 return "Dictionary" if $type eq "Dictionary"; 4679 return "Dictionary" if $type eq "Dictionary";
4645 4680
4646 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; 4681 return "RefPtr<DOMStringList>" if $type eq "DOMStringList";
4647 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; 4682 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ;
4648 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; 4683 return "RefPtr<NodeFilter>" if $type eq "NodeFilter";
4649 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; 4684 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
4650 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; 4685 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver";
4651 4686
4687 # Union type
4688 if (ref $type) {
4689 my $types = $type->unionType->unionMemberTypes;
4690 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless scalar(@$types)==2 && scalar(grep {ref $_} @$types)==0;
haraken 2013/05/15 12:09:43 Nit: 'scalar(@$types) == 2' would be enough in pra
4691 return "WTF::UnionType2<" . (join ", ", @$types) . ">";
4692 }
4693
4652 # We need to check [ImplementedBy] extended attribute for wrapper types. 4694 # We need to check [ImplementedBy] extended attribute for wrapper types.
4653 if (IsWrapperType($type)) { 4695 if (IsWrapperType($type)) {
4654 my $interface = ParseInterface($type); 4696 my $interface = ParseInterface($type);
4655 my $implClassName = GetImplClassName($interface); 4697 my $implClassName = GetImplClassName($interface);
4656 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; 4698 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>";
4657 } 4699 }
4658 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; 4700 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter;
4659 4701
4660 my $arrayType = GetArrayType($type); 4702 my $arrayType = GetArrayType($type);
4661 my $sequenceType = GetSequenceType($type); 4703 my $sequenceType = GetSequenceType($type);
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
4970 return 1 if $type =~ /^SVG.*Element$/; 5012 return 1 if $type =~ /^SVG.*Element$/;
4971 5013
4972 return 1 if $type eq 'TestNode'; 5014 return 1 if $type eq 'TestNode';
4973 5015
4974 return 0; 5016 return 0;
4975 } 5017 }
4976 5018
4977 5019
4978 sub NativeToJSValue 5020 sub NativeToJSValue
4979 { 5021 {
4980 my $signature = shift; 5022 my $type = shift;
4981 my $value = shift; 5023 my $extendedAttributes = shift;
5024 my $value = shift; # expression of native value
haraken 2013/05/15 12:09:43 $value => $nativeValue
4982 my $getCreationContext = shift; 5025 my $getCreationContext = shift;
4983 my $getIsolate = shift; 5026 my $getIsolate = shift;
4984 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; 5027 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate;
4985 my $getHolderContainer = shift; 5028 my $getHolderContainer = shift;
4986 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; 5029 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : "";
4987 my $getScriptWrappable = shift; 5030 my $getScriptWrappable = shift;
4988 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; 5031 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : "";
4989 my $returnHandleType = shift; 5032 my $returnHandleType = shift;
4990 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; 5033 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : "";
4991 my $forMainWorldSuffix = shift; 5034 my $forMainWorldSuffix = shift;
4992 5035
4993 my $type = $signature->type; 5036 # Union type
5037 if (ref $type) {
5038 my $types = $type->unionType->unionMemberTypes;
5039 die "JSValue of UnionType can not be obtained as expression. use GetCrea teJSValueStatements() instead.\n";
5040 }
4994 5041
4995 return "v8Boolean($value, $getIsolate)" if $type eq "boolean"; 5042 return "v8Boolean($value, $getIsolate)" if $type eq "boolean";
4996 return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined() 5043 return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined()
4997 5044
4998 # HTML5 says that unsigned reflected attributes should be in the range 5045 # HTML5 says that unsigned reflected attributes should be in the range
4999 # [0, 2^31). When a value isn't in this range, a default value (or 0) 5046 # [0, 2^31). When a value isn't in this range, a default value (or 0)
5000 # should be returned instead. 5047 # should be returned instead.
5001 if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long " or $type eq "unsigned short")) { 5048 if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) {
5002 $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; 5049 $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g;
5003 return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)"; 5050 return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)";
5004 } 5051 }
5005 5052
5006 # For all the types where we use 'int' as the representation type, 5053 # For all the types where we use 'int' as the representation type,
5007 # we use v8Integer() which has a fast small integer conversion check. 5054 # we use v8Integer() which has a fast small integer conversion check.
5008 my $nativeType = GetNativeType($type); 5055 my $nativeType = GetNativeType($type);
5009 return "v8Integer($value, $getIsolate)" if $nativeType eq "int"; 5056 return "v8Integer($value, $getIsolate)" if $nativeType eq "int";
5010 return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned" ; 5057 return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned" ;
5011 5058
5012 return "v8DateOrNull($value, $getIsolate)" if $type eq "Date"; 5059 return "v8DateOrNull($value, $getIsolate)" if $type eq "Date";
5013 # long long and unsigned long long are not representable in ECMAScript. 5060 # long long and unsigned long long are not representable in ECMAScript.
5014 return "v8::Number::New(static_cast<double>($value))" if $type eq "long long " or $type eq "unsigned long long" or $type eq "DOMTimeStamp"; 5061 return "v8::Number::New(static_cast<double>($value))" if $type eq "long long " or $type eq "unsigned long long" or $type eq "DOMTimeStamp";
5015 return "v8::Number::New($value)" if IsPrimitiveType($type); 5062 return "v8::Number::New($value)" if IsPrimitiveType($type);
5016 return "$value.v8Value()" if $nativeType eq "ScriptValue"; 5063 return "$value.v8Value()" if $nativeType eq "ScriptValue";
5017 5064
5018 if ($type eq "DOMString" or IsEnumType($type)) { 5065 if ($type eq "DOMString" or IsEnumType($type)) {
5019 my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"} ; 5066 my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"};
5020 if (defined $conv) { 5067 if (defined $conv) {
5021 return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null"; 5068 return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null";
5022 return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg) " if $conv eq "Undefined"; 5069 return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg) " if $conv eq "Undefined";
5023 5070
5024 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; 5071 die "Unknown value for TreatReturnedNullStringAs extended attribute" ;
5025 } 5072 }
5026 return "v8String($value, $getIsolate$returnHandleTypeArg)"; 5073 return "v8String($value, $getIsolate$returnHandleTypeArg)";
5027 } 5074 }
5028 5075
5029 my $arrayType = GetArrayType($type); 5076 my $arrayType = GetArrayType($type);
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
5338 5385
5339 sub IsRefPtrType 5386 sub IsRefPtrType
5340 { 5387 {
5341 my $type = shift; 5388 my $type = shift;
5342 5389
5343 return 0 if IsPrimitiveType($type); 5390 return 0 if IsPrimitiveType($type);
5344 return 0 if GetArrayType($type); 5391 return 0 if GetArrayType($type);
5345 return 0 if GetSequenceType($type); 5392 return 0 if GetSequenceType($type);
5346 return 0 if $type eq "DOMString"; 5393 return 0 if $type eq "DOMString";
5347 return 0 if IsEnumType($type); 5394 return 0 if IsEnumType($type);
5395 return 0 if ref $type; # Union
5348 5396
5349 return 1; 5397 return 1;
5350 } 5398 }
5351 5399
5352 sub GetSVGTypeNeedingTearOff 5400 sub GetSVGTypeNeedingTearOff
5353 { 5401 {
5354 my $type = shift; 5402 my $type = shift;
5355 5403
5356 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; 5404 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ;
5357 return undef; 5405 return undef;
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
5684 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { 5732 if ($currentInterface->extendedAttributes->{$extendedAttribute}) {
5685 $found = 1; 5733 $found = 1;
5686 } 5734 }
5687 return 1 if $found; 5735 return 1 if $found;
5688 }, 0); 5736 }, 0);
5689 5737
5690 return $found; 5738 return $found;
5691 } 5739 }
5692 5740
5693 1; 5741 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