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

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

Issue 121113004: Improve handling of failed integer type conversions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Update expected outputs Created 6 years, 11 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 "short" => 1, 162 "short" => 1,
163 "long" => 1, 163 "long" => 1,
164 "long long" => 1, 164 "long long" => 1,
165 "unsigned short" => 1, 165 "unsigned short" => 1,
166 "unsigned long" => 1, 166 "unsigned long" => 1,
167 "unsigned long long" => 1, 167 "unsigned long long" => 1,
168 "float" => 1, 168 "float" => 1,
169 "double" => 1, 169 "double" => 1,
170 ); 170 );
171 171
172 my %integerTypeHash = ("byte" => 1, 172 # NOTE: For the unsigned types, the "UI" prefix is used (and not
173 "octet" => 1, 173 # "Ui"), so as to match onto the naming of V8Binding conversion
174 "short" => 1, 174 # methods (and not the Typed Array naming scheme for unsigned types.)
175 "long" => 1, 175 my %integerTypeHash = ("byte" => "Int8",
176 "long long" => 1, 176 "octet" => "UInt8",
177 "unsigned short" => 1, 177 "short" => "Int16",
178 "unsigned long" => 1, 178 "long" => "Int32",
179 "unsigned long long" => 1, 179 "long long" => "Int64",
180 "unsigned short" => "UInt16",
181 "unsigned long" => "UInt32",
182 "unsigned long long" => "UInt64"
180 ); 183 );
181 184
182 my %nonWrapperTypes = ("CompareHow" => 1, 185 my %nonWrapperTypes = ("CompareHow" => 1,
183 "Dictionary" => 1, 186 "Dictionary" => 1,
184 "EventListener" => 1, 187 "EventListener" => 1,
185 "EventHandler" => 1, 188 "EventHandler" => 1,
186 "MediaQueryListListener" => 1, 189 "MediaQueryListListener" => 1,
187 "NodeFilter" => 1, 190 "NodeFilter" => 1,
188 "SerializedScriptValue" => 1, 191 "SerializedScriptValue" => 1,
189 "any" => 1, 192 "any" => 1,
(...skipping 1732 matching lines...) Expand 10 before | Expand all | Expand 10 after
1922 $code .= "static void ${attrName}AttributeSetter${forMainWorldSuffix}(v8 ::Local<v8::Value> jsValue, const v8::FunctionCallbackInfo<v8::Value>& info)\n"; 1925 $code .= "static void ${attrName}AttributeSetter${forMainWorldSuffix}(v8 ::Local<v8::Value> jsValue, const v8::FunctionCallbackInfo<v8::Value>& info)\n";
1923 } else { 1926 } else {
1924 $code .= "static void ${attrName}AttributeSetter${forMainWorldSuffix}(v8 ::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)\n"; 1927 $code .= "static void ${attrName}AttributeSetter${forMainWorldSuffix}(v8 ::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)\n";
1925 } 1928 }
1926 $code .= "{\n"; 1929 $code .= "{\n";
1927 1930
1928 my $raisesException = $attribute->extendedAttributes->{"RaisesException"}; 1931 my $raisesException = $attribute->extendedAttributes->{"RaisesException"};
1929 my $useExceptions = 1 if $raisesException && ($raisesException eq "VALUE_IS_ MISSING" or $raisesException eq "Setter"); 1932 my $useExceptions = 1 if $raisesException && ($raisesException eq "VALUE_IS_ MISSING" or $raisesException eq "Setter");
1930 my $hasStrictTypeChecking = 1 if $attribute->extendedAttributes->{"StrictTyp eChecking"} && IsWrapperType($attrType); # Currently only actually check interf ace types 1933 my $hasStrictTypeChecking = 1 if $attribute->extendedAttributes->{"StrictTyp eChecking"} && IsWrapperType($attrType); # Currently only actually check interf ace types
1931 1934
1935 # Can throw exceptions from accessors or during type conversion.
1936 my $isNumberType = IsIntegerType($attribute->type);
1937
1932 # We throw exceptions using 'ExceptionState' if the attribute explicitly 1938 # We throw exceptions using 'ExceptionState' if the attribute explicitly
1933 # claims that exceptions may be raised, or if a strict type check might 1939 # claims that exceptions may be raised, or if a strict type check might
1934 # fail, or if we're dealing with SVG, which does strange things with 1940 # fail, or if we're dealing with SVG, which does strange things with
1935 # tearoffs and read-only wrappers. 1941 # tearoffs and read-only wrappers.
1936 if ($useExceptions or $hasStrictTypeChecking or GetSVGTypeNeedingTearOff($in terfaceName) or GetSVGTypeNeedingTearOff($attrType)) { 1942 if ($useExceptions or $hasStrictTypeChecking or GetSVGTypeNeedingTearOff($in terfaceName) or GetSVGTypeNeedingTearOff($attrType) or $isNumberType) {
1937 $code .= " ExceptionState exceptionState(ExceptionState::SetterContex t, \"${attrName}\", \"${interfaceName}\", info.Holder(), info.GetIsolate());\n"; 1943 $code .= " ExceptionState exceptionState(ExceptionState::SetterContex t, \"${attrName}\", \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
1938 } 1944 }
1939 1945
1940 # If the "StrictTypeChecking" extended attribute is present, and the 1946 # If the "StrictTypeChecking" extended attribute is present, and the
1941 # attribute's type is an interface type, then if the incoming value does not 1947 # attribute's type is an interface type, then if the incoming value does not
1942 # implement that interface, a TypeError is thrown rather than silently 1948 # implement that interface, a TypeError is thrown rather than silently
1943 # passing NULL to the C++ code. 1949 # passing NULL to the C++ code.
1944 # Per the Web IDL and ECMAScript specifications, incoming values can always 1950 # Per the Web IDL and ECMAScript specifications, incoming values can always
1945 # be converted to both strings and numbers, so do not throw TypeError if the 1951 # be converted to both strings and numbers, so do not throw TypeError if the
1946 # attribute is of these types. 1952 # attribute is of these types.
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
2353 # Append a number to an overloaded method's name to make it unique: 2359 # Append a number to an overloaded method's name to make it unique:
2354 $name = $name . $function->{overloadIndex}; 2360 $name = $name . $function->{overloadIndex};
2355 } 2361 }
2356 2362
2357 my $conditionalString = GenerateConditionalString($function); 2363 my $conditionalString = GenerateConditionalString($function);
2358 my $code = ""; 2364 my $code = "";
2359 $code .= "#if ${conditionalString}\n" if $conditionalString; 2365 $code .= "#if ${conditionalString}\n" if $conditionalString;
2360 $code .= "static void ${name}Method${forMainWorldSuffix}(const v8::FunctionC allbackInfo<v8::Value>& info)\n"; 2366 $code .= "static void ${name}Method${forMainWorldSuffix}(const v8::FunctionC allbackInfo<v8::Value>& info)\n";
2361 $code .= "{\n"; 2367 $code .= "{\n";
2362 2368
2363 # We throw exceptions using 'ExceptionState' if the function explicitly clai ms that exceptions 2369 # We throw exceptions using 'ExceptionState' for a function if:
2364 # may be raised, or for event listeners, or for security-checking, and for w eird SVG stuff. 2370 # - it explicitly claims that exceptions may be raised (or should be if ty pe checks fail.)
2371 # - event listeners
2372 # - security-checking
2373 # - weird SVG stuff.
jsbell 2014/01/02 18:03:23 nit: inconsistent punctuation in the list
2374 # - takes a parameter that might raise an exception on conversion.
2375 #
2365 my $isEventListener = $name eq "addEventListener" || $name eq "removeEventLi stener"; 2376 my $isEventListener = $name eq "addEventListener" || $name eq "removeEventLi stener";
2366 my $isSecurityCheckNecessary = $interface->extendedAttributes->{"CheckSecuri ty"} && !$function->extendedAttributes->{"DoNotCheckSecurity"}; 2377 my $isSecurityCheckNecessary = $interface->extendedAttributes->{"CheckSecuri ty"} && !$function->extendedAttributes->{"DoNotCheckSecurity"};
2367 my $raisesExceptions = $function->extendedAttributes->{"RaisesException"}; 2378 my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
2379 my $hasStrictTypeChecking = $function->extendedAttributes->{"StrictTypeCheck ing"};
2368 my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGProperty Types($interfaceName); 2380 my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGProperty Types($interfaceName);
2369 my $isNonListSVGType = $svgNativeType && !($interfaceName =~ /List$/); 2381 my $isNonListSVGType = $svgNativeType && !($interfaceName =~ /List$/);
2370 2382
2371 my $hasExceptionState = 0; 2383 my $hasExceptionState = $raisesExceptions || $isEventListener || $isSecurity CheckNecessary || $isNonListSVGType || HasExceptionRaisingParameter($function);
2372 if ($raisesExceptions || $isEventListener || $isSecurityCheckNecessary || $i sNonListSVGType || HasSerializedScriptValueParameter($function)) { 2384 if ($hasExceptionState) {
2373 $code .= " ExceptionState exceptionState(ExceptionState::ExecutionCon text, \"${unoverloadedName}\", \"${interfaceName}\", info.Holder(), info.GetIsol ate());\n"; 2385 $code .= " ExceptionState exceptionState(ExceptionState::ExecutionCon text, \"${unoverloadedName}\", \"${interfaceName}\", info.Holder(), info.GetIsol ate());\n";
2374 $hasExceptionState = 1;
2375 } 2386 }
2376 2387
2377 if ($isEventListener) { 2388 if ($isEventListener) {
2378 my $lookupType = ($name eq "addEventListener") ? "OrCreate" : "Only"; 2389 my $lookupType = ($name eq "addEventListener") ? "OrCreate" : "Only";
2379 my $passRefPtrHandling = ($name eq "addEventListener") ? "" : ".get()"; 2390 my $passRefPtrHandling = ($name eq "addEventListener") ? "" : ".get()";
2380 my $hiddenDependencyAction = ($name eq "addEventListener") ? "create" : "remove"; 2391 my $hiddenDependencyAction = ($name eq "addEventListener") ? "create" : "remove";
2381 2392
2382 AddToImplIncludes("bindings/v8/BindingSecurity.h"); 2393 AddToImplIncludes("bindings/v8/BindingSecurity.h");
2383 AddToImplIncludes("bindings/v8/V8EventListenerList.h"); 2394 AddToImplIncludes("bindings/v8/V8EventListenerList.h");
2384 AddToImplIncludes("core/frame/DOMWindow.h"); 2395 AddToImplIncludes("core/frame/DOMWindow.h");
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2452 $code .= " exceptionState.throwIfNeeded();\n"; 2463 $code .= " exceptionState.throwIfNeeded();\n";
2453 $code .= " return;\n"; 2464 $code .= " return;\n";
2454 $code .= " }\n"; 2465 $code .= " }\n";
2455 END 2466 END
2456 } 2467 }
2457 2468
2458 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, $forMainWorldSuffix, $hasExceptionState); 2469 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, $forMainWorldSuffix, $hasExceptionState);
2459 $code .= $parameterCheckString; 2470 $code .= $parameterCheckString;
2460 2471
2461 # Build the function call string. 2472 # Build the function call string.
2462 $code .= GenerateFunctionCallString($function, $paramIndex, " ", $interfa ce, $forMainWorldSuffix, %replacements); 2473 $code .= GenerateFunctionCallString($function, $paramIndex, " ", $interfa ce, $forMainWorldSuffix, $hasExceptionState, %replacements);
2463 $code .= "}\n"; 2474 $code .= "}\n";
2464 $code .= "#endif // ${conditionalString}\n" if $conditionalString; 2475 $code .= "#endif // ${conditionalString}\n" if $conditionalString;
2465 $code .= "\n"; 2476 $code .= "\n";
2466 $implementation{nameSpaceInternal}->add($code); 2477 $implementation{nameSpaceInternal}->add($code);
2467 } 2478 }
2468 2479
2469 sub GenerateCallWith 2480 sub GenerateCallWith
2470 { 2481 {
2471 my $callWith = shift; 2482 my $callWith = shift;
2472 return ([], "") unless $callWith; 2483 return ([], "") unless $callWith;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 foreach my $parameter (@{$function->parameters}) { 2571 foreach my $parameter (@{$function->parameters}) {
2561 my $humanFriendlyIndex = $paramIndex + 1; 2572 my $humanFriendlyIndex = $paramIndex + 1;
2562 my $nativeType = GetNativeType($parameter->type, $parameter->extendedAtt ributes, "parameter"); 2573 my $nativeType = GetNativeType($parameter->type, $parameter->extendedAtt ributes, "parameter");
2563 2574
2564 # Optional arguments without [Default=...] should generate an early call with fewer arguments. 2575 # Optional arguments without [Default=...] should generate an early call with fewer arguments.
2565 # Optional Dictionary arguments always considered to have default of emp ty dictionary. 2576 # Optional Dictionary arguments always considered to have default of emp ty dictionary.
2566 if ($parameter->isOptional && !$parameter->extendedAttributes->{"Default "} && $nativeType ne "Dictionary" && !IsCallbackInterface($parameter->type)) { 2577 if ($parameter->isOptional && !$parameter->extendedAttributes->{"Default "} && $nativeType ne "Dictionary" && !IsCallbackInterface($parameter->type)) {
2567 $parameterCheckString .= <<END; 2578 $parameterCheckString .= <<END;
2568 if (UNLIKELY(info.Length() <= $paramIndex)) { 2579 if (UNLIKELY(info.Length() <= $paramIndex)) {
2569 END 2580 END
2570 $parameterCheckString .= GenerateFunctionCallString($function, $para mIndex, " " x 2, $interface, $forMainWorldSuffix, %replacements); 2581 $parameterCheckString .= GenerateFunctionCallString($function, $para mIndex, " " x 2, $interface, $forMainWorldSuffix, $hasExceptionState, %replac ements);
2571 $parameterCheckString .= <<END; 2582 $parameterCheckString .= <<END;
2572 return; 2583 return;
2573 } 2584 }
2574 END 2585 END
2575 } 2586 }
2576 2587
2577 my $parameterName = $parameter->name; 2588 my $parameterName = $parameter->name;
2578 if (IsCallbackInterface($parameter->type)) { 2589 if (IsCallbackInterface($parameter->type)) {
2579 my $v8ClassName = "V8" . $parameter->type; 2590 my $v8ClassName = "V8" . $parameter->type;
2580 AddToImplIncludes("$v8ClassName.h"); 2591 AddToImplIncludes("$v8ClassName.h");
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2771 2782
2772 my $interfaceName = $interface->name; 2783 my $interfaceName = $interface->name;
2773 my $implClassName = GetImplName($interface); 2784 my $implClassName = GetImplName($interface);
2774 my $v8ClassName = GetV8ClassName($interface); 2785 my $v8ClassName = GetV8ClassName($interface);
2775 my $overloadedIndexString = ""; 2786 my $overloadedIndexString = "";
2776 if ($function->overloadedIndex > 0) { 2787 if ($function->overloadedIndex > 0) {
2777 $overloadedIndexString .= $function->overloadedIndex; 2788 $overloadedIndexString .= $function->overloadedIndex;
2778 } 2789 }
2779 2790
2780 my $constructorRaisesException = $interface->extendedAttributes->{"RaisesExc eption"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor" ; 2791 my $constructorRaisesException = $interface->extendedAttributes->{"RaisesExc eption"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor" ;
2781 my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException || HasSerializedScriptValueParameter($function); 2792 my $hasExceptionState = $function->extendedAttributes->{"RaisesException"} | | $constructorRaisesException || HasExceptionRaisingParameter($function);
2782 2793
2783 my @beforeArgumentList; 2794 my @beforeArgumentList;
2784 my @afterArgumentList; 2795 my @afterArgumentList;
2785 my $code = ""; 2796 my $code = "";
2786 $code .= <<END; 2797 $code .= <<END;
2787 static void constructor${overloadedIndexString}(const v8::FunctionCallbackInfo<v 8::Value>& info) 2798 static void constructor${overloadedIndexString}(const v8::FunctionCallbackInfo<v 8::Value>& info)
2788 { 2799 {
2789 END 2800 END
2790 2801
2802 if ($hasExceptionState) {
2803 $code .= " ExceptionState exceptionState(ExceptionState::Construction Context, \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
2804 }
2791 if ($function->overloadedIndex == 0) { 2805 if ($function->overloadedIndex == 0) {
2792 my $hasExceptionState = 0;
2793 $code .= GenerateArgumentsCountCheck($function, $interface, $hasExceptio nState); 2806 $code .= GenerateArgumentsCountCheck($function, $interface, $hasExceptio nState);
2794 } 2807 }
2795 2808
2796 if ($raisesExceptions) {
2797 $code .= " ExceptionState exceptionState(ExceptionState::Construction Context, \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
2798 }
2799
2800 # FIXME: Currently [Constructor(...)] does not yet support optional argument s without [Default=...] 2809 # FIXME: Currently [Constructor(...)] does not yet support optional argument s without [Default=...]
2801 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, "", $raisesExceptions); 2810 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, "", $hasExceptionState);
2802 $code .= $parameterCheckString; 2811 $code .= $parameterCheckString;
2803 2812
2804 if ($interface->extendedAttributes->{"ConstructorCallWith"}) { 2813 if ($interface->extendedAttributes->{"ConstructorCallWith"}) {
2805 if (ExtendedAttributeContains($interface->extendedAttributes->{"Construc torCallWith"}, "ExecutionContext")) { 2814 if (ExtendedAttributeContains($interface->extendedAttributes->{"Construc torCallWith"}, "ExecutionContext")) {
2806 push(@beforeArgumentList, "context"); 2815 push(@beforeArgumentList, "context");
2807 $code .= " ExecutionContext* context = getExecutionContext();\n"; 2816 $code .= " ExecutionContext* context = getExecutionContext();\n";
2808 } 2817 }
2809 if (ExtendedAttributeContains($interface->extendedAttributes->{"Construc torCallWith"}, "Document")) { 2818 if (ExtendedAttributeContains($interface->extendedAttributes->{"Construc torCallWith"}, "Document")) {
2810 push(@beforeArgumentList, "document"); 2819 push(@beforeArgumentList, "document");
2811 $code .= " Document& document = *toDocument(getExecutionContext() );\n"; 2820 $code .= " Document& document = *toDocument(getExecutionContext() );\n";
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
3065 3074
3066 sub GenerateNamedConstructor 3075 sub GenerateNamedConstructor
3067 { 3076 {
3068 my $function = shift; 3077 my $function = shift;
3069 my $interface = shift; 3078 my $interface = shift;
3070 3079
3071 my $interfaceName = $interface->name; 3080 my $interfaceName = $interface->name;
3072 my $implClassName = GetImplName($interface); 3081 my $implClassName = GetImplName($interface);
3073 my $v8ClassName = GetV8ClassName($interface); 3082 my $v8ClassName = GetV8ClassName($interface);
3074 my $constructorRaisesException = $interface->extendedAttributes->{"RaisesExc eption"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor" ; 3083 my $constructorRaisesException = $interface->extendedAttributes->{"RaisesExc eption"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor" ;
3075 my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException || HasSerializedScriptValueParameter($function); 3084 my $raisesExceptions = $function->extendedAttributes->{"RaisesException"} || $constructorRaisesException || HasExceptionRaisingParameter($function);
3076 3085
3077 my $maybeObserveFeature = GenerateFeatureObservation($function->extendedAttr ibutes->{"MeasureAs"}); 3086 my $maybeObserveFeature = GenerateFeatureObservation($function->extendedAttr ibutes->{"MeasureAs"});
3078 my $maybeDeprecateFeature = GenerateDeprecationNotification($function->exten dedAttributes->{"DeprecateAs"}); 3087 my $maybeDeprecateFeature = GenerateDeprecationNotification($function->exten dedAttributes->{"DeprecateAs"});
3079 3088
3080 my @beforeArgumentList; 3089 my @beforeArgumentList;
3081 my @afterArgumentList; 3090 my @afterArgumentList;
3082 3091
3083 my $toActiveDOMObject = "0"; 3092 my $toActiveDOMObject = "0";
3084 if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) { 3093 if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
3085 $toActiveDOMObject = "${v8ClassName}::toActiveDOMObject"; 3094 $toActiveDOMObject = "${v8ClassName}::toActiveDOMObject";
(...skipping 20 matching lines...) Expand all
3106 $code .= <<END; 3115 $code .= <<END;
3107 Document* document = currentDocument(); 3116 Document* document = currentDocument();
3108 ASSERT(document); 3117 ASSERT(document);
3109 3118
3110 // Make sure the document is added to the DOM Node map. Otherwise, the ${imp lClassName} instance 3119 // Make sure the document is added to the DOM Node map. Otherwise, the ${imp lClassName} instance
3111 // may end up being the only node in the map and get garbage-collected prema turely. 3120 // may end up being the only node in the map and get garbage-collected prema turely.
3112 toV8(document, info.Holder(), info.GetIsolate()); 3121 toV8(document, info.Holder(), info.GetIsolate());
3113 3122
3114 END 3123 END
3115 3124
3116 if ($raisesExceptions) { 3125 my $hasExceptionState = $raisesExceptions;
3126 if ($hasExceptionState) {
3117 $code .= " ExceptionState exceptionState(ExceptionState::Construction Context, \"${interfaceName}\", info.Holder(), info.GetIsolate());\n"; 3127 $code .= " ExceptionState exceptionState(ExceptionState::Construction Context, \"${interfaceName}\", info.Holder(), info.GetIsolate());\n";
3118 } 3128 }
3119
3120 my $hasExceptionState = $raisesExceptions;
3121 $code .= GenerateArgumentsCountCheck($function, $interface, $hasExceptionSta te); 3129 $code .= GenerateArgumentsCountCheck($function, $interface, $hasExceptionSta te);
3122 3130
3123 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, "", $raisesExceptions); 3131 my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersC heck($function, $interface, "", $hasExceptionState);
3124 $code .= $parameterCheckString; 3132 $code .= $parameterCheckString;
3125 3133
3126 push(@beforeArgumentList, "*document"); 3134 push(@beforeArgumentList, "*document");
3127 3135
3128 if ($constructorRaisesException) { 3136 if ($constructorRaisesException) {
3129 push(@afterArgumentList, "exceptionState"); 3137 push(@afterArgumentList, "exceptionState");
3130 } 3138 }
3131 3139
3132 my @argumentList; 3140 my @argumentList;
3133 my $index = 0; 3141 my $index = 0;
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
3700 $implementation{nameSpaceInternal}->add($code); 3708 $implementation{nameSpaceInternal}->add($code);
3701 } 3709 }
3702 3710
3703 sub GenerateImplementationIndexedPropertySetter 3711 sub GenerateImplementationIndexedPropertySetter
3704 { 3712 {
3705 my $interface = shift; 3713 my $interface = shift;
3706 my $indexedSetterFunction = shift; 3714 my $indexedSetterFunction = shift;
3707 my $implClassName = GetImplName($interface); 3715 my $implClassName = GetImplName($interface);
3708 my $v8ClassName = GetV8ClassName($interface); 3716 my $v8ClassName = GetV8ClassName($interface);
3709 my $methodName = GetImplName($indexedSetterFunction); 3717 my $methodName = GetImplName($indexedSetterFunction);
3718 my $interfaceName = $interface->name;
3710 3719
3711 my $type = $indexedSetterFunction->parameters->[1]->type; 3720 my $type = $indexedSetterFunction->parameters->[1]->type;
3712 my $raisesExceptions = $indexedSetterFunction->extendedAttributes->{"RaisesE xception"}; 3721 my $raisesExceptions = $indexedSetterFunction->extendedAttributes->{"RaisesE xception"};
3713 my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttribute s->{"TreatNullAs"}; 3722 my $treatNullAs = $indexedSetterFunction->parameters->[1]->extendedAttribute s->{"TreatNullAs"};
3714 my $treatUndefinedAs = $indexedSetterFunction->parameters->[1]->extendedAttr ibutes->{"TreatUndefinedAs"}; 3723 my $treatUndefinedAs = $indexedSetterFunction->parameters->[1]->extendedAttr ibutes->{"TreatUndefinedAs"};
3715 my $asSetterValue = 0;
3716 3724
3717 my $code = "static void indexedPropertySetter(uint32_t index, v8::Local<v8:: Value> jsValue, const v8::PropertyCallbackInfo<v8::Value>& info)\n"; 3725 my $code = "static void indexedPropertySetter(uint32_t index, v8::Local<v8:: Value> jsValue, const v8::PropertyCallbackInfo<v8::Value>& info)\n";
3718 $code .= "{\n"; 3726 $code .= "{\n";
3727
3728 my $extraArguments = "";
3729 if ($raisesExceptions || IsIntegerType($type)) {
3730 $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsola te());\n";
3731 if ($raisesExceptions) {
3732 $extraArguments = ", exceptionState";
3733 }
3734 }
3735
3736 my $asSetterValue = 0;
3719 $code .= " ${implClassName}* collection = ${v8ClassName}::toNative(info.H older());\n"; 3737 $code .= " ${implClassName}* collection = ${v8ClassName}::toNative(info.H older());\n";
3720 $code .= JSValueToNativeStatement($indexedSetterFunction->parameters->[1]->t ype, $indexedSetterFunction->extendedAttributes, $asSetterValue, "jsValue", "pro pertyValue", " ", "info.GetIsolate()"); 3738 $code .= JSValueToNativeStatement($indexedSetterFunction->parameters->[1]->t ype, $indexedSetterFunction->extendedAttributes, $asSetterValue, "jsValue", "pro pertyValue", " ", "info.GetIsolate()");
3721 3739
3722 my $extraArguments = "";
3723 if ($raisesExceptions) {
3724 $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsola te());\n";
3725 $extraArguments = ", exceptionState";
3726 }
3727 my @conditions = (); 3740 my @conditions = ();
3728 my @statements = (); 3741 my @statements = ();
3729 if ($treatNullAs && $treatNullAs ne "NullString") { 3742 if ($treatNullAs && $treatNullAs ne "NullString") {
3730 push @conditions, "jsValue->IsNull()"; 3743 push @conditions, "jsValue->IsNull()";
3731 push @statements, "collection->${treatNullAs}(index$extraArguments);"; 3744 push @statements, "collection->${treatNullAs}(index$extraArguments);";
3732 } 3745 }
3733 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { 3746 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") {
3734 push @conditions, "jsValue->IsUndefined()"; 3747 push @conditions, "jsValue->IsUndefined()";
3735 push @statements, "collection->${treatUndefinedAs}(index$extraArguments) ;"; 3748 push @statements, "collection->${treatUndefinedAs}(index$extraArguments) ;";
3736 } 3749 }
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
4005 $implementation{nameSpaceInternal}->add($code); 4018 $implementation{nameSpaceInternal}->add($code);
4006 } 4019 }
4007 4020
4008 sub GenerateImplementationNamedPropertySetter 4021 sub GenerateImplementationNamedPropertySetter
4009 { 4022 {
4010 my $interface = shift; 4023 my $interface = shift;
4011 my $namedSetterFunction = shift; 4024 my $namedSetterFunction = shift;
4012 my $implClassName = GetImplName($interface); 4025 my $implClassName = GetImplName($interface);
4013 my $v8ClassName = GetV8ClassName($interface); 4026 my $v8ClassName = GetV8ClassName($interface);
4014 my $methodName = GetImplName($namedSetterFunction); 4027 my $methodName = GetImplName($namedSetterFunction);
4028 my $interfaceName = $interface->name;
4015 4029
4030 my $type = $namedSetterFunction->parameters->[1]->type;
4016 my $raisesExceptions = $namedSetterFunction->extendedAttributes->{"RaisesExc eption"}; 4031 my $raisesExceptions = $namedSetterFunction->extendedAttributes->{"RaisesExc eption"};
4017 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttributes- >{"TreatNullAs"}; 4032 my $treatNullAs = $namedSetterFunction->parameters->[1]->extendedAttributes- >{"TreatNullAs"};
4018 my $treatUndefinedAs = $namedSetterFunction->parameters->[1]->extendedAttrib utes->{"TreatUndefinedAs"}; 4033 my $treatUndefinedAs = $namedSetterFunction->parameters->[1]->extendedAttrib utes->{"TreatUndefinedAs"};
4019 my $asSetterValue = 0;
4020 4034
4021 my $code = "static void namedPropertySetter(v8::Local<v8::String> name, v8:: Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<v8::Value>& info)\n"; 4035 my $code = "static void namedPropertySetter(v8::Local<v8::String> name, v8:: Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<v8::Value>& info)\n";
4022 $code .= "{\n"; 4036 $code .= "{\n";
4023 if (!$namedSetterFunction->extendedAttributes->{"OverrideBuiltins"}) { 4037 if (!$namedSetterFunction->extendedAttributes->{"OverrideBuiltins"}) {
4024 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n ame).IsEmpty())\n"; 4038 $code .= " if (!info.Holder()->GetRealNamedPropertyInPrototypeChain(n ame).IsEmpty())\n";
4025 $code .= " return;\n"; 4039 $code .= " return;\n";
4026 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n"; 4040 $code .= " if (info.Holder()->HasRealNamedCallbackProperty(name))\n";
4027 $code .= " return;\n"; 4041 $code .= " return;\n";
4028 $code .= " if (info.Holder()->HasRealNamedProperty(name))\n"; 4042 $code .= " if (info.Holder()->HasRealNamedProperty(name))\n";
4029 $code .= " return;\n"; 4043 $code .= " return;\n";
4030 } 4044 }
4045
4046 my $extraArguments = "";
4047 if ($raisesExceptions || IsIntegerType($type)) {
4048 $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsola te());\n";
4049 if ($raisesExceptions) {
4050 $extraArguments = ", exceptionState";
4051 }
4052 }
4053
4054 my $asSetterValue = 0;
4031 $code .= " ${implClassName}* collection = ${v8ClassName}::toNative(info.H older());\n"; 4055 $code .= " ${implClassName}* collection = ${v8ClassName}::toNative(info.H older());\n";
4032 $code .= JSValueToNativeStatement($namedSetterFunction->parameters->[0]->typ e, $namedSetterFunction->extendedAttributes, $asSetterValue, "name", "propertyNa me", " ", "info.GetIsolate()"); 4056 $code .= JSValueToNativeStatement($namedSetterFunction->parameters->[0]->typ e, $namedSetterFunction->extendedAttributes, $asSetterValue, "name", "propertyNa me", " ", "info.GetIsolate()");
4033 $code .= JSValueToNativeStatement($namedSetterFunction->parameters->[1]->typ e, $namedSetterFunction->extendedAttributes, $asSetterValue, "jsValue", "propert yValue", " ", "info.GetIsolate()"); 4057 $code .= JSValueToNativeStatement($namedSetterFunction->parameters->[1]->typ e, $namedSetterFunction->extendedAttributes, $asSetterValue, "jsValue", "propert yValue", " ", "info.GetIsolate()");
4034 my $extraArguments = "";
4035 if ($raisesExceptions) {
4036 $code .= " ExceptionState exceptionState(info.Holder(), info.GetIsola te());\n";
4037 $extraArguments = ", exceptionState";
4038 }
4039 4058
4040 my @conditions = (); 4059 my @conditions = ();
4041 my @statements = (); 4060 my @statements = ();
4042 if ($treatNullAs && $treatNullAs ne "NullString") { 4061 if ($treatNullAs && $treatNullAs ne "NullString") {
4043 push @conditions, "jsValue->IsNull()"; 4062 push @conditions, "jsValue->IsNull()";
4044 push @statements, "collection->${treatNullAs}(propertyName$extraArgument s);"; 4063 push @statements, "collection->${treatNullAs}(propertyName$extraArgument s);";
4045 } 4064 }
4046 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") { 4065 if ($treatUndefinedAs && $treatUndefinedAs ne "NullString") {
4047 push @conditions, "jsValue->IsUndefined()"; 4066 push @conditions, "jsValue->IsUndefined()";
4048 push @statements, "collection->${treatUndefinedAs}(propertyName$extraArg uments);"; 4067 push @statements, "collection->${treatUndefinedAs}(propertyName$extraArg uments);";
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
5180 return "WebCore"; 5199 return "WebCore";
5181 } 5200 }
5182 5201
5183 sub GenerateFunctionCallString 5202 sub GenerateFunctionCallString
5184 { 5203 {
5185 my $function = shift; 5204 my $function = shift;
5186 my $numberOfParameters = shift; 5205 my $numberOfParameters = shift;
5187 my $indent = shift; 5206 my $indent = shift;
5188 my $interface = shift; 5207 my $interface = shift;
5189 my $forMainWorldSuffix = shift; 5208 my $forMainWorldSuffix = shift;
5209 my $hasExceptionState = shift;
5190 my %replacements = @_; 5210 my %replacements = @_;
5191 5211
5192 my $interfaceName = $interface->name; 5212 my $interfaceName = $interface->name;
5193 my $implClassName = GetImplName($interface); 5213 my $implClassName = GetImplName($interface);
5194 my $name = GetImplName($function); 5214 my $name = GetImplName($function);
5195 my $returnType = $function->type; 5215 my $returnType = $function->type;
5196 my $nativeReturnType = GetNativeType($returnType, {}, ""); 5216 my $nativeReturnType = GetNativeType($returnType, {}, "");
5197 my $code = ""; 5217 my $code = "";
5198 5218
5199 my $isSVGTearOffType = (IsSVGTypeNeedingTearOff($returnType) and not $interf aceName =~ /List$/); 5219 my $isSVGTearOffType = (IsSVGTypeNeedingTearOff($returnType) and not $interf aceName =~ /List$/);
(...skipping 29 matching lines...) Expand all
5229 if ($index eq $numberOfParameters) { 5249 if ($index eq $numberOfParameters) {
5230 last; 5250 last;
5231 } 5251 }
5232 my $paramName = $parameter->name; 5252 my $paramName = $parameter->name;
5233 my $paramType = $parameter->type; 5253 my $paramType = $parameter->type;
5234 5254
5235 if ($replacements{$paramName}) { 5255 if ($replacements{$paramName}) {
5236 push @arguments, $replacements{$paramName}; 5256 push @arguments, $replacements{$paramName};
5237 } elsif (IsSVGTypeNeedingTearOff($parameter->type) and not $interfaceNam e =~ /List$/) { 5257 } elsif (IsSVGTypeNeedingTearOff($parameter->type) and not $interfaceNam e =~ /List$/) {
5238 push @arguments, "$paramName->propertyReference()"; 5258 push @arguments, "$paramName->propertyReference()";
5239 $code .= <<END; 5259 if ($hasExceptionState) {
5260 $code .= <<END;
5261 if (!$paramName) {
5262 exceptionState.throwTypeError(\"parameter $humanFriendlyIndex is not of type '${ \$parameter->type }'.\");
5263 exceptionState.throwIfNeeded();
5264 return;
5265 }
5266 END
5267 } else {
5268 $code .= <<END;
5240 if (!$paramName) { 5269 if (!$paramName) {
5241 throwTypeError(ExceptionMessages::failedToExecute(\"$name\", \"$interfac eName\", \"parameter $humanFriendlyIndex is not of type '${ \$parameter->type }' .\"), info.GetIsolate()); 5270 throwTypeError(ExceptionMessages::failedToExecute(\"$name\", \"$interfac eName\", \"parameter $humanFriendlyIndex is not of type '${ \$parameter->type }' .\"), info.GetIsolate());
5242 return; 5271 return;
5243 } 5272 }
5244 END 5273 END
5274 }
5245 } elsif ($parameter->type eq "SVGMatrix" and $interfaceName eq "SVGTrans formList") { 5275 } elsif ($parameter->type eq "SVGMatrix" and $interfaceName eq "SVGTrans formList") {
5246 push @arguments, "$paramName.get()"; 5276 push @arguments, "$paramName.get()";
5247 } elsif (IsNullableParameter($parameter)) { 5277 } elsif (IsNullableParameter($parameter)) {
5248 push @arguments, "${paramName}IsNull ? 0 : &$paramName"; 5278 push @arguments, "${paramName}IsNull ? 0 : &$paramName";
5249 } elsif (IsCallbackInterface($paramType) or $paramType eq "NodeFilter" o r $paramType eq "XPathNSResolver") { 5279 } elsif (IsCallbackInterface($paramType) or $paramType eq "NodeFilter" o r $paramType eq "XPathNSResolver") {
5250 push @arguments, "$paramName.release()"; 5280 push @arguments, "$paramName.release()";
5251 } else { 5281 } else {
5252 push @arguments, $paramName; 5282 push @arguments, $paramName;
5253 } 5283 }
5254 $index++; 5284 $index++;
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
5423 my $nativeType = GetNativeType($type, $extendedAttributes, "parameter"); 5453 my $nativeType = GetNativeType($type, $extendedAttributes, "parameter");
5424 my $native_value = JSValueToNative($type, $extendedAttributes, $argIndexOrZe ro, $jsValue, $getIsolate); 5454 my $native_value = JSValueToNative($type, $extendedAttributes, $argIndexOrZe ro, $jsValue, $getIsolate);
5425 my $code = ""; 5455 my $code = "";
5426 if ($type eq "DOMString" || IsEnumType($type)) { 5456 if ($type eq "DOMString" || IsEnumType($type)) {
5427 die "Wrong native type passed: $nativeType" unless $nativeType =~ /^V8St ringResource/; 5457 die "Wrong native type passed: $nativeType" unless $nativeType =~ /^V8St ringResource/;
5428 if ($type eq "DOMString" or IsEnumType($type)) { 5458 if ($type eq "DOMString" or IsEnumType($type)) {
5429 $code .= $indent . "V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID($nativeType , $variableName, $native_value);\n" 5459 $code .= $indent . "V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID($nativeType , $variableName, $native_value);\n"
5430 } else { 5460 } else {
5431 $code .= $indent . "$nativeType $variableName($native_value, true);\ n"; 5461 $code .= $indent . "$nativeType $variableName($native_value, true);\ n";
5432 } 5462 }
5433 } elsif ($extendedAttributes->{"EnforceRange"}) { 5463 } elsif (IsIntegerType($type)) {
5434 $code .= $indent . "V8TRYCATCH_WITH_TYPECHECK_VOID($nativeType, $variabl eName, $native_value, $getIsolate);\n"; 5464 $code .= $indent . "V8TRYCATCH_EXCEPTION_VOID($nativeType, $variableName , $native_value, exceptionState);\n";
5435 } else { 5465 } else {
5436 $code .= $indent . "V8TRYCATCH_VOID($nativeType, $variableName, $native_ value);\n"; 5466 $code .= $indent . "V8TRYCATCH_VOID($nativeType, $variableName, $native_ value);\n";
5437 } 5467 }
5438 return $code; 5468 return $code;
5439 } 5469 }
5440 5470
5441 5471
5442 sub JSValueToNative 5472 sub JSValueToNative
5443 { 5473 {
5444 my $type = shift; 5474 my $type = shift;
5445 my $extendedAttributes = shift; 5475 my $extendedAttributes = shift;
5446 # Argument position (1-indexed) or 0 if for a setter's value. 5476 # Argument position (1-indexed) or 0 if for a setter's value.
5447 my $argIndexOrZero = shift; 5477 my $argIndexOrZero = shift;
5448 my $value = shift; 5478 my $value = shift;
5449 my $getIsolate = shift; 5479 my $getIsolate = shift;
5450 5480
5451 my $intConversion = $extendedAttributes->{"EnforceRange"} ? "EnforceRange" : "NormalConversion";
5452
5453 return "$value->BooleanValue()" if $type eq "boolean"; 5481 return "$value->BooleanValue()" if $type eq "boolean";
5454 return "static_cast<$type>($value->NumberValue())" if $type eq "float" or $t ype eq "double"; 5482 return "static_cast<$type>($value->NumberValue())" if $type eq "float" or $t ype eq "double";
5455 5483
5456 if ($intConversion ne "NormalConversion") { 5484 if (IsIntegerType($type)) {
5457 return "toInt8($value, $intConversion, ok)" if $type eq "byte"; 5485 my $conversion = "to" . $integerTypeHash{$type} . "($value";
5458 return "toUInt8($value, $intConversion, ok)" if $type eq "octet"; 5486 if ($extendedAttributes->{"EnforceRange"}) {
5459 return "toInt16($value, $intConversion, ok)" if $type eq "short"; 5487 return "${conversion}, EnforceRange, exceptionState)";
5460 return "toUInt16($value, $intConversion, ok)" if $type eq "unsigned shor t"; 5488 } else {
5461 return "toInt32($value, $intConversion, ok)" if $type eq "long"; 5489 return "${conversion}, exceptionState)";
5462 return "toUInt32($value, $intConversion, ok)" if $type eq "unsigned long "; 5490 }
5463 return "toInt64($value, $intConversion, ok)" if $type eq "long long";
5464 return "toUInt64($value, $intConversion, ok)" if $type eq "unsigned long long";
5465 } else {
5466 return "toInt8($value)" if $type eq "byte";
5467 return "toUInt8($value)" if $type eq "octet";
5468 return "toInt16($value)" if $type eq "short";
5469 return "toUInt16($value)" if $type eq "unsigned short";
5470 return "toInt32($value)" if $type eq "long";
5471 return "toUInt32($value)" if $type eq "unsigned long";
5472 return "toInt64($value)" if $type eq "long long";
5473 return "toUInt64($value)" if $type eq "unsigned long long";
5474 } 5491 }
5475 return "static_cast<Range::CompareHow>($value->Int32Value())" if $type eq "C ompareHow"; 5492 return "static_cast<Range::CompareHow>($value->Int32Value())" if $type eq "C ompareHow";
5476 return "toWebCoreDate($value)" if $type eq "Date"; 5493 return "toWebCoreDate($value)" if $type eq "Date";
5477 5494
5478 if ($type eq "DOMString" or IsEnumType($type)) { 5495 if ($type eq "DOMString" or IsEnumType($type)) {
5479 return $value; 5496 return $value;
5480 } 5497 }
5481 5498
5482 if ($type eq "SerializedScriptValue") { 5499 if ($type eq "SerializedScriptValue") {
5483 AddToImplIncludes("bindings/v8/SerializedScriptValue.h"); 5500 AddToImplIncludes("bindings/v8/SerializedScriptValue.h");
(...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
6369 my $interface = shift; 6386 my $interface = shift;
6370 6387
6371 return 1 if ExtendedAttributeContains($interface->extendedAttributes->{"Cust om"}, "ToV8"); 6388 return 1 if ExtendedAttributeContains($interface->extendedAttributes->{"Cust om"}, "ToV8");
6372 return 1 if ExtendedAttributeContains($interface->extendedAttributes->{"Cust om"}, "Wrap"); 6389 return 1 if ExtendedAttributeContains($interface->extendedAttributes->{"Cust om"}, "Wrap");
6373 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"}; 6390 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"};
6374 return 1 if InheritsInterface($interface, "Document"); 6391 return 1 if InheritsInterface($interface, "Document");
6375 6392
6376 return 0; 6393 return 0;
6377 } 6394 }
6378 6395
6379 sub HasSerializedScriptValueParameter 6396 sub HasExceptionRaisingParameter
6380 { 6397 {
6381 my $function = shift; 6398 my $function = shift;
6382 6399
6383 foreach my $parameter (@{$function->parameters}) { 6400 foreach my $parameter (@{$function->parameters}) {
6384 if ($parameter->type eq "SerializedScriptValue") { 6401 if ($parameter->type eq "SerializedScriptValue") {
6385 return 1; 6402 return 1;
6403 } elsif (IsIntegerType($parameter->type)) {
6404 return 1;
6386 } 6405 }
6387 } 6406 }
6388 return 0; 6407 return 0;
6389 } 6408 }
6390 6409
6391 1; 6410 1;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698