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 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1573 $code .= " return toV8Fast$forMainWorldSuffix($wrappedValue, info, im p);\n"; | 1573 $code .= " return toV8Fast$forMainWorldSuffix($wrappedValue, info, im p);\n"; |
| 1574 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) { | 1574 } elsif ($attribute->signature->type eq "SerializedScriptValue" && $attrExt- >{"CachedAttribute"}) { |
| 1575 my $getterFunc = ToMethodName($attribute->signature->name); | 1575 my $getterFunc = ToMethodName($attribute->signature->name); |
| 1576 $code .= <<END; | 1576 $code .= <<END; |
| 1577 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}(); | 1577 RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}(); |
| 1578 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate())); | 1578 value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Nul l(info.GetIsolate())); |
| 1579 info.Holder()->SetHiddenValue(propertyName, value); | 1579 info.Holder()->SetHiddenValue(propertyName, value); |
| 1580 return value; | 1580 return value; |
| 1581 END | 1581 END |
| 1582 } else { | 1582 } else { |
| 1583 $code .= NativeToJSValue($attribute->signature, $expression, " ", "re turn", "info.Holder()", "info.GetIsolate()", "info", "imp", "ReturnUnsafeHandle" , $forMainWorldSuffix) . "\n"; | 1583 $code .= NativeToJSValue($attribute->signature->type, $attribute->signat ure->extendedAttributes, $expression, " ", "return", "info.Holder()", "info.G etIsolate()", "info", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix) . "\n"; |
| 1584 } | 1584 } |
| 1585 | 1585 |
| 1586 $code .= "}\n\n"; # end of getter | 1586 $code .= "}\n\n"; # end of getter |
| 1587 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString; | 1587 $code .= "#endif // ${conditionalString}\n\n" if $conditionalString; |
| 1588 $implementation{nameSpaceInternal}->add($code); | 1588 $implementation{nameSpaceInternal}->add($code); |
| 1589 } | 1589 } |
| 1590 | 1590 |
| 1591 sub ShouldKeepAttributeAlive | 1591 sub ShouldKeepAttributeAlive |
| 1592 { | 1592 { |
| 1593 my ($interface, $attribute, $returnType) = @_; | 1593 my ($interface, $attribute, $returnType) = @_; |
| (...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3053 $code .= " } else {\n"; | 3053 $code .= " } else {\n"; |
| 3054 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; | 3054 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$ name\"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCall back, v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; |
| 3055 $code .= " }\n"; | 3055 $code .= " }\n"; |
| 3056 } else { | 3056 } else { |
| 3057 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; | 3057 $code .= " ${conditional}$template->Set(v8::String::NewSymbol(\"$name \"), v8::FunctionTemplate::New(${implClassName}V8Internal::${name}MethodCallback , v8Undefined(), ${signature}, $functionLength)$property_attributes);\n"; |
| 3058 } | 3058 } |
| 3059 $code .= "#endif // ${conditionalString}\n" if $conditionalString; | 3059 $code .= "#endif // ${conditionalString}\n" if $conditionalString; |
| 3060 return $code; | 3060 return $code; |
| 3061 } | 3061 } |
| 3062 | 3062 |
| 3063 sub GetUnionMemberVariableName | |
|
haraken
2013/05/17 05:44:48
This method can simply return '"member" . $index'.
| |
| 3064 { | |
| 3065 my $variableName = shift; | |
| 3066 my $unionMemberIndex = shift; | |
| 3067 my $unionMemberNumber = $unionMemberIndex + 1; | |
| 3068 return sprintf("%sMember%d", $variableName, $unionMemberIndex+1); | |
| 3069 } | |
| 3070 | |
| 3071 sub GetIsNullExpression | |
|
haraken
2013/05/17 05:44:48
Nit: GetIsNullExpression => GenerateIsNullExpressi
| |
| 3072 { | |
| 3073 my $type = shift; | |
| 3074 my $variableName = shift; | |
| 3075 if (IsUnionType($type)) { | |
| 3076 my $types = $type->unionMemberTypes; | |
| 3077 my @expression = (); | |
| 3078 for my $i (0 .. scalar(@$types)-1) { | |
| 3079 my $unionMemberType = $types->[$i]; | |
| 3080 my $unionMemberVariable = GetUnionMemberVariableName($variableName, $i); | |
| 3081 my $isNull = GetIsNullExpression($unionMemberType, $unionMemberVaria ble); | |
| 3082 push @expression, $isNull; | |
| 3083 } | |
| 3084 return join " && ", @expression; | |
| 3085 } | |
| 3086 if (IsRefPtrType($type)) { | |
| 3087 return "!${variableName}"; | |
| 3088 } else { | |
| 3089 return "${variableName}.isNull()"; | |
| 3090 } | |
| 3091 } | |
| 3092 | |
| 3093 sub GetIsNotNullExpression | |
|
haraken
2013/05/17 05:44:48
I don't think we need this. We can simply use:
| |
| 3094 { | |
| 3095 my $type = shift; | |
| 3096 my $variableName = shift; | |
| 3097 my $expression = GetIsNullExpression($type, $variableName); | |
| 3098 if ($expression =~ /^!/) { | |
| 3099 $expression =~ s/^!//; | |
| 3100 } else { | |
| 3101 $expression = "!" . $expression; | |
| 3102 } | |
| 3103 return $expression; | |
| 3104 } | |
| 3105 | |
| 3063 sub GenerateImplementationIndexedProperty | 3106 sub GenerateImplementationIndexedProperty |
| 3064 { | 3107 { |
| 3065 my $interface = shift; | 3108 my $interface = shift; |
| 3066 my $interfaceName = $interface->name; | 3109 my $interfaceName = $interface->name; |
| 3067 my $implClassName = GetImplName($interface); | 3110 my $implClassName = GetImplName($interface); |
| 3068 my $v8ClassName = GetV8ClassName($interface); | 3111 my $v8ClassName = GetV8ClassName($interface); |
| 3069 | 3112 |
| 3070 my $indexedGetterFunction = GetIndexedGetterFunction($interface); | 3113 my $indexedGetterFunction = GetIndexedGetterFunction($interface); |
| 3071 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; | 3114 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; |
| 3072 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; | 3115 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 3100 my $code = ""; | 3143 my $code = ""; |
| 3101 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; | 3144 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; |
| 3102 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; | 3145 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; |
| 3103 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. | 3146 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. |
| 3104 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; | 3147 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; |
| 3105 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; | 3148 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; |
| 3106 $code .= ");\n"; | 3149 $code .= ");\n"; |
| 3107 | 3150 |
| 3108 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { | 3151 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { |
| 3109 my $returnType = $indexedGetterFunction->signature->type; | 3152 my $returnType = $indexedGetterFunction->signature->type; |
| 3153 my $nativeType = GetNativeType($returnType); | |
| 3110 my $methodName = GetImplName($indexedGetterFunction->signature); | 3154 my $methodName = GetImplName($indexedGetterFunction->signature); |
| 3111 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3155 AddToImplIncludes("bindings/v8/V8Collection.h"); |
| 3112 my $returnJSValueCode = ""; | 3156 my $nativeValue = "element"; |
| 3113 my $nativeType = GetNativeType($returnType); | 3157 $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
| 3114 my $isNull = ""; | 3158 my $isNull = GetIsNullExpression($returnType, "element"); |
| 3115 | 3159 my $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signatur e->type, $indexedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection"); |
| 3116 if (IsRefPtrType($returnType)) { | 3160 my $callMethodCode = GetCallMethodCode($returnType, "element", "collecti on->${methodName}", "index"); |
| 3117 AddToImplIncludes("V8$returnType.h"); | 3161 my $getterCode = <<END; |
| 3118 $isNull = "!element"; | |
| 3119 $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signatu re, "element.release()", " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection", "", ""); | |
| 3120 } else { | |
| 3121 $isNull = "element.isNull()"; | |
| 3122 $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signatu re, "element", " ", "return", "info.Holder()", "info.GetIsolate()"); | |
| 3123 } | |
| 3124 | |
| 3125 $implementation{nameSpaceWebCore}->add(<<END); | |
| 3126 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) | 3162 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) |
| 3127 { | 3163 { |
| 3128 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); | 3164 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
| 3129 ${implClassName}* collection = toNative(info.Holder()); | 3165 ${implClassName}* collection = toNative(info.Holder()); |
| 3130 $nativeType element = collection->$methodName(index); | 3166 $callMethodCode |
| 3131 if ($isNull) | 3167 if (${isNull}) |
| 3132 return v8Undefined(); | 3168 return v8Undefined(); |
| 3133 ${returnJSValueCode} | 3169 ${returnJSValueCode} |
| 3170 END | |
| 3171 if (IsUnionType($returnType)) { | |
| 3172 $getterCode .= " ASSERT_NOT_REACHED();\n"; | |
| 3173 $getterCode .= " return v8Undefined();\n"; | |
| 3174 } | |
|
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
| |
| 3175 $getterCode .= <<END; | |
| 3134 } | 3176 } |
| 3135 | 3177 |
| 3136 END | 3178 END |
| 3179 $implementation{nameSpaceWebCore}->add($getterCode); | |
| 3137 } | 3180 } |
| 3138 return $code; | 3181 return $code; |
| 3139 } | 3182 } |
| 3140 | 3183 |
| 3141 sub GenerateImplementationNamedPropertyAccessors | 3184 sub GenerateImplementationNamedPropertyAccessors |
| 3142 { | 3185 { |
| 3143 my $interface = shift; | 3186 my $interface = shift; |
| 3144 | 3187 |
| 3145 my $interfaceName = $interface->name; | 3188 my $interfaceName = $interface->name; |
| 3146 my $implClassName = GetImplName($interface); | 3189 my $implClassName = GetImplName($interface); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3190 $subCode .= $hasSetter ? "${v8ClassName}::namedPropertySetter, " : "0, " ; | 3233 $subCode .= $hasSetter ? "${v8ClassName}::namedPropertySetter, " : "0, " ; |
| 3191 $subCode .= $hasQuery ? "${v8ClassName}::namedPropertyQuery, " : "0, "; | 3234 $subCode .= $hasQuery ? "${v8ClassName}::namedPropertyQuery, " : "0, "; |
| 3192 $subCode .= $hasDeleter ? "${v8ClassName}::namedPropertyDeleter, " : "0, "; | 3235 $subCode .= $hasDeleter ? "${v8ClassName}::namedPropertyDeleter, " : "0, "; |
| 3193 $subCode .= $hasEnumerator ? "${v8ClassName}::namedPropertyEnumerator" : "0"; | 3236 $subCode .= $hasEnumerator ? "${v8ClassName}::namedPropertyEnumerator" : "0"; |
| 3194 $subCode .= ");\n"; | 3237 $subCode .= ");\n"; |
| 3195 } | 3238 } |
| 3196 | 3239 |
| 3197 return $subCode; | 3240 return $subCode; |
| 3198 } | 3241 } |
| 3199 | 3242 |
| 3243 sub GetCallMethodCode | |
|
haraken
2013/05/17 05:44:48
Nit: GetCallMethodCode => GenerateMethodCall
| |
| 3244 { | |
| 3245 my $returnType = shift; # string or UnionType | |
| 3246 my $returnName = shift; | |
| 3247 my $functionExpression = shift; | |
| 3248 my $firstArgument = shift; | |
| 3249 if (IsUnionType($returnType)) { | |
| 3250 my $code = ""; | |
| 3251 my @extraArguments = (); | |
| 3252 for my $i (0..scalar(@{$returnType->unionMemberTypes})-1) { | |
| 3253 my $unionMemberType = $returnType->unionMemberTypes->[$i]; | |
| 3254 my $nativeType = GetNativeType($unionMemberType); | |
| 3255 my $unionMemberVariable = GetUnionMemberVariableName($returnName, $i ); | |
| 3256 $code .= " ${nativeType} ${unionMemberVariable};\n"; | |
| 3257 push @extraArguments, $unionMemberVariable; | |
| 3258 } | |
| 3259 $code .= " ${functionExpression}(${firstArgument}, " . (join ", ", @e xtraArguments) . ");"; | |
| 3260 return $code; | |
| 3261 } else { | |
| 3262 my $nativeType = GetNativeType($returnType); | |
| 3263 return " ${nativeType} element = ${functionExpression}(${firstArgumen t});" | |
| 3264 } | |
| 3265 } | |
| 3266 | |
| 3267 | |
| 3200 sub GenerateImplementationNamedPropertyGetter | 3268 sub GenerateImplementationNamedPropertyGetter |
| 3201 { | 3269 { |
| 3202 my $interface = shift; | 3270 my $interface = shift; |
| 3203 my $namedGetterFunction = shift; | 3271 my $namedGetterFunction = shift; |
| 3204 my $implClassName = GetImplName($interface); | 3272 my $implClassName = GetImplName($interface); |
| 3205 my $v8ClassName = GetV8ClassName($interface); | 3273 my $v8ClassName = GetV8ClassName($interface); |
| 3206 my $methodName = GetImplName($namedGetterFunction->signature); | 3274 my $methodName = GetImplName($namedGetterFunction->signature); |
| 3207 | 3275 |
| 3208 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3276 AddToImplIncludes("bindings/v8/V8Collection.h"); |
| 3209 my $returnType = $namedGetterFunction->signature->type; | 3277 my $returnType = $namedGetterFunction->signature->type; |
| 3210 my $nativeType = GetNativeType($returnType); | 3278 my $isNull = GetIsNullExpression($returnType, "element"); |
| 3211 my $isNull = ""; | 3279 my $nativeValue = "element"; |
| 3212 my $returnJSValueCode = ""; | 3280 $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
| 3281 my $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature->typ e, $namedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "r eturn", "info.Holder()", "info.GetIsolate()", "info", "collection"); | |
| 3282 my $callMethodCode = GetCallMethodCode($returnType, "element", "collection-> ${methodName}", "propertyName"); | |
| 3213 | 3283 |
| 3214 if (IsRefPtrType($returnType)) { | 3284 my $unionTypeAssertion = ""; |
| 3215 AddToImplIncludes("V8$returnType.h"); | 3285 if (IsUnionType($returnType)) { |
| 3216 $isNull = "!element"; | 3286 $unionTypeAssertion .= " ASSERT_NOT_REACHED();\n"; |
| 3217 $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "e lement.release()", " ", "return", "info.Holder()", "info.GetIsolate()", "info ", "collection", "", ""); | 3287 $unionTypeAssertion .= " return v8Undefined();"; |
| 3218 } else { | |
| 3219 $isNull = "element.isNull()"; | |
| 3220 $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "e lement", " ", "return", "info.Holder()", "info.GetIsolate()"); | |
| 3221 } | 3288 } |
|
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
| |
| 3222 | 3289 my $code = <<END; |
| 3223 $implementation{nameSpaceWebCore}->add(<<END); | |
| 3224 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) | 3290 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) |
| 3225 { | 3291 { |
| 3226 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) | 3292 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) |
| 3227 return v8Undefined(); | 3293 return v8Undefined(); |
| 3228 if (info.Holder()->HasRealNamedCallbackProperty(name)) | 3294 if (info.Holder()->HasRealNamedCallbackProperty(name)) |
| 3229 return v8Undefined(); | 3295 return v8Undefined(); |
| 3230 | 3296 |
| 3231 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); | 3297 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
| 3232 ${implClassName}* collection = toNative(info.Holder()); | 3298 ${implClassName}* collection = toNative(info.Holder()); |
| 3233 AtomicString propertyName = toWebCoreAtomicString(name); | 3299 AtomicString propertyName = toWebCoreAtomicString(name); |
| 3234 ${nativeType} element = collection->${methodName}(propertyName); | 3300 $callMethodCode |
| 3235 if (${isNull}) | 3301 if (${isNull}) |
| 3236 return v8Undefined(); | 3302 return v8Undefined(); |
| 3237 ${returnJSValueCode} | 3303 ${returnJSValueCode} |
| 3304 END | |
| 3305 if (IsUnionType($returnType)) { | |
| 3306 $code .= " ASSERT_NOT_REACHED();\n"; | |
| 3307 $code .= " return v8Undefined();\n"; | |
| 3308 } | |
|
haraken
2013/05/17 05:44:48
You can remove this. (See my comment in V8TestInte
| |
| 3309 $code .= <<END; | |
| 3238 } | 3310 } |
| 3239 | 3311 |
| 3240 END | 3312 END |
| 3313 $implementation{nameSpaceWebCore}->add($code); | |
| 3241 } | 3314 } |
| 3242 | 3315 |
| 3243 sub GenerateImplementationCustomCall | 3316 sub GenerateImplementationCustomCall |
| 3244 { | 3317 { |
| 3245 my $interface = shift; | 3318 my $interface = shift; |
| 3246 my $code = ""; | 3319 my $code = ""; |
| 3247 | 3320 |
| 3248 my $v8ClassName = GetV8ClassName($interface); | 3321 my $v8ClassName = GetV8ClassName($interface); |
| 3249 | 3322 |
| 3250 if ($interface->extendedAttributes->{"CustomCall"}) { | 3323 if ($interface->extendedAttributes->{"CustomCall"}) { |
| (...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4079 $code .= " return true;\n\n"; | 4152 $code .= " return true;\n\n"; |
| 4080 $code .= " v8::HandleScope handleScope;\n\n"; | 4153 $code .= " v8::HandleScope handleScope;\n\n"; |
| 4081 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; | 4154 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; |
| 4082 $code .= " if (v8Context.IsEmpty())\n"; | 4155 $code .= " if (v8Context.IsEmpty())\n"; |
| 4083 $code .= " return true;\n\n"; | 4156 $code .= " return true;\n\n"; |
| 4084 $code .= " v8::Context::Scope scope(v8Context);\n\n"; | 4157 $code .= " v8::Context::Scope scope(v8Context);\n\n"; |
| 4085 | 4158 |
| 4086 @args = (); | 4159 @args = (); |
| 4087 foreach my $param (@params) { | 4160 foreach my $param (@params) { |
| 4088 my $paramName = $param->name; | 4161 my $paramName = $param->name; |
| 4089 $code .= NativeToJSValue($param, $paramName, " ", "v8::Handle <v8::Value> ${paramName}Handle =", "v8::Handle<v8::Object>()", "v8Context->GetIs olate()", "") . "\n"; | 4162 $code .= NativeToJSValue($param->type, $param->extendedAttribute s, $paramName, " ", "v8::Handle<v8::Value> ${paramName}Handle =", "v8::Handle <v8::Object>()", "v8Context->GetIsolate()", "") . "\n"; |
| 4090 $code .= " if (${paramName}Handle.IsEmpty()) {\n"; | 4163 $code .= " if (${paramName}Handle.IsEmpty()) {\n"; |
| 4091 $code .= " if (!isScriptControllerTerminating())\n"; | 4164 $code .= " if (!isScriptControllerTerminating())\n"; |
| 4092 $code .= " CRASH();\n"; | 4165 $code .= " CRASH();\n"; |
| 4093 $code .= " return true;\n"; | 4166 $code .= " return true;\n"; |
| 4094 $code .= " }\n"; | 4167 $code .= " }\n"; |
| 4095 push(@args, " ${paramName}Handle"); | 4168 push(@args, " ${paramName}Handle"); |
| 4096 } | 4169 } |
| 4097 | 4170 |
| 4098 if (scalar(@args) > 0) { | 4171 if (scalar(@args) > 0) { |
| 4099 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; | 4172 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4344 # If the implementing class is a POD type, commit changes | 4417 # If the implementing class is a POD type, commit changes |
| 4345 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { | 4418 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { |
| 4346 $code .= $indent . "wrapper->commitChange();\n"; | 4419 $code .= $indent . "wrapper->commitChange();\n"; |
| 4347 } | 4420 } |
| 4348 | 4421 |
| 4349 $return .= ".release()" if ($returnIsRef); | 4422 $return .= ".release()" if ($returnIsRef); |
| 4350 | 4423 |
| 4351 my $nativeValue; | 4424 my $nativeValue; |
| 4352 # FIXME: Update for all ScriptWrappables. | 4425 # FIXME: Update for all ScriptWrappables. |
| 4353 if (IsDOMNodeType($interfaceName)) { | 4426 if (IsDOMNodeType($interfaceName)) { |
| 4354 $nativeValue = NativeToJSValue($function->signature, $return, $indent, " return", "args.Holder()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandl e", $forMainWorldSuffix); | 4427 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix); |
| 4355 } else { | 4428 } else { |
| 4356 $nativeValue = NativeToJSValue($function->signature, $return, $indent, " return", "args.Holder()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forM ainWorldSuffix); | 4429 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); |
| 4357 } | 4430 } |
| 4358 | 4431 |
| 4359 $code .= $nativeValue . "\n"; | 4432 $code .= $nativeValue . "\n"; |
| 4360 | 4433 |
| 4361 return $code; | 4434 return $code; |
| 4362 } | 4435 } |
| 4363 | 4436 |
| 4364 sub GetNativeTypeFromSignature | 4437 sub GetNativeTypeFromSignature |
| 4365 { | 4438 { |
| 4366 my $signature = shift; | 4439 my $signature = shift; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4421 return "double" if $type eq "Date"; | 4494 return "double" if $type eq "Date"; |
| 4422 return "ScriptValue" if $type eq "any"; | 4495 return "ScriptValue" if $type eq "any"; |
| 4423 return "Dictionary" if $type eq "Dictionary"; | 4496 return "Dictionary" if $type eq "Dictionary"; |
| 4424 | 4497 |
| 4425 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; | 4498 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; |
| 4426 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; | 4499 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; |
| 4427 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; | 4500 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; |
| 4428 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; | 4501 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; |
| 4429 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; | 4502 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; |
| 4430 | 4503 |
| 4504 if (IsUnionType($type)) { | |
| 4505 return ""; | |
|
haraken
2013/05/17 05:44:48
Is it correct to return ""? Or should this simply
| |
| 4506 } | |
| 4507 | |
| 4431 # We need to check [ImplementedBy] extended attribute for wrapper types. | 4508 # We need to check [ImplementedBy] extended attribute for wrapper types. |
| 4432 if (IsWrapperType($type)) { | 4509 if (IsWrapperType($type)) { |
| 4433 my $interface = ParseInterface($type); | 4510 my $interface = ParseInterface($type); |
| 4434 my $implClassName = GetImplName($interface); | 4511 my $implClassName = GetImplName($interface); |
| 4435 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; | 4512 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; |
| 4436 } | 4513 } |
| 4437 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; | 4514 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; |
| 4438 | 4515 |
| 4439 my $arrayType = GetArrayType($type); | 4516 my $arrayType = GetArrayType($type); |
| 4440 my $sequenceType = GetSequenceType($type); | 4517 my $sequenceType = GetSequenceType($type); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4643 'long long' => 1, | 4720 'long long' => 1, |
| 4644 'long' => 1, | 4721 'long' => 1, |
| 4645 'short' => 1, | 4722 'short' => 1, |
| 4646 'unsigned int' => 1, | 4723 'unsigned int' => 1, |
| 4647 'unsigned long long' => 1, | 4724 'unsigned long long' => 1, |
| 4648 'unsigned long' => 1, | 4725 'unsigned long' => 1, |
| 4649 'unsigned short' => 1, | 4726 'unsigned short' => 1, |
| 4650 'void' => 1 | 4727 'void' => 1 |
| 4651 ); | 4728 ); |
| 4652 | 4729 |
| 4730 sub IsUnionType | |
| 4731 { | |
| 4732 my $type = shift; # string or UnionType | |
| 4733 if(ref($type) eq "UnionType") { | |
| 4734 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless scalar(@{$type->unionMemberTypes}) == 2; | |
|
haraken
2013/05/17 05:44:48
Nit: 'scalar' is not needed.
| |
| 4735 return 1; | |
| 4736 } | |
| 4737 return 0; | |
| 4738 } | |
| 4653 | 4739 |
| 4654 sub IsWrapperType | 4740 sub IsWrapperType |
| 4655 { | 4741 { |
| 4656 my $type = shift; | 4742 my $type = shift; |
| 4657 return 0 if GetArrayType($type); | 4743 return 0 if GetArrayType($type); |
| 4658 return 0 if GetSequenceType($type); | 4744 return 0 if GetSequenceType($type); |
| 4659 return 0 if IsEnumType($type); | 4745 return 0 if IsEnumType($type); |
| 4660 return !($non_wrapper_types{$type}); | 4746 return !($non_wrapper_types{$type}); |
| 4661 } | 4747 } |
| 4662 | 4748 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4719 return 1 if $type =~ /^SVG.*Element$/; | 4805 return 1 if $type =~ /^SVG.*Element$/; |
| 4720 | 4806 |
| 4721 return 1 if $type eq 'TestNode'; | 4807 return 1 if $type eq 'TestNode'; |
| 4722 | 4808 |
| 4723 return 0; | 4809 return 0; |
| 4724 } | 4810 } |
| 4725 | 4811 |
| 4726 | 4812 |
| 4727 sub NativeToJSValue | 4813 sub NativeToJSValue |
| 4728 { | 4814 { |
| 4729 my $signature = shift; | 4815 my $type = shift; |
| 4816 my $extendedAttributes = shift; | |
| 4730 my $nativeValue = shift; | 4817 my $nativeValue = shift; |
| 4731 my $indent = shift; # added before every line | 4818 my $indent = shift; # added before every line |
| 4732 my $receiver = shift; # "return" or "<variableName> =" | 4819 my $receiver = shift; # "return" or "<variableName> =" |
| 4733 my $getCreationContext = shift; | 4820 my $getCreationContext = shift; |
| 4734 my $getIsolate = shift; | 4821 my $getIsolate = shift; |
| 4735 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; | 4822 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; |
| 4736 my $getHolderContainer = shift; | 4823 my $getHolderContainer = shift || ""; |
| 4737 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; | 4824 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; |
| 4738 my $getScriptWrappable = shift; | 4825 my $getScriptWrappable = shift || ""; |
| 4739 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; | 4826 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; |
| 4740 my $returnHandleType = shift; | 4827 my $returnHandleType = shift || ""; |
| 4741 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; | 4828 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; |
| 4742 my $forMainWorldSuffix = shift; | 4829 my $forMainWorldSuffix = shift || ""; |
| 4743 | 4830 |
| 4744 my $type = $signature->type; | 4831 if (IsUnionType($type)) { |
| 4832 my $types = $type->unionMemberTypes; | |
| 4833 my @codes = (); | |
| 4834 for my $i (0 .. scalar(@$types)-1) { | |
| 4835 my $unionMemberType = $types->[$i]; | |
| 4836 my $unionMemberNumber = $i + 1; | |
| 4837 my $unionMemberVariable = GetUnionMemberVariableName($nativeValue, $ i); | |
| 4838 my $nativeValue = $unionMemberVariable; | |
| 4839 $nativeValue .= ".release()" if (IsRefPtrType($unionMemberType)); | |
| 4840 my $returnJSValueCode = NativeToJSValue($unionMemberType, $extendedA ttributes, $nativeValue, $indent . " ", $receiver, $getCreationContext, $getI solate, $getHolderContainer, $getScriptWrappable, $returnHandleType, $forMainWor ldSuffix); | |
| 4841 my $isNotNull = GetIsNotNullExpression($unionMemberType, $unionMembe rVariable); | |
| 4842 my $code = ""; | |
| 4843 $code .= "${indent}if (${isNotNull})\n"; | |
| 4844 $code .= "${returnJSValueCode}"; | |
| 4845 push @codes, $code; | |
|
haraken
2013/05/17 05:44:48
You can put 'return v8Undefined()' at the last of
| |
| 4846 } | |
| 4847 return join "\n", @codes; | |
| 4848 } | |
| 4745 | 4849 |
| 4746 return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; | 4850 return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; |
| 4747 return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalen t to v8Undefined() | 4851 return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalen t to v8Undefined() |
| 4748 | 4852 |
| 4749 # HTML5 says that unsigned reflected attributes should be in the range | 4853 # HTML5 says that unsigned reflected attributes should be in the range |
| 4750 # [0, 2^31). When a value isn't in this range, a default value (or 0) | 4854 # [0, 2^31). When a value isn't in this range, a default value (or 0) |
| 4751 # should be returned instead. | 4855 # should be returned instead. |
| 4752 if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long " or $type eq "unsigned short")) { | 4856 if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) { |
| 4753 $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; | 4857 $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; |
| 4754 return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);"; | 4858 return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);"; |
| 4755 } | 4859 } |
| 4756 | 4860 |
| 4757 # For all the types where we use 'int' as the representation type, | 4861 # For all the types where we use 'int' as the representation type, |
| 4758 # we use v8Integer() which has a fast small integer conversion check. | 4862 # we use v8Integer() which has a fast small integer conversion check. |
| 4759 my $nativeType = GetNativeType($type); | 4863 my $nativeType = GetNativeType($type); |
| 4760 return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeTy pe eq "int"; | 4864 return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeTy pe eq "int"; |
| 4761 return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $ nativeType eq "unsigned"; | 4865 return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $ nativeType eq "unsigned"; |
| 4762 | 4866 |
| 4763 return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date"; | 4867 return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date"; |
| 4764 # long long and unsigned long long are not representable in ECMAScript. | 4868 # long long and unsigned long long are not representable in ECMAScript. |
| 4765 return "$indent$receiver v8::Number::New(static_cast<double>($nativeValue)); " if $type eq "long long" or $type eq "unsigned long long" or $type eq "DOMTimeS tamp"; | 4869 return "$indent$receiver v8::Number::New(static_cast<double>($nativeValue)); " if $type eq "long long" or $type eq "unsigned long long" or $type eq "DOMTimeS tamp"; |
| 4766 return "$indent$receiver v8::Number::New($nativeValue);" if IsPrimitiveType( $type); | 4870 return "$indent$receiver v8::Number::New($nativeValue);" if IsPrimitiveType( $type); |
| 4767 return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptV alue"; | 4871 return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptV alue"; |
| 4768 | 4872 |
| 4769 if ($type eq "DOMString" or IsEnumType($type)) { | 4873 if ($type eq "DOMString" or IsEnumType($type)) { |
| 4770 my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"} ; | 4874 my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"}; |
| 4771 if (defined $conv) { | 4875 if (defined $conv) { |
| 4772 return "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$re turnHandleTypeArg);" if $conv eq "Null"; | 4876 return "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$re turnHandleTypeArg);" if $conv eq "Null"; |
| 4773 return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsola te$returnHandleTypeArg);" if $conv eq "Undefined"; | 4877 return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsola te$returnHandleTypeArg);" if $conv eq "Undefined"; |
| 4774 | 4878 |
| 4775 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; | 4879 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; |
| 4776 } | 4880 } |
| 4777 return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandle TypeArg);"; | 4881 return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandle TypeArg);"; |
| 4778 } | 4882 } |
| 4779 | 4883 |
| 4780 my $arrayType = GetArrayType($type); | 4884 my $arrayType = GetArrayType($type); |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5060 | 5164 |
| 5061 sub IsRefPtrType | 5165 sub IsRefPtrType |
| 5062 { | 5166 { |
| 5063 my $type = shift; | 5167 my $type = shift; |
| 5064 | 5168 |
| 5065 return 0 if IsPrimitiveType($type); | 5169 return 0 if IsPrimitiveType($type); |
| 5066 return 0 if GetArrayType($type); | 5170 return 0 if GetArrayType($type); |
| 5067 return 0 if GetSequenceType($type); | 5171 return 0 if GetSequenceType($type); |
| 5068 return 0 if $type eq "DOMString"; | 5172 return 0 if $type eq "DOMString"; |
| 5069 return 0 if IsEnumType($type); | 5173 return 0 if IsEnumType($type); |
| 5174 return 0 if IsUnionType($type); | |
| 5070 | 5175 |
| 5071 return 1; | 5176 return 1; |
| 5072 } | 5177 } |
| 5073 | 5178 |
| 5074 sub GetSVGTypeNeedingTearOff | 5179 sub GetSVGTypeNeedingTearOff |
| 5075 { | 5180 { |
| 5076 my $type = shift; | 5181 my $type = shift; |
| 5077 | 5182 |
| 5078 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; | 5183 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; |
| 5079 return undef; | 5184 return undef; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5406 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { | 5511 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { |
| 5407 $found = 1; | 5512 $found = 1; |
| 5408 } | 5513 } |
| 5409 return 1 if $found; | 5514 return 1 if $found; |
| 5410 }, 0); | 5515 }, 0); |
| 5411 | 5516 |
| 5412 return $found; | 5517 return $found; |
| 5413 } | 5518 } |
| 5414 | 5519 |
| 5415 1; | 5520 1; |
| OLD | NEW |