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

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

Issue 15899009: Support indexed setter generation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: make helper function and useit Created 7 years, 6 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
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLAttributes.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 3152 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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;
OLDNEW
« no previous file with comments | « no previous file | Source/bindings/scripts/IDLAttributes.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698