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) { | |
haraken
2013/05/29 08:51:05
Nit: Spaced needed around '-'.
| |
3186 my $token = "else if"; | |
3187 $token = "if" if $i == 0; | |
3188 $token = "else" if $i == @$conditions-1; | |
haraken
2013/05/29 08:51:05
Ditto.
| |
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 .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($in dexedSetterFunction, 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 # Example: | |
3501 # GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($function, 0, "name", "propertyName", "info.GetIsolate()") | |
3502 # return | |
3503 # "V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<>, propertyName, name);" | |
haraken
2013/05/29 08:51:05
Nit: I don't think this comment is needed. (If you
| |
3504 sub GenerateNativeVariableDefinitionCorrespondingToJSValueParameter | |
kojih
2013/05/29 08:40:54
I think I can simplify some more code using this i
haraken
2013/05/29 08:51:05
Yes, let's do it.
BTW, the method name is too lon
| |
3505 { | |
3506 my $function = shift; # domFunction | |
haraken
2013/05/29 08:51:05
Nit: Remove the comment.
| |
3507 my $parameterIndex = shift; | |
haraken
2013/05/29 08:51:05
You can pass $parameter instead of index.
| |
3508 my $jsValue = shift; | |
3509 my $nativeValueName = shift; | |
3510 my $getIsolate = shift; | |
3511 | |
3512 my $parameter = $function->parameters->[$parameterIndex]; | |
3513 my $treatNullAs = $parameter->extendedAttributes->{"TreatNullAs"} || ""; | |
3514 my $treatUndefinedAs = $parameter->extendedAttributes->{"TreatUndefinedAs"} || ""; | |
3515 my $code = ""; | |
3516 my $nativeType = GetNativeType($parameter->type); | |
3517 my $nativeValue = JSValueToNative($parameter->type, $function->signature->ex tendedAttributes, $jsValue, $getIsolate); | |
3518 if ($parameter->type eq "DOMString") { | |
3519 my $nullCheck = ""; | |
3520 if ($treatNullAs eq "NullString") { | |
3521 $nullCheck = "WithUndefinedOrNullCheck"; | |
3522 if ($treatUndefinedAs eq "NullString") { | |
3523 $nullCheck = "WithNullCheck"; | |
3524 } | |
3525 } | |
3526 $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<${nullChe ck}>, ${nativeValueName}, ${jsValue});\n"; | |
3527 } else { | |
3528 $code .= " ${nativeType} ${nativeValueName} = ${nativeValue};\n"; | |
3529 } | |
3530 return $code; | |
3531 } | |
3532 | |
3422 sub GenerateImplementationNamedPropertySetter | 3533 sub GenerateImplementationNamedPropertySetter |
3423 { | 3534 { |
3424 my $interface = shift; | 3535 my $interface = shift; |
3425 my $namedSetterFunction = shift; | 3536 my $namedSetterFunction = shift; |
3426 my $implClassName = GetImplName($interface); | 3537 my $implClassName = GetImplName($interface); |
3427 my $v8ClassName = GetV8ClassName($interface); | 3538 my $v8ClassName = GetV8ClassName($interface); |
3428 my $methodName = GetImplName($namedSetterFunction->signature); | 3539 my $methodName = GetImplName($namedSetterFunction->signature); |
3429 | 3540 |
3430 AddToImplIncludes("bindings/v8/V8Collection.h"); | 3541 AddToImplIncludes("bindings/v8/V8Collection.h"); |
3431 my $type = $namedSetterFunction->parameters->[1]->type; | |
3432 my $nativeType = GetNativeType($type); | |
3433 my $raisesExceptions = $namedSetterFunction->signature->extendedAttributes-> {"RaisesException"}; | 3542 my $raisesExceptions = $namedSetterFunction->signature->extendedAttributes-> {"RaisesException"}; |
3434 my $nativeValue = JSValueToNative($type, $namedSetterFunction->signature->ex tendedAttributes, "value", "info.GetIsolate()"); | 3543 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttributes- >{"TreatNullAs"}; |
3544 my $treatUndefinedAs = $namedSetterFunction->parameters->[1]->extendedAttrib utes->{"TreatUndefinedAs"}; | |
3435 | 3545 |
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"; | 3546 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"; | 3547 $code .= "{\n"; |
3438 if (!$namedSetterFunction->signature->extendedAttributes->{"OverrideBuiltins "}) { | 3548 if (!$namedSetterFunction->signature->extendedAttributes->{"OverrideBuiltins "}) { |
3439 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n ame).IsEmpty())\n"; | 3549 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n ame).IsEmpty())\n"; |
3440 $code .= " return v8Undefined();\n"; | 3550 $code .= " return v8Undefined();\n"; |
3441 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n"; | 3551 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n"; |
3442 $code .= " return v8Undefined();\n"; | 3552 $code .= " return v8Undefined();\n"; |
3443 } | 3553 } |
3444 $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; | 3554 $code .= " ${implClassName}* collection = toNative(info.Holder());\n"; |
3445 $code .= " V8TRYCATCH_FOR_V8STRINGRESOURCE(V8StringResource<>, propertyNa me, name);\n"; | 3555 $code .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($na medSetterFunction, 0, "name", "propertyName", "info.GetIsolate()"); |
3556 $code .= GenerateNativeVariableDefinitionCorrespondingToJSValueParameter($na medSetterFunction, 1, "value", "propertyValue", "info.GetIsolate()"); | |
3446 my $extraArguments = ""; | 3557 my $extraArguments = ""; |
3447 if ($raisesExceptions) { | 3558 if ($raisesExceptions) { |
3448 $code .= " ExceptionCode ec = 0;\n"; | 3559 $code .= " ExceptionCode ec = 0;\n"; |
3449 $extraArguments = ", ec"; | 3560 $extraArguments = ", ec"; |
3450 } | 3561 } |
3451 if ($type eq "DOMString") { | 3562 |
3452 my $nullCheck = ""; | 3563 my @conditions = (); |
3453 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttribu tes->{"TreatNullAs"}; | 3564 my @statements = (); |
3454 if ($treatNullAs && $treatNullAs eq "NullString") { | 3565 if ($treatNullAs && $treatNullAs ne "NullString") { |
3455 $nullCheck = "WithNullCheck"; | 3566 push @conditions, "value->IsNull()"; |
3456 } | 3567 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 } | 3568 } |
3461 $code .= " bool result = collection->${methodName}(propertyName, property Value$extraArguments);\n"; | 3569 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { |
3570 push @conditions, "value->IsUndefined()"; | |
3571 push @statements, "collection->${treatUndefinedAs}(propertyName$extraArg uments);"; | |
3572 } | |
3573 push @conditions, ""; | |
3574 push @statements, "collection->${methodName}(propertyName, propertyValue$ext raArguments);"; | |
3575 $code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statement s); | |
3576 | |
3462 $code .= " if (!result)\n"; | 3577 $code .= " if (!result)\n"; |
3463 $code .= " return v8Undefined();\n"; | 3578 $code .= " return v8Undefined();\n"; |
3464 if ($raisesExceptions) { | 3579 if ($raisesExceptions) { |
3465 $code .= " if (ec)\n"; | 3580 $code .= " if (ec)\n"; |
3466 $code .= " return setDOMException(ec, info.GetIsolate());\n"; | 3581 $code .= " return setDOMException(ec, info.GetIsolate());\n"; |
3467 } | 3582 } |
3468 $code .= " return value;\n"; | 3583 $code .= " return value;\n"; |
3469 $code .= "}\n\n"; | 3584 $code .= "}\n\n"; |
3470 $implementation{nameSpaceWebCore}->add($code); | 3585 $implementation{nameSpaceWebCore}->add($code); |
3471 } | 3586 } |
(...skipping 2182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5654 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { | 5769 if ($currentInterface->extendedAttributes->{$extendedAttribute}) { |
5655 $found = 1; | 5770 $found = 1; |
5656 } | 5771 } |
5657 return 1 if $found; | 5772 return 1 if $found; |
5658 }, 0); | 5773 }, 0); |
5659 | 5774 |
5660 return $found; | 5775 return $found; |
5661 } | 5776 } |
5662 | 5777 |
5663 1; | 5778 1; |
OLD | NEW |