Changeset 207766 in webkit
- Timestamp:
- Oct 24, 2016 11:12:01 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r207764 r207766 1 2016-10-24 Zan Dobersek <zdobersek@igalia.com> 2 3 [CodeGeneratorJS] Standalone dictionaries have misplaced build guards 4 https://bugs.webkit.org/show_bug.cgi?id=163881 5 6 Reviewed by Chris Dumez. 7 8 Build guards that are generated from the Conditional attribute 9 on WebIDL dictionary declarations properly guard the relevant 10 convertDictionary() functions for WebIDL files that also specify 11 interfaces. But for standalone dictionaries these build guards 12 should guard the complete header and implementation files, much 13 like this is done for files that originate from interfaces or 14 callbacks. 15 16 Before this patch, guarding a standalone dictionary resulted in 17 malformed output because GenerateHeaderContentHeader() and 18 GenerateImplementationContentHeader() functions both generated 19 the #if macro that would guard the whole file, but 20 GenerateDictionary{Header,Implementation}() didn't generate the 21 closing #endif. 22 23 CodeGeneratorJS.pm now passes the conditional string, if any, 24 to GenerateDictionary{Header,Implementation}Content() functions 25 in case of a non-standalone dictionary. Otherwise, the 26 conditional string, if any, is used to guard the complete 27 header and implementation files. 28 29 Generator tests are updated to cover various build guard 30 combinations on dictionaries in TestObj.idl, and the standalone 31 dictionary WebIDL file now has a Conditional attribute to check 32 that the build guards cover complete generated header and 33 implementation files. 34 35 * bindings/scripts/CodeGeneratorJS.pm: 36 (GenerateDictionaryHeaderContent): 37 (GenerateDictionariesHeaderContent): 38 (GenerateDictionaryImplementationContent): 39 (GenerateDictionariesImplementationContent): 40 (GenerateDictionaryHeader): 41 (GenerateDictionaryImplementation): 42 * bindings/scripts/test/JS/JSTestObj.cpp: 43 (WebCore::convertDictionary<TestObj::ConditionalDictionaryA>): 44 (WebCore::convertDictionary<TestObj::ConditionalDictionaryB>): 45 (WebCore::convertDictionary<TestObj::ConditionalDictionaryC>): 46 * bindings/scripts/test/JS/JSTestObj.h: 47 * bindings/scripts/test/JS/JSTestStandaloneDictionary.cpp: 48 * bindings/scripts/test/JS/JSTestStandaloneDictionary.h: 49 * bindings/scripts/test/TestObj.idl: 50 * bindings/scripts/test/TestStandaloneDictionary.idl: 51 1 52 2016-10-24 Eric Carlson <eric.carlson@apple.com> 2 53 -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r207737 r207766 1054 1054 sub GenerateDictionaryHeaderContent 1055 1055 { 1056 my ($dictionary, $className ) = @_;1056 my ($dictionary, $className, $conditionalString) = @_; 1057 1057 1058 1058 my $result = ""; 1059 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);1060 1059 $result .= "#if ${conditionalString}\n\n" if $conditionalString; 1061 1060 $result .= "template<> $className convertDictionary<$className>(JSC::ExecState&, JSC::JSValue);\n\n"; … … 1076 1075 $headerIncludes{$interface->name . ".h"} = 1; 1077 1076 my $className = GetDictionaryClassName($dictionary->name, $interface); 1078 $result .= GenerateDictionaryHeaderContent($dictionary, $className); 1077 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary); 1078 $result .= GenerateDictionaryHeaderContent($dictionary, $className, $conditionalString); 1079 1079 } 1080 1080 return $result; … … 1083 1083 sub GenerateDictionaryImplementationContent 1084 1084 { 1085 my ($dictionary, $className, $interface ) = @_;1085 my ($dictionary, $className, $interface, $conditionalString) = @_; 1086 1086 1087 1087 my $result = ""; … … 1089 1089 my $name = $dictionary->name; 1090 1090 1091 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);1092 1091 $result .= "#if ${conditionalString}\n\n" if $conditionalString; 1093 1092 … … 1187 1186 foreach my $dictionary (@$allDictionaries) { 1188 1187 my $className = GetDictionaryClassName($dictionary->name, $interface); 1189 $result .= GenerateDictionaryImplementationContent($dictionary, $className, $interface); 1188 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary); 1189 $result .= GenerateDictionaryImplementationContent($dictionary, $className, $interface, $conditionalString); 1190 1190 } 1191 1191 return $result; … … 4468 4468 push(@headerContent, GenerateDictionaryHeaderContent($dictionary, $className)); 4469 4469 push(@headerContent, "} // namespace WebCore\n"); 4470 4471 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary); 4472 push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString; 4470 4473 4471 4474 # - Generate dependencies. … … 4495 4498 push(@implContent, GenerateDictionaryImplementationContent($dictionary, $className)); 4496 4499 push(@implContent, "} // namespace WebCore\n"); 4500 4501 my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary); 4502 push(@implContent, "\n#endif // ${conditionalString}\n") if $conditionalString; 4497 4503 } 4498 4504 -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
r207737 r207766 857 857 return result; 858 858 } 859 860 #if ENABLE(Condition1) 861 862 template<> TestObj::ConditionalDictionaryA convertDictionary<TestObj::ConditionalDictionaryA>(ExecState& state, JSValue value) 863 { 864 VM& vm = state.vm(); 865 auto throwScope = DECLARE_THROW_SCOPE(vm); 866 bool isNullOrUndefined = value.isUndefinedOrNull(); 867 auto* object = isNullOrUndefined ? nullptr : value.getObject(); 868 if (UNLIKELY(!isNullOrUndefined && !object)) { 869 throwTypeError(&state, throwScope); 870 return { }; 871 } 872 if (UNLIKELY(object && object->type() == RegExpObjectType)) { 873 throwTypeError(&state, throwScope); 874 return { }; 875 } 876 TestObj::ConditionalDictionaryA result; 877 JSValue stringWithoutDefaultValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "stringWithoutDefault")); 878 if (!stringWithoutDefaultValue.isUndefined()) { 879 result.stringWithoutDefault = convert<IDLDOMString>(state, stringWithoutDefaultValue); 880 RETURN_IF_EXCEPTION(throwScope, { }); 881 } 882 return result; 883 } 884 885 #endif 886 887 #if ENABLE(Condition1) && ENABLE(Condition2) 888 889 template<> TestObj::ConditionalDictionaryB convertDictionary<TestObj::ConditionalDictionaryB>(ExecState& state, JSValue value) 890 { 891 VM& vm = state.vm(); 892 auto throwScope = DECLARE_THROW_SCOPE(vm); 893 bool isNullOrUndefined = value.isUndefinedOrNull(); 894 auto* object = isNullOrUndefined ? nullptr : value.getObject(); 895 if (UNLIKELY(!isNullOrUndefined && !object)) { 896 throwTypeError(&state, throwScope); 897 return { }; 898 } 899 if (UNLIKELY(object && object->type() == RegExpObjectType)) { 900 throwTypeError(&state, throwScope); 901 return { }; 902 } 903 TestObj::ConditionalDictionaryB result; 904 JSValue stringWithoutDefaultValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "stringWithoutDefault")); 905 if (!stringWithoutDefaultValue.isUndefined()) { 906 result.stringWithoutDefault = convert<IDLDOMString>(state, stringWithoutDefaultValue); 907 RETURN_IF_EXCEPTION(throwScope, { }); 908 } 909 return result; 910 } 911 912 #endif 913 914 #if ENABLE(Condition1) || ENABLE(Condition2) 915 916 template<> TestObj::ConditionalDictionaryC convertDictionary<TestObj::ConditionalDictionaryC>(ExecState& state, JSValue value) 917 { 918 VM& vm = state.vm(); 919 auto throwScope = DECLARE_THROW_SCOPE(vm); 920 bool isNullOrUndefined = value.isUndefinedOrNull(); 921 auto* object = isNullOrUndefined ? nullptr : value.getObject(); 922 if (UNLIKELY(!isNullOrUndefined && !object)) { 923 throwTypeError(&state, throwScope); 924 return { }; 925 } 926 if (UNLIKELY(object && object->type() == RegExpObjectType)) { 927 throwTypeError(&state, throwScope); 928 return { }; 929 } 930 TestObj::ConditionalDictionaryC result; 931 JSValue stringWithoutDefaultValue = isNullOrUndefined ? jsUndefined() : object->get(&state, Identifier::fromString(&state, "stringWithoutDefault")); 932 if (!stringWithoutDefaultValue.isUndefined()) { 933 result.stringWithoutDefault = convert<IDLDOMString>(state, stringWithoutDefaultValue); 934 RETURN_IF_EXCEPTION(throwScope, { }); 935 } 936 return result; 937 } 938 939 #endif 859 940 860 941 // Functions -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
r207737 r207766 185 185 template<> TestObj::ChildDictionary convertDictionary<TestObj::ChildDictionary>(JSC::ExecState&, JSC::JSValue); 186 186 187 #if ENABLE(Condition1) 188 189 template<> TestObj::ConditionalDictionaryA convertDictionary<TestObj::ConditionalDictionaryA>(JSC::ExecState&, JSC::JSValue); 190 191 #endif 192 193 #if ENABLE(Condition1) && ENABLE(Condition2) 194 195 template<> TestObj::ConditionalDictionaryB convertDictionary<TestObj::ConditionalDictionaryB>(JSC::ExecState&, JSC::JSValue); 196 197 #endif 198 199 #if ENABLE(Condition1) || ENABLE(Condition2) 200 201 template<> TestObj::ConditionalDictionaryC convertDictionary<TestObj::ConditionalDictionaryC>(JSC::ExecState&, JSC::JSValue); 202 203 #endif 204 187 205 188 206 } // namespace WebCore -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestStandaloneDictionary.cpp
r207498 r207766 20 20 21 21 #include "config.h" 22 23 #if ENABLE(Condition1) 24 22 25 #include "JSTestStandaloneDictionary.h" 23 26 … … 56 59 57 60 } // namespace WebCore 61 62 #endif // ENABLE(Condition1) -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestStandaloneDictionary.h
r207498 r207766 21 21 #pragma once 22 22 23 #if ENABLE(Condition1) 24 23 25 #include "DictionaryImplName.h" 24 26 #include "JSDOMConvert.h" … … 29 31 30 32 } // namespace WebCore 33 34 #endif // ENABLE(Condition1) -
trunk/Source/WebCore/bindings/scripts/test/TestObj.idl
r207725 r207766 513 513 }; 514 514 515 [ 516 Conditional=Condition1 517 ] dictionary TestConditionalDictionaryA { 518 DOMString stringWithoutDefault; 519 }; 520 521 [ 522 Conditional=Condition1&Condition2 523 ] dictionary TestConditionalDictionaryB { 524 DOMString stringWithoutDefault; 525 }; 526 527 [ 528 Conditional=Condition1|Condition2 529 ] dictionary TestConditionalDictionaryC { 530 DOMString stringWithoutDefault; 531 }; -
trunk/Source/WebCore/bindings/scripts/test/TestStandaloneDictionary.idl
r207243 r207766 29 29 [ 30 30 ImplementedAs=DictionaryImplName, 31 Conditional=Condition1, 31 32 ] dictionary TestStandaloneDictionary { 32 33 boolean boolMember;
Note: See TracChangeset
for help on using the changeset viewer.