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

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: 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
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/wtf/UnionType.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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";
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 GetCreateJSValueStatements
3168 {
3169 my $variableName = shift;
3170 my $type = shift;
3171 my $extendedAttributes = shift;
3172 my $value = shift; # expression of native value
3173 my $getCreationContext = shift;
3174 my $getIsolate = shift;
3175 my $getHolderContainer = shift;
3176 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : "";
3177 my $getScriptWrappable = shift;
3178 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : "";
3179 my $returnHandleType = shift;
3180 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : "";
3181 my $forMainWorldSuffix = shift;
3182
3183 # Union type
3184 if (ref $type) {
3185 my $types = $type->unionType->unionMemberTypes;
3186 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;
3187 my $code = "";
3188 for my $i (0 .. scalar(@$types)-1) {
3189 my $unionMemberType = $types->[$i];
3190 my $jsValue = NativeToJSValue($unionMemberType, $extendedAttributes, "$value.getValue${i}()", $getCreationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHandleType, $forMainWorldSuffix);
3191 $code .= <<END
3192 if (${value}.isValue${i}Enabled())
3193 ${variableName} = ${jsValue};
3194 END
3195 }
3196 return $code;
3197 } else {
3198 my $jsValue = NativeToJSValue($type, $extendedAttributes, $value, $getCr eationContext, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHan dleType, $forMainWorldSuffix);
3199 return " ${variableName} = ${jsValue};";
3200 }
3201 }
3202
3156 sub GenerateImplementationIndexedProperty 3203 sub GenerateImplementationIndexedProperty
3157 { 3204 {
3158 my $interface = shift; 3205 my $interface = shift;
3159 my $interfaceName = $interface->name; 3206 my $interfaceName = $interface->name;
3160 my $implClassName = GetImplClassName($interface); 3207 my $implClassName = GetImplClassName($interface);
3161 my $v8ClassName = GetV8ClassName($interface); 3208 my $v8ClassName = GetV8ClassName($interface);
3162 3209
3163 my $indexedGetterfunction = GetIndexedGetterFunction($interface); 3210 my $indexedGetterfunction = GetIndexedGetterFunction($interface);
3164 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; 3211 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"};
3165 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; 3212 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"};
(...skipping 27 matching lines...) Expand all
3193 my $code = ""; 3240 my $code = "";
3194 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; 3241 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter";
3195 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; 3242 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0";
3196 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. 3243 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment.
3197 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; 3244 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0";
3198 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; 3245 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator;
3199 $code .= ");\n"; 3246 $code .= ");\n";
3200 3247
3201 if ($indexedGetterfunction && !$hasCustomIndexedGetter) { 3248 if ($indexedGetterfunction && !$hasCustomIndexedGetter) {
3202 my $returnType = $indexedGetterfunction->signature->type; 3249 my $returnType = $indexedGetterfunction->signature->type;
3250 my $nativeType = GetNativeType($returnType);
3203 my $methodName = $indexedGetterfunction->signature->name; 3251 my $methodName = $indexedGetterfunction->signature->name;
3204 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"}; 3252 $methodName ||= $indexedGetterfunction->signature->extendedAttributes->{ "ImplementedAs"};
3205 AddToImplIncludes("bindings/v8/V8Collection.h"); 3253 AddToImplIncludes("bindings/v8/V8Collection.h");
3206 my $jsValue = ""; 3254 my $nativeExpression = "element";
3207 my $nativeType = GetNativeType($returnType); 3255 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3208 my $isNull = ""; 3256 my $isNull = GetIsNullExpression($returnType, "element");
3209 3257 my $genJSValueStatements = GetCreateJSValueStatements("jsValue", $return Type, $indexedGetterfunction->signature->extendedAttributes, $nativeExpression, "info.Holder()", "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 3258
3219 $implementation{nameSpaceWebCore}->add(<<END); 3259 $implementation{nameSpaceWebCore}->add(<<END);
3220 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) 3260 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info)
3221 { 3261 {
3222 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3262 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3223 ${implClassName}* collection = toNative(info.Holder()); 3263 ${implClassName}* collection = toNative(info.Holder());
3224 $nativeType element = collection->$methodName(index); 3264 $nativeType element = collection->$methodName(index);
3225 if ($isNull) 3265 if (${isNull})
3226 return v8Undefined(); 3266 return v8Undefined();
3227 return $jsValue; 3267
3268 v8::Handle<v8::Value> jsValue;
3269 $genJSValueStatements
3270 return jsValue;
3228 } 3271 }
3229 3272
3230 END 3273 END
3231 } 3274 }
3232 return $code; 3275 return $code;
3233 } 3276 }
3234 3277
3235 sub GenerateImplementationNamedPropertyGetter 3278 sub GenerateImplementationNamedPropertyGetter
3236 { 3279 {
3237 my $interface = shift; 3280 my $interface = shift;
3238 3281
3239 my $subCode = ""; 3282 my $subCode = "";
3240 my $interfaceName = $interface->name; 3283 my $interfaceName = $interface->name;
3241 my $implClassName = GetImplClassName($interface); 3284 my $implClassName = GetImplClassName($interface);
3242 my $v8ClassName = GetV8ClassName($interface); 3285 my $v8ClassName = GetV8ClassName($interface);
3243 3286
3244 my $namedGetterFunction = GetNamedGetterFunction($interface); 3287 my $namedGetterFunction = GetNamedGetterFunction($interface);
3245 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"}; 3288 my $hasCustomNamedGetter = $interface->extendedAttributes->{"CustomNamedGett er"};
3246 3289
3247 if ($namedGetterFunction && !$hasCustomNamedGetter) { 3290 if ($namedGetterFunction && !$hasCustomNamedGetter) {
3291 $subCode .= <<END;
3292 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0);
3293 END
3248 my $returnType = $namedGetterFunction->signature->type; 3294 my $returnType = $namedGetterFunction->signature->type;
3295 my $nativeType = GetNativeType($namedGetterFunction->signature->type);
3249 my $methodName = $namedGetterFunction->signature->name; 3296 my $methodName = $namedGetterFunction->signature->name;
3250 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"}; 3297 $methodName ||= $namedGetterFunction->signature->extendedAttributes->{"I mplementedAs"};
3251 AddToImplIncludes("bindings/v8/V8Collection.h"); 3298 AddToImplIncludes("bindings/v8/V8Collection.h");
3252 $subCode .= <<END; 3299 my $nativeExpression = "element";
3253 desc->InstanceTemplate()->SetNamedPropertyHandler(${v8ClassName}::namedPrope rtyGetter, 0, 0, 0, 0); 3300 $nativeExpression .= ".release()" if (IsRefPtrType($returnType));
3254 END 3301 my $isNull = GetIsNullExpression($returnType, "element");
3255 my $jsValue = ""; 3302 my $genJSValueStatements = GetCreateJSValueStatements("jsValue", $return Type, $namedGetterFunction->signature->extendedAttributes, $nativeExpression, "i nfo.Holder()", "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 3303
3268 $implementation{nameSpaceWebCore}->add(<<END); 3304 $implementation{nameSpaceWebCore}->add(<<END);
3269 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 3305 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)
3270 { 3306 {
3271 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) 3307 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty())
3272 return v8Undefined(); 3308 return v8Undefined();
3273 if (info.Holder()->HasRealNamedCallbackProperty(name)) 3309 if (info.Holder()->HasRealNamedCallbackProperty(name))
3274 return v8Undefined(); 3310 return v8Undefined();
3275 3311
3276 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); 3312 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));
3277 ${implClassName}* collection = toNative(info.Holder()); 3313 ${implClassName}* collection = toNative(info.Holder());
3278 AtomicString propertyName = toWebCoreAtomicString(name); 3314 AtomicString propertyName = toWebCoreAtomicString(name);
3279 ${nativeType} element = collection->${methodName}(propertyName); 3315 ${nativeType} element = collection->${methodName}(propertyName);
3280 if (${isNull}) 3316 if (${isNull})
3281 return v8Undefined(); 3317 return v8Undefined();
3282 return ${jsValue}; 3318
3319 v8::Handle<v8::Value> jsValue;
3320 $genJSValueStatements
3321 return jsValue;
kojih 2013/05/15 09:28:26 I had to create "create and set JSValue" statement
3283 } 3322 }
3284 3323
3285 END 3324 END
3286 } 3325 }
3287 3326
3288 if ($hasCustomNamedGetter) { 3327 if ($hasCustomNamedGetter) {
3289 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"}; 3328 my $hasCustomNamedSetter = $interface->extendedAttributes->{"CustomNamed Setter"};
3290 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" }; 3329 my $hasDeleter = $interface->extendedAttributes->{"CustomDeleteProperty" };
3291 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"}; 3330 my $hasEnumerator = $interface->extendedAttributes->{"CustomEnumeratePro perty"};
3292 my $setOn = "Instance"; 3331 my $setOn = "Instance";
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
4192 $code .= " return true;\n\n"; 4231 $code .= " return true;\n\n";
4193 $code .= " v8::HandleScope handleScope;\n\n"; 4232 $code .= " v8::HandleScope handleScope;\n\n";
4194 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; 4233 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n";
4195 $code .= " if (v8Context.IsEmpty())\n"; 4234 $code .= " if (v8Context.IsEmpty())\n";
4196 $code .= " return true;\n\n"; 4235 $code .= " return true;\n\n";
4197 $code .= " v8::Context::Scope scope(v8Context);\n\n"; 4236 $code .= " v8::Context::Scope scope(v8Context);\n\n";
4198 4237
4199 @args = (); 4238 @args = ();
4200 foreach my $param (@params) { 4239 foreach my $param (@params) {
4201 my $paramName = $param->name; 4240 my $paramName = $param->name;
4202 $code .= " v8::Handle<v8::Value> ${paramName}Handle = " . Nat iveToJSValue($param, $paramName, "v8::Handle<v8::Object>()", "v8Context->GetIsol ate()", "") . ";\n"; 4241 $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"; 4242 $code .= " if (${paramName}Handle.IsEmpty()) {\n";
4204 $code .= " if (!isScriptControllerTerminating())\n"; 4243 $code .= " if (!isScriptControllerTerminating())\n";
4205 $code .= " CRASH();\n"; 4244 $code .= " CRASH();\n";
4206 $code .= " return true;\n"; 4245 $code .= " return true;\n";
4207 $code .= " }\n"; 4246 $code .= " }\n";
4208 push(@args, " ${paramName}Handle"); 4247 push(@args, " ${paramName}Handle");
4209 } 4248 }
4210 4249
4211 if (scalar(@args) > 0) { 4250 if (scalar(@args) > 0) {
4212 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; 4251 $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 4604 # If the implementing class is a POD type, commit changes
4566 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { 4605 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) {
4567 $code .= $indent . "wrapper->commitChange();\n"; 4606 $code .= $indent . "wrapper->commitChange();\n";
4568 } 4607 }
4569 4608
4570 $return .= ".release()" if ($returnIsRef); 4609 $return .= ".release()" if ($returnIsRef);
4571 4610
4572 my $nativeValue; 4611 my $nativeValue;
4573 # FIXME: Update for all ScriptWrappables. 4612 # FIXME: Update for all ScriptWrappables.
4574 if (IsDOMNodeType($interfaceName)) { 4613 if (IsDOMNodeType($interfaceName)) {
4575 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSu ffix); 4614 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, "args.Holder()", "args.GetIsolate()", "arg s", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix);
4576 } else { 4615 } else {
4577 $nativeValue = NativeToJSValue($function->signature, $return, "args.Hold er()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); 4616 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, "args.Holder()", "args.GetIsolate()", 0, 0 , "ReturnUnsafeHandle", $forMainWorldSuffix);
4578 } 4617 }
4579 4618
4580 $code .= $indent . "return " . $nativeValue . ";\n"; 4619 $code .= $indent . "return " . $nativeValue . ";\n";
4581 4620
4582 return $code; 4621 return $code;
4583 } 4622 }
4584 4623
4585 sub GetNativeTypeFromSignature 4624 sub GetNativeTypeFromSignature
4586 { 4625 {
4587 my $signature = shift; 4626 my $signature = shift;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4642 return "double" if $type eq "Date"; 4681 return "double" if $type eq "Date";
4643 return "ScriptValue" if $type eq "any"; 4682 return "ScriptValue" if $type eq "any";
4644 return "Dictionary" if $type eq "Dictionary"; 4683 return "Dictionary" if $type eq "Dictionary";
4645 4684
4646 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; 4685 return "RefPtr<DOMStringList>" if $type eq "DOMStringList";
4647 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; 4686 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ;
4648 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; 4687 return "RefPtr<NodeFilter>" if $type eq "NodeFilter";
4649 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; 4688 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
4650 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; 4689 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver";
4651 4690
4691 # Union type
4692 if (ref $type) {
4693 my $types = $type->unionType->unionMemberTypes;
4694 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;
4695 return "WTF::UnionType2<" . (join ", ", @$types) . ">";
4696 }
4697
4652 # We need to check [ImplementedBy] extended attribute for wrapper types. 4698 # We need to check [ImplementedBy] extended attribute for wrapper types.
4653 if (IsWrapperType($type)) { 4699 if (IsWrapperType($type)) {
4654 my $interface = ParseInterface($type); 4700 my $interface = ParseInterface($type);
4655 my $implClassName = GetImplClassName($interface); 4701 my $implClassName = GetImplClassName($interface);
4656 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; 4702 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>";
4657 } 4703 }
4658 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; 4704 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter;
4659 4705
4660 my $arrayType = GetArrayType($type); 4706 my $arrayType = GetArrayType($type);
4661 my $sequenceType = GetSequenceType($type); 4707 my $sequenceType = GetSequenceType($type);
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
4970 return 1 if $type =~ /^SVG.*Element$/; 5016 return 1 if $type =~ /^SVG.*Element$/;
4971 5017
4972 return 1 if $type eq 'TestNode'; 5018 return 1 if $type eq 'TestNode';
4973 5019
4974 return 0; 5020 return 0;
4975 } 5021 }
4976 5022
4977 5023
4978 sub NativeToJSValue 5024 sub NativeToJSValue
4979 { 5025 {
4980 my $signature = shift; 5026 my $type = shift;
4981 my $value = shift; 5027 my $extendedAttributes = shift;
kojih 2013/05/15 09:28:26 Split signature into type and extendedAttributes b
5028 my $value = shift; # expression of native value
4982 my $getCreationContext = shift; 5029 my $getCreationContext = shift;
4983 my $getIsolate = shift; 5030 my $getIsolate = shift;
4984 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; 5031 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate;
4985 my $getHolderContainer = shift; 5032 my $getHolderContainer = shift;
4986 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; 5033 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : "";
4987 my $getScriptWrappable = shift; 5034 my $getScriptWrappable = shift;
4988 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; 5035 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : "";
4989 my $returnHandleType = shift; 5036 my $returnHandleType = shift;
4990 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; 5037 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : "";
4991 my $forMainWorldSuffix = shift; 5038 my $forMainWorldSuffix = shift;
4992 5039
4993 my $type = $signature->type; 5040 # Union type
5041 if (ref $type) {
5042 my $types = $type->unionType->unionMemberTypes;
5043 die "JSValue of UnionType can not be obtained as expression. use GetCrea teJSValueStatements() instead.\n";
5044 }
4994 5045
4995 return "v8Boolean($value, $getIsolate)" if $type eq "boolean"; 5046 return "v8Boolean($value, $getIsolate)" if $type eq "boolean";
4996 return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined() 5047 return "v8Undefined()" if $type eq "void"; # equivalent to v8Undefined()
4997 5048
4998 # HTML5 says that unsigned reflected attributes should be in the range 5049 # 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) 5050 # [0, 2^31). When a value isn't in this range, a default value (or 0)
5000 # should be returned instead. 5051 # should be returned instead.
5001 if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long " or $type eq "unsigned short")) { 5052 if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) {
5002 $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; 5053 $value =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g;
5003 return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)"; 5054 return "v8UnsignedInteger(std::max(0, " . $value . "), $getIsolate)";
5004 } 5055 }
5005 5056
5006 # For all the types where we use 'int' as the representation type, 5057 # For all the types where we use 'int' as the representation type,
5007 # we use v8Integer() which has a fast small integer conversion check. 5058 # we use v8Integer() which has a fast small integer conversion check.
5008 my $nativeType = GetNativeType($type); 5059 my $nativeType = GetNativeType($type);
5009 return "v8Integer($value, $getIsolate)" if $nativeType eq "int"; 5060 return "v8Integer($value, $getIsolate)" if $nativeType eq "int";
5010 return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned" ; 5061 return "v8UnsignedInteger($value, $getIsolate)" if $nativeType eq "unsigned" ;
5011 5062
5012 return "v8DateOrNull($value, $getIsolate)" if $type eq "Date"; 5063 return "v8DateOrNull($value, $getIsolate)" if $type eq "Date";
5013 # long long and unsigned long long are not representable in ECMAScript. 5064 # 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"; 5065 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); 5066 return "v8::Number::New($value)" if IsPrimitiveType($type);
5016 return "$value.v8Value()" if $nativeType eq "ScriptValue"; 5067 return "$value.v8Value()" if $nativeType eq "ScriptValue";
5017 5068
5018 if ($type eq "DOMString" or IsEnumType($type)) { 5069 if ($type eq "DOMString" or IsEnumType($type)) {
5019 my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"} ; 5070 my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"};
5020 if (defined $conv) { 5071 if (defined $conv) {
5021 return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null"; 5072 return "v8StringOrNull($value, $getIsolate$returnHandleTypeArg)" if $conv eq "Null";
5022 return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg) " if $conv eq "Undefined"; 5073 return "v8StringOrUndefined($value, $getIsolate$returnHandleTypeArg) " if $conv eq "Undefined";
5023 5074
5024 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; 5075 die "Unknown value for TreatReturnedNullStringAs extended attribute" ;
5025 } 5076 }
5026 return "v8String($value, $getIsolate$returnHandleTypeArg)"; 5077 return "v8String($value, $getIsolate$returnHandleTypeArg)";
5027 } 5078 }
5028 5079
5029 my $arrayType = GetArrayType($type); 5080 my $arrayType = GetArrayType($type);
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
5338 5389
5339 sub IsRefPtrType 5390 sub IsRefPtrType
5340 { 5391 {
5341 my $type = shift; 5392 my $type = shift;
5342 5393
5343 return 0 if IsPrimitiveType($type); 5394 return 0 if IsPrimitiveType($type);
5344 return 0 if GetArrayType($type); 5395 return 0 if GetArrayType($type);
5345 return 0 if GetSequenceType($type); 5396 return 0 if GetSequenceType($type);
5346 return 0 if $type eq "DOMString"; 5397 return 0 if $type eq "DOMString";
5347 return 0 if IsEnumType($type); 5398 return 0 if IsEnumType($type);
5399 return 0 if ref $type; # Union
5348 5400
5349 return 1; 5401 return 1;
5350 } 5402 }
5351 5403
5352 sub GetSVGTypeNeedingTearOff 5404 sub GetSVGTypeNeedingTearOff
5353 { 5405 {
5354 my $type = shift; 5406 my $type = shift;
5355 5407
5356 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; 5408 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ;
5357 return undef; 5409 return undef;
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
5684 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { 5736 if ($currentInterface->extendedAttributes->{$extendedAttribute}) {
5685 $found = 1; 5737 $found = 1;
5686 } 5738 }
5687 return 1 if $found; 5739 return 1 if $found;
5688 }, 0); 5740 }, 0);
5689 5741
5690 return $found; 5742 return $found;
5691 } 5743 }
5692 5744
5693 1; 5745 1;
OLDNEW
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/wtf/UnionType.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698