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 | |
3064 { | |
3065 my $unionMemberIndex = shift; | |
3066 my $unionMemberNumber = $unionMemberIndex + 1; | |
3067 return sprintf("Member%d", $unionMemberIndex+1); | |
3068 } | |
3069 | |
3070 sub GenerateIsNullExpression | |
3071 { | |
3072 my $type = shift; | |
3073 my $variableName = shift; | |
3074 if (IsUnionType($type)) { | |
3075 my $types = $type->unionMemberTypes; | |
3076 my @expression = (); | |
3077 for my $i (0 .. scalar(@$types)-1) { | |
3078 my $unionMemberType = $types->[$i]; | |
3079 my $unionMemberVariable = $variableName . GetUnionMemberVariableName ($i); | |
haraken
2013/05/17 07:10:37
Nit: You can write this like:
my $unionMemberVa
| |
3080 my $isNull = GenerateIsNullExpression($unionMemberType, $unionMember Variable); | |
3081 push @expression, $isNull; | |
3082 } | |
3083 return join " && ", @expression; | |
3084 } | |
3085 if (IsRefPtrType($type)) { | |
3086 return "!${variableName}"; | |
3087 } else { | |
3088 return "${variableName}.isNull()"; | |
3089 } | |
3090 } | |
3091 | |
3063 sub GenerateImplementationIndexedProperty | 3092 sub GenerateImplementationIndexedProperty |
3064 { | 3093 { |
3065 my $interface = shift; | 3094 my $interface = shift; |
3066 my $interfaceName = $interface->name; | 3095 my $interfaceName = $interface->name; |
3067 my $implClassName = GetImplName($interface); | 3096 my $implClassName = GetImplName($interface); |
3068 my $v8ClassName = GetV8ClassName($interface); | 3097 my $v8ClassName = GetV8ClassName($interface); |
3069 | 3098 |
3070 my $indexedGetterFunction = GetIndexedGetterFunction($interface); | 3099 my $indexedGetterFunction = GetIndexedGetterFunction($interface); |
3071 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; | 3100 my $hasCustomIndexedSetter = $interface->extendedAttributes->{"CustomIndexed Setter"}; |
3072 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; | 3101 my $hasCustomIndexedGetter = $interface->extendedAttributes->{"CustomIndexed Getter"}; |
(...skipping 27 matching lines...) Expand all Loading... | |
3100 my $code = ""; | 3129 my $code = ""; |
3101 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; | 3130 $code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${v8ClassN ame}::indexedPropertyGetter"; |
3102 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; | 3131 $code .= $hasCustomIndexedSetter ? ", ${v8ClassName}::indexedPropertySetter" : ", 0"; |
3103 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. | 3132 $code .= ", 0"; # IndexedPropertyQuery -- not being used at the moment. |
3104 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; | 3133 $code .= $hasDeleter ? ", ${v8ClassName}::indexedPropertyDeleter" : ", 0"; |
3105 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; | 3134 $code .= ", nodeCollectionIndexedPropertyEnumerator<${implClassName}>" if $h asEnumerator; |
3106 $code .= ");\n"; | 3135 $code .= ");\n"; |
3107 | 3136 |
3108 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { | 3137 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { |
3109 my $returnType = $indexedGetterFunction->signature->type; | 3138 my $returnType = $indexedGetterFunction->signature->type; |
3139 my $nativeType = GetNativeType($returnType); | |
3110 my $methodName = GetImplName($indexedGetterFunction->signature); | 3140 my $methodName = GetImplName($indexedGetterFunction->signature); |
3111 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3141 AddToImplIncludes("bindings/v8/V8Collection.h"); |
3112 my $returnJSValueCode = ""; | 3142 my $nativeValue = "element"; |
3113 my $nativeType = GetNativeType($returnType); | 3143 $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
3114 my $isNull = ""; | 3144 my $isNull = GenerateIsNullExpression($returnType, "element"); |
3115 | 3145 my $returnJSValueCode = NativeToJSValue($indexedGetterFunction->signatur e->type, $indexedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "return", "info.Holder()", "info.GetIsolate()", "info", "collection"); |
3116 if (IsRefPtrType($returnType)) { | 3146 my $callMethodCode = GenerateMethodCall($returnType, "element", "collect ion->${methodName}", "index"); |
haraken
2013/05/17 07:10:37
Nit: $callMethodCode => $methodCallCode
| |
3117 AddToImplIncludes("V8$returnType.h"); | 3147 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) | 3148 v8::Handle<v8::Value> ${v8ClassName}::indexedPropertyGetter(uint32_t index, cons t v8::AccessorInfo& info) |
3127 { | 3149 { |
3128 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); | 3150 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
3129 ${implClassName}* collection = toNative(info.Holder()); | 3151 ${implClassName}* collection = toNative(info.Holder()); |
3130 $nativeType element = collection->$methodName(index); | 3152 $callMethodCode |
3131 if ($isNull) | 3153 END |
3154 if (IsUnionType($returnType)) { | |
3155 $getterCode .= <<END; | |
3156 ${returnJSValueCode} | |
3157 return v8Undefined(); | |
3158 END | |
haraken
2013/05/17 07:10:37
Nit: You don't need to use here document just for
| |
3159 } else { | |
3160 $getterCode .= <<END; | |
3161 if (${isNull}) | |
3132 return v8Undefined(); | 3162 return v8Undefined(); |
3133 ${returnJSValueCode} | 3163 ${returnJSValueCode} |
3164 END | |
haraken
2013/05/17 07:10:37
Ditto.
| |
3165 } | |
3166 $getterCode .= <<END; | |
3134 } | 3167 } |
3135 | 3168 |
3136 END | 3169 END |
haraken
2013/05/17 07:10:37
Ditto.
| |
3170 $implementation{nameSpaceWebCore}->add($getterCode); | |
3137 } | 3171 } |
3138 return $code; | 3172 return $code; |
3139 } | 3173 } |
3140 | 3174 |
3141 sub GenerateImplementationNamedPropertyAccessors | 3175 sub GenerateImplementationNamedPropertyAccessors |
3142 { | 3176 { |
3143 my $interface = shift; | 3177 my $interface = shift; |
3144 | 3178 |
3145 my $interfaceName = $interface->name; | 3179 my $interfaceName = $interface->name; |
3146 my $implClassName = GetImplName($interface); | 3180 my $implClassName = GetImplName($interface); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3190 $subCode .= $hasSetter ? "${v8ClassName}::namedPropertySetter, " : "0, " ; | 3224 $subCode .= $hasSetter ? "${v8ClassName}::namedPropertySetter, " : "0, " ; |
3191 $subCode .= $hasQuery ? "${v8ClassName}::namedPropertyQuery, " : "0, "; | 3225 $subCode .= $hasQuery ? "${v8ClassName}::namedPropertyQuery, " : "0, "; |
3192 $subCode .= $hasDeleter ? "${v8ClassName}::namedPropertyDeleter, " : "0, "; | 3226 $subCode .= $hasDeleter ? "${v8ClassName}::namedPropertyDeleter, " : "0, "; |
3193 $subCode .= $hasEnumerator ? "${v8ClassName}::namedPropertyEnumerator" : "0"; | 3227 $subCode .= $hasEnumerator ? "${v8ClassName}::namedPropertyEnumerator" : "0"; |
3194 $subCode .= ");\n"; | 3228 $subCode .= ");\n"; |
3195 } | 3229 } |
3196 | 3230 |
3197 return $subCode; | 3231 return $subCode; |
3198 } | 3232 } |
3199 | 3233 |
3234 sub GenerateMethodCall | |
3235 { | |
3236 my $returnType = shift; # string or UnionType | |
3237 my $returnName = shift; | |
3238 my $functionExpression = shift; | |
3239 my $firstArgument = shift; | |
3240 if (IsUnionType($returnType)) { | |
3241 my $code = ""; | |
3242 my @extraArguments = (); | |
3243 for my $i (0..scalar(@{$returnType->unionMemberTypes})-1) { | |
3244 my $unionMemberType = $returnType->unionMemberTypes->[$i]; | |
3245 my $nativeType = GetNativeType($unionMemberType); | |
3246 my $unionMemberVariable = $returnName . GetUnionMemberVariableName($ i); | |
haraken
2013/05/17 07:10:37
Nit: my $unionMemberVariable = $returnName . $i;
| |
3247 $code .= " ${nativeType} ${unionMemberVariable};\n"; | |
3248 push @extraArguments, $unionMemberVariable; | |
3249 } | |
3250 $code .= " ${functionExpression}(${firstArgument}, " . (join ", ", @e xtraArguments) . ");"; | |
3251 return $code; | |
3252 } else { | |
3253 my $nativeType = GetNativeType($returnType); | |
3254 return " ${nativeType} element = ${functionExpression}(${firstArgumen t});" | |
3255 } | |
3256 } | |
3257 | |
3258 | |
3200 sub GenerateImplementationNamedPropertyGetter | 3259 sub GenerateImplementationNamedPropertyGetter |
3201 { | 3260 { |
3202 my $interface = shift; | 3261 my $interface = shift; |
3203 my $namedGetterFunction = shift; | 3262 my $namedGetterFunction = shift; |
3204 my $implClassName = GetImplName($interface); | 3263 my $implClassName = GetImplName($interface); |
3205 my $v8ClassName = GetV8ClassName($interface); | 3264 my $v8ClassName = GetV8ClassName($interface); |
3206 my $methodName = GetImplName($namedGetterFunction->signature); | 3265 my $methodName = GetImplName($namedGetterFunction->signature); |
3207 | 3266 |
3208 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3267 AddToImplIncludes("bindings/v8/V8Collection.h"); |
3209 my $returnType = $namedGetterFunction->signature->type; | 3268 my $returnType = $namedGetterFunction->signature->type; |
3210 my $nativeType = GetNativeType($returnType); | 3269 my $isNull = GenerateIsNullExpression($returnType, "element"); |
3211 my $isNull = ""; | 3270 my $nativeValue = "element"; |
3212 my $returnJSValueCode = ""; | 3271 $nativeValue .= ".release()" if (IsRefPtrType($returnType)); |
3272 my $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature->typ e, $namedGetterFunction->signature->extendedAttributes, $nativeValue, " ", "r eturn", "info.Holder()", "info.GetIsolate()", "info", "collection"); | |
3273 my $callMethodCode = GenerateMethodCall($returnType, "element", "collection- >${methodName}", "propertyName"); | |
haraken
2013/05/17 07:10:37
Nit: $methodCallCode
| |
3213 | 3274 |
3214 if (IsRefPtrType($returnType)) { | 3275 my $code = <<END; |
3215 AddToImplIncludes("V8$returnType.h"); | |
3216 $isNull = "!element"; | |
3217 $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "e lement.release()", " ", "return", "info.Holder()", "info.GetIsolate()", "info ", "collection", "", ""); | |
3218 } else { | |
3219 $isNull = "element.isNull()"; | |
3220 $returnJSValueCode = NativeToJSValue($namedGetterFunction->signature, "e lement", " ", "return", "info.Holder()", "info.GetIsolate()"); | |
3221 } | |
3222 | |
3223 $implementation{nameSpaceWebCore}->add(<<END); | |
3224 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) | 3276 v8::Handle<v8::Value> ${v8ClassName}::namedPropertyGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) |
3225 { | 3277 { |
3226 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) | 3278 if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(name).IsEmpty()) |
3227 return v8Undefined(); | 3279 return v8Undefined(); |
3228 if (info.Holder()->HasRealNamedCallbackProperty(name)) | 3280 if (info.Holder()->HasRealNamedCallbackProperty(name)) |
3229 return v8Undefined(); | 3281 return v8Undefined(); |
3230 | 3282 |
3231 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); | 3283 ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder())); |
3232 ${implClassName}* collection = toNative(info.Holder()); | 3284 ${implClassName}* collection = toNative(info.Holder()); |
3233 AtomicString propertyName = toWebCoreAtomicString(name); | 3285 AtomicString propertyName = toWebCoreAtomicString(name); |
3234 ${nativeType} element = collection->${methodName}(propertyName); | 3286 $callMethodCode |
3287 END | |
3288 if (IsUnionType($returnType)) { | |
3289 $code .= <<END; | |
3290 ${returnJSValueCode} | |
3291 return v8Undefined(); | |
3292 END | |
haraken
2013/05/17 07:10:37
Nit: Here document might not be needed.
| |
3293 } else { | |
3294 $code .= <<END; | |
3235 if (${isNull}) | 3295 if (${isNull}) |
3236 return v8Undefined(); | 3296 return v8Undefined(); |
3237 ${returnJSValueCode} | 3297 ${returnJSValueCode} |
3298 END | |
haraken
2013/05/17 07:10:37
Ditto.
| |
3299 } | |
3300 $code .= <<END; | |
3238 } | 3301 } |
3239 | 3302 |
3240 END | 3303 END |
haraken
2013/05/17 07:10:37
Ditto.
| |
3304 $implementation{nameSpaceWebCore}->add($code); | |
3241 } | 3305 } |
3242 | 3306 |
3243 sub GenerateImplementationCustomCall | 3307 sub GenerateImplementationCustomCall |
3244 { | 3308 { |
3245 my $interface = shift; | 3309 my $interface = shift; |
3246 my $code = ""; | 3310 my $code = ""; |
3247 | 3311 |
3248 my $v8ClassName = GetV8ClassName($interface); | 3312 my $v8ClassName = GetV8ClassName($interface); |
3249 | 3313 |
3250 if ($interface->extendedAttributes->{"CustomCall"}) { | 3314 if ($interface->extendedAttributes->{"CustomCall"}) { |
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4079 $code .= " return true;\n\n"; | 4143 $code .= " return true;\n\n"; |
4080 $code .= " v8::HandleScope handleScope;\n\n"; | 4144 $code .= " v8::HandleScope handleScope;\n\n"; |
4081 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; | 4145 $code .= " v8::Handle<v8::Context> v8Context = toV8Context(script ExecutionContext(), m_world.get());\n"; |
4082 $code .= " if (v8Context.IsEmpty())\n"; | 4146 $code .= " if (v8Context.IsEmpty())\n"; |
4083 $code .= " return true;\n\n"; | 4147 $code .= " return true;\n\n"; |
4084 $code .= " v8::Context::Scope scope(v8Context);\n\n"; | 4148 $code .= " v8::Context::Scope scope(v8Context);\n\n"; |
4085 | 4149 |
4086 @args = (); | 4150 @args = (); |
4087 foreach my $param (@params) { | 4151 foreach my $param (@params) { |
4088 my $paramName = $param->name; | 4152 my $paramName = $param->name; |
4089 $code .= NativeToJSValue($param, $paramName, " ", "v8::Handle <v8::Value> ${paramName}Handle =", "v8::Handle<v8::Object>()", "v8Context->GetIs olate()", "") . "\n"; | 4153 $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"; | 4154 $code .= " if (${paramName}Handle.IsEmpty()) {\n"; |
4091 $code .= " if (!isScriptControllerTerminating())\n"; | 4155 $code .= " if (!isScriptControllerTerminating())\n"; |
4092 $code .= " CRASH();\n"; | 4156 $code .= " CRASH();\n"; |
4093 $code .= " return true;\n"; | 4157 $code .= " return true;\n"; |
4094 $code .= " }\n"; | 4158 $code .= " }\n"; |
4095 push(@args, " ${paramName}Handle"); | 4159 push(@args, " ${paramName}Handle"); |
4096 } | 4160 } |
4097 | 4161 |
4098 if (scalar(@args) > 0) { | 4162 if (scalar(@args) > 0) { |
4099 $code .= "\n v8::Handle<v8::Value> argv[] = {\n"; | 4163 $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 | 4408 # If the implementing class is a POD type, commit changes |
4345 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { | 4409 if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$ /) { |
4346 $code .= $indent . "wrapper->commitChange();\n"; | 4410 $code .= $indent . "wrapper->commitChange();\n"; |
4347 } | 4411 } |
4348 | 4412 |
4349 $return .= ".release()" if ($returnIsRef); | 4413 $return .= ".release()" if ($returnIsRef); |
4350 | 4414 |
4351 my $nativeValue; | 4415 my $nativeValue; |
4352 # FIXME: Update for all ScriptWrappables. | 4416 # FIXME: Update for all ScriptWrappables. |
4353 if (IsDOMNodeType($interfaceName)) { | 4417 if (IsDOMNodeType($interfaceName)) { |
4354 $nativeValue = NativeToJSValue($function->signature, $return, $indent, " return", "args.Holder()", "args.GetIsolate()", "args", "imp", "ReturnUnsafeHandl e", $forMainWorldSuffix); | 4418 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", "args", "imp", "ReturnUnsafeHandle", $forMainWorldSuffix); |
4355 } else { | 4419 } else { |
4356 $nativeValue = NativeToJSValue($function->signature, $return, $indent, " return", "args.Holder()", "args.GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forM ainWorldSuffix); | 4420 $nativeValue = NativeToJSValue($function->signature->type, $function->si gnature->extendedAttributes, $return, $indent, "return", "args.Holder()", "args. GetIsolate()", 0, 0, "ReturnUnsafeHandle", $forMainWorldSuffix); |
4357 } | 4421 } |
4358 | 4422 |
4359 $code .= $nativeValue . "\n"; | 4423 $code .= $nativeValue . "\n"; |
4360 | 4424 |
4361 return $code; | 4425 return $code; |
4362 } | 4426 } |
4363 | 4427 |
4364 sub GetNativeTypeFromSignature | 4428 sub GetNativeTypeFromSignature |
4365 { | 4429 { |
4366 my $signature = shift; | 4430 my $signature = shift; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4421 return "double" if $type eq "Date"; | 4485 return "double" if $type eq "Date"; |
4422 return "ScriptValue" if $type eq "any"; | 4486 return "ScriptValue" if $type eq "any"; |
4423 return "Dictionary" if $type eq "Dictionary"; | 4487 return "Dictionary" if $type eq "Dictionary"; |
4424 | 4488 |
4425 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; | 4489 return "RefPtr<DOMStringList>" if $type eq "DOMStringList"; |
4426 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; | 4490 return "RefPtr<MediaQueryListListener>" if $type eq "MediaQueryListListener" ; |
4427 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; | 4491 return "RefPtr<NodeFilter>" if $type eq "NodeFilter"; |
4428 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; | 4492 return "RefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue"; |
4429 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; | 4493 return "RefPtr<XPathNSResolver>" if $type eq "XPathNSResolver"; |
4430 | 4494 |
4495 die "UnionType is not supported" if IsUnionType($type); | |
4496 | |
4431 # We need to check [ImplementedBy] extended attribute for wrapper types. | 4497 # We need to check [ImplementedBy] extended attribute for wrapper types. |
4432 if (IsWrapperType($type)) { | 4498 if (IsWrapperType($type)) { |
4433 my $interface = ParseInterface($type); | 4499 my $interface = ParseInterface($type); |
4434 my $implClassName = GetImplName($interface); | 4500 my $implClassName = GetImplName($interface); |
4435 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; | 4501 return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>"; |
4436 } | 4502 } |
4437 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; | 4503 return "RefPtr<${type}>" if IsRefPtrType($type) and not $isParameter; |
4438 | 4504 |
4439 my $arrayType = GetArrayType($type); | 4505 my $arrayType = GetArrayType($type); |
4440 my $sequenceType = GetSequenceType($type); | 4506 my $sequenceType = GetSequenceType($type); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4643 'long long' => 1, | 4709 'long long' => 1, |
4644 'long' => 1, | 4710 'long' => 1, |
4645 'short' => 1, | 4711 'short' => 1, |
4646 'unsigned int' => 1, | 4712 'unsigned int' => 1, |
4647 'unsigned long long' => 1, | 4713 'unsigned long long' => 1, |
4648 'unsigned long' => 1, | 4714 'unsigned long' => 1, |
4649 'unsigned short' => 1, | 4715 'unsigned short' => 1, |
4650 'void' => 1 | 4716 'void' => 1 |
4651 ); | 4717 ); |
4652 | 4718 |
4719 sub IsUnionType | |
4720 { | |
4721 my $type = shift; # string or UnionType | |
4722 if(ref($type) eq "UnionType") { | |
4723 die "Currently only 2 values of non-union type is supported as union typ e.\n" unless @{$type->unionMemberTypes} == 2; | |
4724 return 1; | |
4725 } | |
4726 return 0; | |
4727 } | |
4653 | 4728 |
4654 sub IsWrapperType | 4729 sub IsWrapperType |
4655 { | 4730 { |
4656 my $type = shift; | 4731 my $type = shift; |
4657 return 0 if GetArrayType($type); | 4732 return 0 if GetArrayType($type); |
4658 return 0 if GetSequenceType($type); | 4733 return 0 if GetSequenceType($type); |
4659 return 0 if IsEnumType($type); | 4734 return 0 if IsEnumType($type); |
4660 return !($non_wrapper_types{$type}); | 4735 return !($non_wrapper_types{$type}); |
4661 } | 4736 } |
4662 | 4737 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4719 return 1 if $type =~ /^SVG.*Element$/; | 4794 return 1 if $type =~ /^SVG.*Element$/; |
4720 | 4795 |
4721 return 1 if $type eq 'TestNode'; | 4796 return 1 if $type eq 'TestNode'; |
4722 | 4797 |
4723 return 0; | 4798 return 0; |
4724 } | 4799 } |
4725 | 4800 |
4726 | 4801 |
4727 sub NativeToJSValue | 4802 sub NativeToJSValue |
4728 { | 4803 { |
4729 my $signature = shift; | 4804 my $type = shift; |
4805 my $extendedAttributes = shift; | |
4730 my $nativeValue = shift; | 4806 my $nativeValue = shift; |
4731 my $indent = shift; # added before every line | 4807 my $indent = shift; # added before every line |
4732 my $receiver = shift; # "return" or "<variableName> =" | 4808 my $receiver = shift; # "return" or "<variableName> =" |
4733 my $getCreationContext = shift; | 4809 my $getCreationContext = shift; |
4734 my $getIsolate = shift; | 4810 my $getIsolate = shift; |
4735 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; | 4811 die "An Isolate is mandatory for native value => JS value conversion." unles s $getIsolate; |
4736 my $getHolderContainer = shift; | 4812 my $getHolderContainer = shift || ""; |
4737 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; | 4813 my $getHolderContainerArg = $getHolderContainer ? ", $getHolderContainer" : ""; |
4738 my $getScriptWrappable = shift; | 4814 my $getScriptWrappable = shift || ""; |
4739 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; | 4815 my $getScriptWrappableArg = $getScriptWrappable ? ", $getScriptWrappable" : ""; |
4740 my $returnHandleType = shift; | 4816 my $returnHandleType = shift || ""; |
4741 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; | 4817 my $returnHandleTypeArg = $returnHandleType ? ", $returnHandleType" : ""; |
4742 my $forMainWorldSuffix = shift; | 4818 my $forMainWorldSuffix = shift || ""; |
4743 | 4819 |
4744 my $type = $signature->type; | 4820 if (IsUnionType($type)) { |
4821 my $types = $type->unionMemberTypes; | |
4822 my @codes = (); | |
4823 for my $i (0 .. scalar(@$types)-1) { | |
4824 my $unionMemberType = $types->[$i]; | |
4825 my $unionMemberNumber = $i + 1; | |
4826 my $unionMemberVariable = $nativeValue . GetUnionMemberVariableName( $i); | |
4827 my $unionMemberNativeValue = $unionMemberVariable; | |
4828 $unionMemberNativeValue .= ".release()" if (IsRefPtrType($unionMembe rType)); | |
4829 my $returnJSValueCode = NativeToJSValue($unionMemberType, $extendedA ttributes, $unionMemberNativeValue, $indent . " ", $receiver, $getCreationCon text, $getIsolate, $getHolderContainer, $getScriptWrappable, $returnHandleType, $forMainWorldSuffix); | |
4830 my $isNotNull = "!" . GenerateIsNullExpression($unionMemberType, $un ionMemberVariable); | |
4831 my $code = ""; | |
4832 $code .= "${indent}if (${isNotNull})\n"; | |
4833 $code .= "${returnJSValueCode}"; | |
4834 push @codes, $code; | |
4835 } | |
4836 return join "\n", @codes; | |
4837 } | |
4745 | 4838 |
4746 return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; | 4839 return "$indent$receiver v8Boolean($nativeValue, $getIsolate);" if $type eq "boolean"; |
4747 return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalen t to v8Undefined() | 4840 return "$indent$receiver v8Undefined();" if $type eq "void"; # equivalen t to v8Undefined() |
4748 | 4841 |
4749 # HTML5 says that unsigned reflected attributes should be in the range | 4842 # 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) | 4843 # [0, 2^31). When a value isn't in this range, a default value (or 0) |
4751 # should be returned instead. | 4844 # should be returned instead. |
4752 if ($signature->extendedAttributes->{"Reflect"} and ($type eq "unsigned long " or $type eq "unsigned short")) { | 4845 if ($extendedAttributes->{"Reflect"} and ($type eq "unsigned long" or $type eq "unsigned short")) { |
4753 $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; | 4846 $nativeValue =~ s/getUnsignedIntegralAttribute/getIntegralAttribute/g; |
4754 return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);"; | 4847 return "$indent$receiver v8UnsignedInteger(std::max(0, " . $nativeValue . "), $getIsolate);"; |
4755 } | 4848 } |
4756 | 4849 |
4757 # For all the types where we use 'int' as the representation type, | 4850 # For all the types where we use 'int' as the representation type, |
4758 # we use v8Integer() which has a fast small integer conversion check. | 4851 # we use v8Integer() which has a fast small integer conversion check. |
4759 my $nativeType = GetNativeType($type); | 4852 my $nativeType = GetNativeType($type); |
4760 return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeTy pe eq "int"; | 4853 return "$indent$receiver v8Integer($nativeValue, $getIsolate);" if $nativeTy pe eq "int"; |
4761 return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $ nativeType eq "unsigned"; | 4854 return "$indent$receiver v8UnsignedInteger($nativeValue, $getIsolate);" if $ nativeType eq "unsigned"; |
4762 | 4855 |
4763 return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date"; | 4856 return "$indent$receiver v8DateOrNull($nativeValue, $getIsolate);" if $type eq "Date"; |
4764 # long long and unsigned long long are not representable in ECMAScript. | 4857 # 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"; | 4858 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); | 4859 return "$indent$receiver v8::Number::New($nativeValue);" if IsPrimitiveType( $type); |
4767 return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptV alue"; | 4860 return "$indent$receiver $nativeValue.v8Value();" if $nativeType eq "ScriptV alue"; |
4768 | 4861 |
4769 if ($type eq "DOMString" or IsEnumType($type)) { | 4862 if ($type eq "DOMString" or IsEnumType($type)) { |
4770 my $conv = $signature->extendedAttributes->{"TreatReturnedNullStringAs"} ; | 4863 my $conv = $extendedAttributes->{"TreatReturnedNullStringAs"}; |
4771 if (defined $conv) { | 4864 if (defined $conv) { |
4772 return "$indent$receiver v8StringOrNull($nativeValue, $getIsolate$re turnHandleTypeArg);" if $conv eq "Null"; | 4865 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"; | 4866 return "$indent$receiver v8StringOrUndefined($nativeValue, $getIsola te$returnHandleTypeArg);" if $conv eq "Undefined"; |
4774 | 4867 |
4775 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; | 4868 die "Unknown value for TreatReturnedNullStringAs extended attribute" ; |
4776 } | 4869 } |
4777 return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandle TypeArg);"; | 4870 return "$indent$receiver v8String($nativeValue, $getIsolate$returnHandle TypeArg);"; |
4778 } | 4871 } |
4779 | 4872 |
4780 my $arrayType = GetArrayType($type); | 4873 my $arrayType = GetArrayType($type); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5060 | 5153 |
5061 sub IsRefPtrType | 5154 sub IsRefPtrType |
5062 { | 5155 { |
5063 my $type = shift; | 5156 my $type = shift; |
5064 | 5157 |
5065 return 0 if IsPrimitiveType($type); | 5158 return 0 if IsPrimitiveType($type); |
5066 return 0 if GetArrayType($type); | 5159 return 0 if GetArrayType($type); |
5067 return 0 if GetSequenceType($type); | 5160 return 0 if GetSequenceType($type); |
5068 return 0 if $type eq "DOMString"; | 5161 return 0 if $type eq "DOMString"; |
5069 return 0 if IsEnumType($type); | 5162 return 0 if IsEnumType($type); |
5163 return 0 if IsUnionType($type); | |
5070 | 5164 |
5071 return 1; | 5165 return 1; |
5072 } | 5166 } |
5073 | 5167 |
5074 sub GetSVGTypeNeedingTearOff | 5168 sub GetSVGTypeNeedingTearOff |
5075 { | 5169 { |
5076 my $type = shift; | 5170 my $type = shift; |
5077 | 5171 |
5078 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; | 5172 return $svgTypeNeedingTearOff{$type} if exists $svgTypeNeedingTearOff{$type} ; |
5079 return undef; | 5173 return undef; |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5406 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { | 5500 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { |
5407 $found = 1; | 5501 $found = 1; |
5408 } | 5502 } |
5409 return 1 if $found; | 5503 return 1 if $found; |
5410 }, 0); | 5504 }, 0); |
5411 | 5505 |
5412 return $found; | 5506 return $found; |
5413 } | 5507 } |
5414 | 5508 |
5415 1; | 5509 1; |
OLD | NEW |