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

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

Issue 85263002: Improve handling of dictionary conversions. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Have conversion methods take a context argument; elaborate error msgs further. Created 7 years 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,
173 "octet" => 1,
174 "short" => 1,
175 "long" => 1,
176 "long long" => 1,
177 "unsigned short" => 1,
178 "unsigned long" => 1,
179 "unsigned long long" => 1,
180 );
181
172 my %nonWrapperTypes = ("CompareHow" => 1, 182 my %nonWrapperTypes = ("CompareHow" => 1,
173 "Dictionary" => 1, 183 "Dictionary" => 1,
174 "EventListener" => 1, 184 "EventListener" => 1,
175 "EventHandler" => 1, 185 "EventHandler" => 1,
176 "MediaQueryListListener" => 1, 186 "MediaQueryListListener" => 1,
177 "NodeFilter" => 1, 187 "NodeFilter" => 1,
178 "SerializedScriptValue" => 1, 188 "SerializedScriptValue" => 1,
179 "any" => 1, 189 "any" => 1,
180 ); 190 );
181 191
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 1022
1013 template<class CallbackInfo, class Wrappable> 1023 template<class CallbackInfo, class Wrappable>
1014 inline void v8SetReturnValueFast(const CallbackInfo& callbackInfo, PassRefPtr<${ nativeType} > impl, Wrappable* wrappable) 1024 inline void v8SetReturnValueFast(const CallbackInfo& callbackInfo, PassRefPtr<${ nativeType} > impl, Wrappable* wrappable)
1015 { 1025 {
1016 v8SetReturnValueFast(callbackInfo, impl.get(), wrappable); 1026 v8SetReturnValueFast(callbackInfo, impl.get(), wrappable);
1017 } 1027 }
1018 1028
1019 END 1029 END
1020 1030
1021 if (IsConstructorTemplate($interface, "Event")) { 1031 if (IsConstructorTemplate($interface, "Event")) {
1022 $header{nameSpaceWebCore}->add("bool fill${implClassName}Init(${implClas sName}Init&, const Dictionary&);\n\n"); 1032 $header{nameSpaceWebCore}->add("bool fill${implClassName}Init(${implClas sName}Init&, const Dictionary&, ExceptionState&, const String& = \"\");\n\n");
1023 } 1033 }
1024 } 1034 }
1025 1035
1026 sub GetInternalFields 1036 sub GetInternalFields
1027 { 1037 {
1028 my $interface = shift; 1038 my $interface = shift;
1029 1039
1030 my @customInternalFields = (); 1040 my @customInternalFields = ();
1031 # Event listeners on DOM nodes are explicitly supported in the GC controller . 1041 # Event listeners on DOM nodes are explicitly supported in the GC controller .
1032 if (!InheritsInterface($interface, "Node") && 1042 if (!InheritsInterface($interface, "Node") &&
(...skipping 1823 matching lines...) Expand 10 before | Expand all | Expand 10 after
2856 } 2866 }
2857 } 2867 }
2858 2868
2859 sub GenerateEventConstructor 2869 sub GenerateEventConstructor
2860 { 2870 {
2861 my $interface = shift; 2871 my $interface = shift;
2862 my $interfaceName = $interface->name; 2872 my $interfaceName = $interface->name;
2863 my $implClassName = GetImplName($interface); 2873 my $implClassName = GetImplName($interface);
2864 my $v8ClassName = GetV8ClassName($interface); 2874 my $v8ClassName = GetV8ClassName($interface);
2865 2875
2876 my $constructorRaisesException = $interface->extendedAttributes->{"RaisesExc eption"} && $interface->extendedAttributes->{"RaisesException"} eq "Constructor" ;
2877
2866 my @anyAttributeNames; 2878 my @anyAttributeNames;
2867 my @serializableAnyAttributeNames; 2879 my @serializableAnyAttributeNames;
2868 foreach my $attribute (@{$interface->attributes}) { 2880 foreach my $attribute (@{$interface->attributes}) {
2869 if ($attribute->type eq "any") { 2881 if ($attribute->type eq "any") {
2870 push(@anyAttributeNames, $attribute->name); 2882 push(@anyAttributeNames, $attribute->name);
2871 if (!$attribute->extendedAttributes->{"Unserializable"}) { 2883 if (!$attribute->extendedAttributes->{"Unserializable"}) {
2872 push(@serializableAnyAttributeNames, $attribute->name); 2884 push(@serializableAnyAttributeNames, $attribute->name);
2873 } 2885 }
2874 } 2886 }
2875 } 2887 }
(...skipping 12 matching lines...) Expand all
2888 END 2900 END
2889 2901
2890 foreach my $attrName (@anyAttributeNames) { 2902 foreach my $attrName (@anyAttributeNames) {
2891 $implementation{nameSpaceInternal}->add(" v8::Local<v8::Value> ${attr Name};\n"); 2903 $implementation{nameSpaceInternal}->add(" v8::Local<v8::Value> ${attr Name};\n");
2892 } 2904 }
2893 2905
2894 $implementation{nameSpaceInternal}->add(<<END); 2906 $implementation{nameSpaceInternal}->add(<<END);
2895 ${implClassName}Init eventInit; 2907 ${implClassName}Init eventInit;
2896 if (info.Length() >= 2) { 2908 if (info.Length() >= 2) {
2897 V8TRYCATCH_VOID(Dictionary, options, Dictionary(info[1], info.GetIsolate ())); 2909 V8TRYCATCH_VOID(Dictionary, options, Dictionary(info[1], info.GetIsolate ()));
2898 if (!fill${implClassName}Init(eventInit, options)) 2910 ExceptionState exceptionState(info.Holder(), info.GetIsolate());
2911 if (!fill${implClassName}Init(eventInit, options, exceptionState)) {
2912 exceptionState.throwIfNeeded();
2899 return; 2913 return;
2914 }
2900 END 2915 END
2901 2916
2902 # Store 'any'-typed properties on the wrapper to avoid leaking them between isolated worlds. 2917 # Store 'any'-typed properties on the wrapper to avoid leaking them between isolated worlds.
2903 foreach my $attrName (@anyAttributeNames) { 2918 foreach my $attrName (@anyAttributeNames) {
2904 $implementation{nameSpaceInternal}->add(<<END); 2919 $implementation{nameSpaceInternal}->add(<<END);
2905 options.get("${attrName}", ${attrName}); 2920 options.get("${attrName}", ${attrName});
2906 if (!${attrName}.IsEmpty()) 2921 if (!${attrName}.IsEmpty())
2907 info.Holder()->SetHiddenValue(V8HiddenPropertyName::${attrName}(info .GetIsolate()), ${attrName}); 2922 info.Holder()->SetHiddenValue(V8HiddenPropertyName::${attrName}(info .GetIsolate()), ${attrName});
2908 END 2923 END
2909 } 2924 }
2910 2925
2911 $implementation{nameSpaceInternal}->add(<<END); 2926 $implementation{nameSpaceInternal}->add(<<END);
2912 } 2927 }
2928 END
2913 2929
2914 RefPtr<${implClassName}> event = ${implClassName}::create(type, eventInit); 2930 my $exceptionStateArgument = "";
2931 if ($constructorRaisesException) {
2932 ${exceptionStateArgument} = ", exceptionState";
2933 $implementation{nameSpaceInternal}->add(<<END);
2934 ExceptionState exceptionState(info.Holder(), info.GetIsolate());
2915 END 2935 END
2936 }
2937
2938 $implementation{nameSpaceInternal}->add(<<END);
2939 RefPtr<${implClassName}> event = ${implClassName}::create(type, eventInit${e xceptionStateArgument});
2940 END
2941
2942 if ($constructorRaisesException) {
2943 $implementation{nameSpaceInternal}->add(<<END);
2944 if (exceptionState.throwIfNeeded())
2945 return;
2946 END
2947 }
2916 2948
2917 if (@serializableAnyAttributeNames) { 2949 if (@serializableAnyAttributeNames) {
2918 # If we're in an isolated world, create a SerializedScriptValue and stor e it in the event for 2950 # If we're in an isolated world, create a SerializedScriptValue and stor e it in the event for
2919 # later cloning if the property is accessed from another world. 2951 # later cloning if the property is accessed from another world.
2920 # The main world case is handled lazily (in Custom code). 2952 # The main world case is handled lazily (in Custom code).
2921 AddToImplIncludes("bindings/v8/SerializedScriptValue.h"); 2953 AddToImplIncludes("bindings/v8/SerializedScriptValue.h");
2922 $implementation{nameSpaceInternal}->add(" if (isolatedWorldForIsolate (info.GetIsolate())) {\n"); 2954 $implementation{nameSpaceInternal}->add(" if (isolatedWorldForIsolate (info.GetIsolate())) {\n");
2923 foreach my $attrName (@serializableAnyAttributeNames) { 2955 foreach my $attrName (@serializableAnyAttributeNames) {
2924 my $setter = "setSerialized" . FirstLetterToUpperCase($attrName); 2956 my $setter = "setSerialized" . FirstLetterToUpperCase($attrName);
2925 $implementation{nameSpaceInternal}->add(<<END); 2957 $implementation{nameSpaceInternal}->add(<<END);
2926 if (!${attrName}.IsEmpty()) 2958 if (!${attrName}.IsEmpty())
2927 event->${setter}(SerializedScriptValue::createAndSwallowExceptions($ {attrName}, info.GetIsolate())); 2959 event->${setter}(SerializedScriptValue::createAndSwallowExceptions($ {attrName}, info.GetIsolate()));
2928 END 2960 END
2929 } 2961 }
2930 $implementation{nameSpaceInternal}->add(" }\n\n"); 2962 $implementation{nameSpaceInternal}->add(" }\n\n");
2931 } 2963 }
2932 2964
2933 $implementation{nameSpaceInternal}->add(<<END); 2965 $implementation{nameSpaceInternal}->add(<<END);
2934 v8::Handle<v8::Object> wrapper = info.Holder(); 2966 v8::Handle<v8::Object> wrapper = info.Holder();
2935 V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(event.release(), &$ {v8ClassName}::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfiguration ::Dependent); 2967 V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(event.release(), &$ {v8ClassName}::wrapperTypeInfo, wrapper, info.GetIsolate(), WrapperConfiguration ::Dependent);
2936 v8SetReturnValue(info, wrapper); 2968 v8SetReturnValue(info, wrapper);
2937 } 2969 }
2938 END 2970 END
2939 2971
2940 my $code = ""; 2972 my $code = "";
2941 $code .= <<END; 2973 $code .= <<END;
2942 bool fill${implClassName}Init(${implClassName}Init& eventInit, const Dictionary& options) 2974 bool fill${implClassName}Init(${implClassName}Init& eventInit, const Dictionary& options, ExceptionState& exceptionState, const String& forEventName)
2943 { 2975 {
2976 Dictionary::ConversionContext conversionContext(forEventName.isEmpty() ? Str ing("${interfaceName}") : forEventName, "", exceptionState);
2944 END 2977 END
2945 2978
2946 if ($interface->parent) { 2979 if ($interface->parent) {
2947 my $interfaceBase = $interface->parent; 2980 my $interfaceBase = $interface->parent;
2948 $code .= <<END; 2981 $code .= <<END;
2949 if (!fill${interfaceBase}Init(eventInit, options)) 2982 if (!fill${interfaceBase}Init(eventInit, options, exceptionState, forEventNa me.isEmpty() ? String("${interfaceName}") : forEventName))
2950 return false; 2983 return false;
2951 2984
2952 END 2985 END
2953 } 2986 }
2954 2987
2955 foreach my $attribute (@{$interface->attributes}) { 2988 foreach my $attribute (@{$interface->attributes}) {
2956 if ($attribute->extendedAttributes->{"InitializedByEventConstructor"}) { 2989 if ($attribute->extendedAttributes->{"InitializedByEventConstructor"}) {
2957 if ($attribute->type ne "any") { 2990 if ($attribute->type ne "any") {
2958 my $attributeName = $attribute->name; 2991 my $attributeName = $attribute->name;
2959 my $attributeImplName = GetImplName($attribute); 2992 my $attributeImplName = GetImplName($attribute);
2960 my $deprecation = $attribute->extendedAttributes->{"DeprecateAs" }; 2993 my $deprecation = $attribute->extendedAttributes->{"DeprecateAs" };
2961 my $dictionaryGetter = "options.get(\"$attributeName\", eventIni t.$attributeImplName)"; 2994
2995 # Construct the arguments to the corresponding Dictionary.conver t() method.
2996 my @convertArguments = ();
2997 if ($attribute->extendedAttributes->{"EnforceRange"}) {
2998 push(@convertArguments, "EnforceRange");
2999 } elsif ($attribute->extendedAttributes->{"Clamp"}) {
3000 push(@convertArguments, "Clamp");
3001 } elsif (IsIntegerType($attribute->type)) {
3002 push(@convertArguments, "NormalConversion");
3003 } elsif ($attribute->type eq "boolean" || $attribute->type eq "d ouble") {
3004 ;
3005 } elsif ($attribute->type eq "DOMString" || IsEnumType($attribut e->type) || IsCallbackFunctionType($attribute->type)) {
3006 ;
3007 } elsif ($attribute->type ne "object") {
3008 push(@convertArguments, "\"" . $attribute->type . "\"");
3009 }
3010
3011 my $withPropertyAttributes = "";
3012 if (@convertArguments || $attribute->isNullable) {
3013 unshift(@convertArguments, $attribute->isNullable ? "true" : "false");
3014 $withPropertyAttributes = ".withAttributes(" . join(", ", @c onvertArguments) . ")";
3015 }
3016
3017 my $dictionaryGetter = "options.convert(conversionContext${withP ropertyAttributes}, \"$attributeName\", eventInit.$attributeImplName)";
2962 if ($attribute->extendedAttributes->{"DeprecateAs"}) { 3018 if ($attribute->extendedAttributes->{"DeprecateAs"}) {
2963 $code .= " if ($dictionaryGetter)\n"; 3019 $code .= " if ($dictionaryGetter) {\n";
2964 $code .= " " . GenerateDeprecationNotification($attribute ->extendedAttributes->{"DeprecateAs"}); 3020 $code .= " if (options.hasProperty(\"$attributeName\" ))\n";
3021 $code .= " " . GenerateDeprecationNotification($attri bute->extendedAttributes->{"DeprecateAs"});
3022 $code .= " } else {\n";
3023 $code .= " return false;\n";
3024 $code .= " }\n";
2965 } else { 3025 } else {
2966 $code .= " $dictionaryGetter;\n"; 3026 $code .= " if (!$dictionaryGetter)\n";
3027 $code .= " return false;\n";
2967 } 3028 }
2968 } 3029 }
2969 } 3030 }
2970 } 3031 }
2971 3032
2972 $code .= <<END; 3033 $code .= <<END;
2973 return true; 3034 return true;
2974 } 3035 }
2975 3036
2976 END 3037 END
(...skipping 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after
5935 } 5996 }
5936 5997
5937 sub IsPrimitiveType 5998 sub IsPrimitiveType
5938 { 5999 {
5939 my $type = shift; 6000 my $type = shift;
5940 6001
5941 return 1 if $primitiveTypeHash{$type}; 6002 return 1 if $primitiveTypeHash{$type};
5942 return 0; 6003 return 0;
5943 } 6004 }
5944 6005
6006 sub IsIntegerType
6007 {
6008 my $type = shift;
6009
6010 return 1 if $integerTypeHash{$type};
6011 return 0;
6012 }
6013
5945 sub IsCallbackFunctionType 6014 sub IsCallbackFunctionType
5946 { 6015 {
5947 my $type = shift; 6016 my $type = shift;
5948 6017
5949 return 1 if $callbackFunctionTypeHash{$type}; 6018 return 1 if $callbackFunctionTypeHash{$type};
5950 return 0; 6019 return 0;
5951 } 6020 }
5952 6021
5953 sub IsEnumType 6022 sub IsEnumType
5954 { 6023 {
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
6336 6405
6337 return 1 if $interface->extendedAttributes->{"CustomToV8"}; 6406 return 1 if $interface->extendedAttributes->{"CustomToV8"};
6338 return 1 if $interface->extendedAttributes->{"CustomWrap"}; 6407 return 1 if $interface->extendedAttributes->{"CustomWrap"};
6339 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"}; 6408 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"};
6340 return 1 if InheritsInterface($interface, "Document"); 6409 return 1 if InheritsInterface($interface, "Document");
6341 6410
6342 return 0; 6411 return 0;
6343 } 6412 }
6344 6413
6345 1; 6414 1;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698