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

Side by Side Diff: Source/bindings/scripts/CodeGeneratorV8.pm

Issue 15076011: Support union return type for anonymous named/indexed getter (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> 1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com> 2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> 3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> 4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
5 # Copyright (C) 2006 Apple Computer, Inc. 5 # Copyright (C) 2006 Apple Computer, Inc.
6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc. 6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc.
7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> 7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
8 # Copyright (C) Research In Motion Limited 2010. All rights reserved. 8 # Copyright (C) Research In Motion Limited 2010. All rights reserved.
9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 # Copyright (C) 2012 Ericsson AB. All rights reserved. 10 # Copyright (C) 2012 Ericsson AB. All rights reserved.
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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;
OLDNEW
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLParser.pm » ('j') | Source/bindings/tests/results/V8TestInterface.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698