Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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; |
| OLD | NEW |