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 3152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3163 } | 3163 } |
3164 if (IsRefPtrType($type)) { | 3164 if (IsRefPtrType($type)) { |
3165 return "!${variableName}"; | 3165 return "!${variableName}"; |
3166 } elsif ($type eq "DOMString") { | 3166 } elsif ($type eq "DOMString") { |
3167 return "${variableName}.isNull()"; | 3167 return "${variableName}.isNull()"; |
3168 } else { | 3168 } else { |
3169 return ""; | 3169 return ""; |
3170 } | 3170 } |
3171 } | 3171 } |
3172 | 3172 |
| 3173 sub GenerateIfElseStatement |
| 3174 { |
| 3175 my $type = shift; |
| 3176 my $outputVariableName = shift; |
| 3177 my $conditions = shift; |
| 3178 my $statements = shift; |
| 3179 |
| 3180 my $code = ""; |
| 3181 if (@$conditions == 1) { |
| 3182 $code .= " ${type} ${outputVariableName} = " . $statements->[0] . "\n
"; |
| 3183 } else { |
| 3184 $code .= " ${type} ${outputVariableName};\n"; |
| 3185 for my $i (0 .. @$conditions - 1) { |
| 3186 my $token = "else if"; |
| 3187 $token = "if" if $i == 0; |
| 3188 $token = "else" if $i == @$conditions - 1; |
| 3189 $code .= " ${token}"; |
| 3190 $code .= " (" . $conditions->[$i] . ")" if $conditions->[$i]; |
| 3191 $code .= "\n"; |
| 3192 $code .= " ${outputVariableName} = " . $statements->[$i] . "\
n"; |
| 3193 } |
| 3194 } |
| 3195 return $code; |
| 3196 } |
| 3197 |
3173 sub GenerateImplementationIndexedPropertyAccessors | 3198 sub GenerateImplementationIndexedPropertyAccessors |
3174 { | 3199 { |
3175 my $interface = shift; | 3200 my $interface = shift; |
3176 my $interfaceName = $interface->name; | 3201 my $interfaceName = $interface->name; |
3177 my $implClassName = GetImplName($interface); | 3202 my $implClassName = GetImplName($interface); |
3178 my $v8ClassName = GetV8ClassName($interface); | 3203 my $v8ClassName = GetV8ClassName($interface); |
3179 | 3204 |
3180 my $indexedGetterFunction = GetIndexedGetterFunction($interface); | 3205 my $indexedGetterFunction = GetIndexedGetterFunction($interface); |
3181 my $hasCustomIndexedGetter = $indexedGetterFunction ? $indexedGetterFunction
->signature->extendedAttributes->{"Custom"} : 0; | 3206 my $hasCustomIndexedGetter = $indexedGetterFunction ? $indexedGetterFunction
->signature->extendedAttributes->{"Custom"} : 0; |
3182 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { | 3207 if ($indexedGetterFunction && !$hasCustomIndexedGetter) { |
3183 GenerateImplementationIndexedPropertyGetter($interface, $indexedGetterFu
nction); | 3208 GenerateImplementationIndexedPropertyGetter($interface, $indexedGetterFu
nction); |
3184 } | 3209 } |
3185 | 3210 |
3186 # FIXME: Support generated indexed setter bindings. | |
3187 my $indexedSetterFunction = GetIndexedSetterFunction($interface); | 3211 my $indexedSetterFunction = GetIndexedSetterFunction($interface); |
3188 my $hasCustomIndexedSetter = $indexedSetterFunction ? $indexedSetterFunction
->signature->extendedAttributes->{"Custom"} : 0; | 3212 my $hasCustomIndexedSetter = $indexedSetterFunction ? $indexedSetterFunction
->signature->extendedAttributes->{"Custom"} : 0; |
| 3213 if ($indexedSetterFunction && !$hasCustomIndexedSetter) { |
| 3214 GenerateImplementationIndexedPropertySetter($interface, $indexedSetterFu
nction); |
| 3215 } |
3189 | 3216 |
3190 my $indexedDeleterFunction = GetIndexedDeleterFunction($interface); | 3217 my $indexedDeleterFunction = GetIndexedDeleterFunction($interface); |
3191 my $hasCustomIndexedDeleter = $indexedDeleterFunction ? $indexedDeleterFunct
ion->signature->extendedAttributes->{"Custom"} : 0; | 3218 my $hasCustomIndexedDeleter = $indexedDeleterFunction ? $indexedDeleterFunct
ion->signature->extendedAttributes->{"Custom"} : 0; |
3192 if ($indexedDeleterFunction && !$hasCustomIndexedDeleter) { | 3219 if ($indexedDeleterFunction && !$hasCustomIndexedDeleter) { |
3193 GenerateImplementationIndexedPropertyDeleter($interface, $indexedDeleter
Function); | 3220 GenerateImplementationIndexedPropertyDeleter($interface, $indexedDeleter
Function); |
3194 } | 3221 } |
3195 | 3222 |
3196 # FIXME: Support generated named enumerator bindings. | 3223 # FIXME: Support generated named enumerator bindings. |
3197 my $hasEnumerator = $indexedGetterFunction; | 3224 my $hasEnumerator = $indexedGetterFunction; |
3198 # FIXME: Remove the special cases. Interfaces that have indexedPropertyGette
r should have indexedPropertyEnumerator. | 3225 # FIXME: Remove the special cases. Interfaces that have indexedPropertyGette
r should have indexedPropertyEnumerator. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3266 $getterCode .= " return v8Undefined();\n"; | 3293 $getterCode .= " return v8Undefined();\n"; |
3267 } else { | 3294 } else { |
3268 $getterCode .= " if (${isNull})\n"; | 3295 $getterCode .= " if (${isNull})\n"; |
3269 $getterCode .= " return v8Undefined();\n"; | 3296 $getterCode .= " return v8Undefined();\n"; |
3270 $getterCode .= $returnJSValueCode . "\n"; | 3297 $getterCode .= $returnJSValueCode . "\n"; |
3271 } | 3298 } |
3272 $getterCode .= "}\n\n"; | 3299 $getterCode .= "}\n\n"; |
3273 $implementation{nameSpaceWebCore}->add($getterCode); | 3300 $implementation{nameSpaceWebCore}->add($getterCode); |
3274 } | 3301 } |
3275 | 3302 |
| 3303 sub GenerateImplementationIndexedPropertySetter |
| 3304 { |
| 3305 my $interface = shift; |
| 3306 my $indexedSetterFunction = shift; |
| 3307 my $implClassName = GetImplName($interface); |
| 3308 my $v8ClassName = GetV8ClassName($interface); |
| 3309 my $methodName = GetImplName($indexedSetterFunction->signature); |
| 3310 |
| 3311 AddToImplIncludes("bindings/v8/V8Collection.h"); |
| 3312 my $type = $indexedSetterFunction->parameters->[1]->type; |
| 3313 my $raisesExceptions = $indexedSetterFunction->signature->extendedAttributes
->{"RaisesException"}; |
| 3314 my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttribute
s->{"TreatNullAs"}; |
| 3315 my $treatUndefinedAs = $indexedSetterFunction->parameters->[1]->extendedAttr
ibutes->{"TreatUndefinedAs"}; |
| 3316 my $code = "v8::Handle<v8::Value> ${v8ClassName}::indexedPropertySetter(uint
32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\n"; |
| 3317 $code .= "{\n"; |
| 3318 $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; |
| 3319 $code .= GenerateNativeValueDefinition($indexedSetterFunction, $indexedSette
rFunction->parameters->[1], "value", "propertyValue", "info.GetIsolate()"); |
| 3320 |
| 3321 my $extraArguments = ""; |
| 3322 if ($raisesExceptions) { |
| 3323 $code .= " ExceptionCode ec = 0;\n"; |
| 3324 $extraArguments = ", ec"; |
| 3325 } |
| 3326 my $passNativeValue = "propertyValue"; |
| 3327 $passNativeValue .= ".release()" if (IsRefPtrType($type)); |
| 3328 |
| 3329 my @conditions = (); |
| 3330 my @statements = (); |
| 3331 if ($treatNullAs && $treatNullAs ne "NullString") { |
| 3332 push @conditions, "value->IsNull()"; |
| 3333 push @statements, "collection->${treatNullAs}(index$extraArguments);"; |
| 3334 } |
| 3335 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { |
| 3336 push @conditions, "value->IsUndefined()"; |
| 3337 push @statements, "collection->${treatUndefinedAs}(index$extraArguments)
;"; |
| 3338 } |
| 3339 push @conditions, ""; |
| 3340 push @statements, "collection->${methodName}(index, $passNativeValue$extraAr
guments);"; |
| 3341 $code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statement
s); |
| 3342 |
| 3343 $code .= " if (!result)\n"; |
| 3344 $code .= " return v8Undefined();\n"; |
| 3345 if ($raisesExceptions) { |
| 3346 $code .= " if (ec)\n"; |
| 3347 $code .= " return setDOMException(ec, info.GetIsolate());\n"; |
| 3348 } |
| 3349 $code .= " return value;\n"; |
| 3350 $code .= "}\n\n"; |
| 3351 $implementation{nameSpaceWebCore}->add($code); |
| 3352 } |
| 3353 |
3276 sub GenerateImplementationNamedPropertyAccessors | 3354 sub GenerateImplementationNamedPropertyAccessors |
3277 { | 3355 { |
3278 my $interface = shift; | 3356 my $interface = shift; |
3279 | 3357 |
3280 my $interfaceName = $interface->name; | 3358 my $interfaceName = $interface->name; |
3281 my $implClassName = GetImplName($interface); | 3359 my $implClassName = GetImplName($interface); |
3282 my $v8ClassName = GetV8ClassName($interface); | 3360 my $v8ClassName = GetV8ClassName($interface); |
3283 | 3361 |
3284 my $namedGetterFunction = GetNamedGetterFunction($interface); | 3362 my $namedGetterFunction = GetNamedGetterFunction($interface); |
3285 my $hasCustomNamedGetter = $namedGetterFunction ? $namedGetterFunction->sign
ature->extendedAttributes->{"Custom"} : 0; | 3363 my $hasCustomNamedGetter = $namedGetterFunction ? $namedGetterFunction->sign
ature->extendedAttributes->{"Custom"} : 0; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3412 $code .= " return v8Undefined();\n"; | 3490 $code .= " return v8Undefined();\n"; |
3413 } else { | 3491 } else { |
3414 $code .= " if (${isNull})\n"; | 3492 $code .= " if (${isNull})\n"; |
3415 $code .= " return v8Undefined();\n"; | 3493 $code .= " return v8Undefined();\n"; |
3416 $code .= $returnJSValueCode . "\n"; | 3494 $code .= $returnJSValueCode . "\n"; |
3417 } | 3495 } |
3418 $code .= "}\n\n"; | 3496 $code .= "}\n\n"; |
3419 $implementation{nameSpaceWebCore}->add($code); | 3497 $implementation{nameSpaceWebCore}->add($code); |
3420 } | 3498 } |
3421 | 3499 |
| 3500 sub GenerateNativeValueDefinition |
| 3501 { |
| 3502 my $function = shift; |
| 3503 my $parameter = shift; |
| 3504 my $jsValue = shift; |
| 3505 my $nativeValueName = shift; |
| 3506 my $getIsolate = shift; |
| 3507 |
| 3508 my $treatNullAs = $parameter->extendedAttributes->{"TreatNullAs"} || ""; |
| 3509 my $treatUndefinedAs = $parameter->extendedAttributes->{"TreatUndefinedAs"}
|| ""; |
| 3510 my $code = ""; |
| 3511 my $nativeType = GetNativeType($parameter->type); |
| 3512 my $nativeValue = JSValueToNative($parameter->type, $function->signature->ex
tendedAttributes, $jsValue, $getIsolate); |
| 3513 if ($parameter->type eq "DOMString") { |
| 3514 my $nullCheck = ""; |
| 3515 if ($treatNullAs eq "NullString") { |
| 3516 $nullCheck = "WithUndefinedOrNullCheck"; |
| 3517 if ($treatUndefinedAs eq "NullString") { |
| 3518 $nullCheck = "WithNullCheck"; |
| 3519 } |
| 3520 } |
| 3521 $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullChe
ck}>, ${nativeValueName}, ${jsValue});\n"; |
| 3522 } else { |
| 3523 $code .= " ${nativeType} ${nativeValueName} = ${nativeValue};\n"; |
| 3524 } |
| 3525 return $code; |
| 3526 } |
| 3527 |
3422 sub GenerateImplementationNamedPropertySetter | 3528 sub GenerateImplementationNamedPropertySetter |
3423 { | 3529 { |
3424 my $interface = shift; | 3530 my $interface = shift; |
3425 my $namedSetterFunction = shift; | 3531 my $namedSetterFunction = shift; |
3426 my $implClassName = GetImplName($interface); | 3532 my $implClassName = GetImplName($interface); |
3427 my $v8ClassName = GetV8ClassName($interface); | 3533 my $v8ClassName = GetV8ClassName($interface); |
3428 my $methodName = GetImplName($namedSetterFunction->signature); | 3534 my $methodName = GetImplName($namedSetterFunction->signature); |
3429 | 3535 |
3430 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3536 AddToImplIncludes("bindings/v8/V8Collection.h"); |
3431 my $type = $namedSetterFunction->parameters->[1]->type; | |
3432 my $nativeType = GetNativeType($type); | |
3433 my $raisesExceptions = $namedSetterFunction->signature->extendedAttributes->
{"RaisesException"}; | 3537 my $raisesExceptions = $namedSetterFunction->signature->extendedAttributes->
{"RaisesException"}; |
3434 my $nativeValue = JSValueToNative($type, $namedSetterFunction->signature->ex
tendedAttributes, "value", "info.GetIsolate()"); | 3538 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttributes-
>{"TreatNullAs"}; |
| 3539 my $treatUndefinedAs = $namedSetterFunction->parameters->[1]->extendedAttrib
utes->{"TreatUndefinedAs"}; |
3435 | 3540 |
3436 my $code = "v8::Handle<v8::Value> ${v8ClassName}::namedPropertySetter(v8::Lo
cal<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\
n"; | 3541 my $code = "v8::Handle<v8::Value> ${v8ClassName}::namedPropertySetter(v8::Lo
cal<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)\
n"; |
3437 $code .= "{\n"; | 3542 $code .= "{\n"; |
3438 if (!$namedSetterFunction->signature->extendedAttributes->{"OverrideBuiltins
"}) { | 3543 if (!$namedSetterFunction->signature->extendedAttributes->{"OverrideBuiltins
"}) { |
3439 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n
ame).IsEmpty())\n"; | 3544 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n
ame).IsEmpty())\n"; |
3440 $code .= " return v8Undefined();\n"; | 3545 $code .= " return v8Undefined();\n"; |
3441 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n"; | 3546 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n"; |
3442 $code .= " return v8Undefined();\n"; | 3547 $code .= " return v8Undefined();\n"; |
3443 } | 3548 } |
3444 $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; | 3549 $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; |
3445 $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<>, propertyNa
me, name);\n"; | 3550 $code .= GenerateNativeValueDefinition($namedSetterFunction, $namedSetterFun
ction->parameters->[0], "name", "propertyName", "info.GetIsolate()"); |
| 3551 $code .= GenerateNativeValueDefinition($namedSetterFunction, $namedSetterFun
ction->parameters->[1], "value", "propertyValue", "info.GetIsolate()"); |
3446 my $extraArguments = ""; | 3552 my $extraArguments = ""; |
3447 if ($raisesExceptions) { | 3553 if ($raisesExceptions) { |
3448 $code .= " ExceptionCode ec = 0;\n"; | 3554 $code .= " ExceptionCode ec = 0;\n"; |
3449 $extraArguments = ", ec"; | 3555 $extraArguments = ", ec"; |
3450 } | 3556 } |
3451 if ($type eq "DOMString") { | 3557 |
3452 my $nullCheck = ""; | 3558 my @conditions = (); |
3453 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttribu
tes->{"TreatNullAs"}; | 3559 my @statements = (); |
3454 if ($treatNullAs && $treatNullAs eq "NullString") { | 3560 if ($treatNullAs && $treatNullAs ne "NullString") { |
3455 $nullCheck = "WithNullCheck"; | 3561 push @conditions, "value->IsNull()"; |
3456 } | 3562 push @statements, "collection->${treatNullAs}(propertyName$extraArgument
s);"; |
3457 $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullChe
ck}>, propertyValue, value);\n"; | |
3458 } else { | |
3459 $code .= " $nativeType propertyValue = $nativeValue;\n"; | |
3460 } | 3563 } |
3461 $code .= " bool result = collection->${methodName}(propertyName, property
Value$extraArguments);\n"; | 3564 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { |
| 3565 push @conditions, "value->IsUndefined()"; |
| 3566 push @statements, "collection->${treatUndefinedAs}(propertyName$extraArg
uments);"; |
| 3567 } |
| 3568 push @conditions, ""; |
| 3569 push @statements, "collection->${methodName}(propertyName, propertyValue$ext
raArguments);"; |
| 3570 $code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statement
s); |
| 3571 |
3462 $code .= " if (!result)\n"; | 3572 $code .= " if (!result)\n"; |
3463 $code .= " return v8Undefined();\n"; | 3573 $code .= " return v8Undefined();\n"; |
3464 if ($raisesExceptions) { | 3574 if ($raisesExceptions) { |
3465 $code .= " if (ec)\n"; | 3575 $code .= " if (ec)\n"; |
3466 $code .= " return setDOMException(ec, info.GetIsolate());\n"; | 3576 $code .= " return setDOMException(ec, info.GetIsolate());\n"; |
3467 } | 3577 } |
3468 $code .= " return value;\n"; | 3578 $code .= " return value;\n"; |
3469 $code .= "}\n\n"; | 3579 $code .= "}\n\n"; |
3470 $implementation{nameSpaceWebCore}->add($code); | 3580 $implementation{nameSpaceWebCore}->add($code); |
3471 } | 3581 } |
(...skipping 2182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5654 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { | 5764 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { |
5655 $found = 1; | 5765 $found = 1; |
5656 } | 5766 } |
5657 return 1 if $found; | 5767 return 1 if $found; |
5658 }, 0); | 5768 }, 0); |
5659 | 5769 |
5660 return $found; | 5770 return $found; |
5661 } | 5771 } |
5662 | 5772 |
5663 1; | 5773 1; |
OLD | NEW |