<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206812] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206812">206812</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-10-05 09:09:20 -0700 (Wed, 05 Oct 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>[Bindings] Declare dictionary / enumeration template specializations in the header
https://bugs.webkit.org/show_bug.cgi?id=162929
Reviewed by Darin Adler.
Declare dictionary / enumeration template specializations in the header
so that:
- They can be used from custom bindings code.
- Dictionaries / enumerations can be used to their own IDL files to
share them (Bug 162912).
No new tests, rebaselined bindings tests.
* WebCore.xcodeproj/project.pbxproj:
* bindings/generic/IDLTypes.h:
* bindings/js/JSDOMConvert.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateInterface):
(GenerateEnumerationImplementationContent):
(GenerateEnumerationHeaderContent):
(GenerateDictionaryHeaderContent):
(GenerateHeader):
(GenerateCallbackHeader):
(GenerateCallbackImplementation):
(GenerateDefaultValue): Deleted.
(GenerateDictionaryImplementationContent): Deleted.
(GenerateParametersCheck): Deleted.
* bindings/scripts/test/JS/JSTestObj.cpp:
* bindings/scripts/test/JS/JSTestObj.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsgenericIDLTypesh">trunk/Source/WebCore/bindings/generic/IDLTypes.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMConverth">trunk/Source/WebCore/bindings/js/JSDOMConvert.h</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjh">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/ChangeLog        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2016-10-05 Chris Dumez <cdumez@apple.com>
+
+ [Bindings] Declare dictionary / enumeration template specializations in the header
+ https://bugs.webkit.org/show_bug.cgi?id=162929
+
+ Reviewed by Darin Adler.
+
+ Declare dictionary / enumeration template specializations in the header
+ so that:
+ - They can be used from custom bindings code.
+ - Dictionaries / enumerations can be used to their own IDL files to
+ share them (Bug 162912).
+
+ No new tests, rebaselined bindings tests.
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/generic/IDLTypes.h:
+ * bindings/js/JSDOMConvert.h:
+ * bindings/scripts/CodeGeneratorJS.pm:
+ (GenerateInterface):
+ (GenerateEnumerationImplementationContent):
+ (GenerateEnumerationHeaderContent):
+ (GenerateDictionaryHeaderContent):
+ (GenerateHeader):
+ (GenerateCallbackHeader):
+ (GenerateCallbackImplementation):
+ (GenerateDefaultValue): Deleted.
+ (GenerateDictionaryImplementationContent): Deleted.
+ (GenerateParametersCheck): Deleted.
+ * bindings/scripts/test/JS/JSTestObj.cpp:
+ * bindings/scripts/test/JS/JSTestObj.h:
+
</ins><span class="cx"> 2016-10-05 Zan Dobersek <zdobersek@igalia.com>
</span><span class="cx">
</span><span class="cx"> Rename ENABLE_ENCRYPTED_MEDIA_V2 to ENABLE_LEGACY_ENCRYPTED_MEDIA
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -2772,7 +2772,7 @@
</span><span class="cx">                 7C93F34E1AA6BF0700A98BAB /* ContentExtensionCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C93F34C1AA6BF0700A98BAB /* ContentExtensionCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C9DBFED1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C9DBFEB1A9C49B1000D6B25 /* JSHTMLAttachmentElement.cpp */; };
</span><span class="cx">                 7C9DBFEE1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C9DBFEC1A9C49B1000D6B25 /* JSHTMLAttachmentElement.h */; };
</span><del>-                7CC16FFB1D77375300CE0877 /* IDLTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC16FFA1D77375300CE0877 /* IDLTypes.h */; };
</del><ins>+                7CC16FFB1D77375300CE0877 /* IDLTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC16FFA1D77375300CE0877 /* IDLTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 7CC289DF1AA0FE5D009A9CE3 /* URLRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = CDEE393817974274001D7580 /* URLRegistry.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7CC564B818BABEA6001B9652 /* TelephoneNumberDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC564B618BABEA6001B9652 /* TelephoneNumberDetector.h */; };
</span><span class="cx">                 7CC564BA18BAC720001B9652 /* TelephoneNumberDetectorCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC564B918BAC720001B9652 /* TelephoneNumberDetectorCocoa.cpp */; };
</span><span class="lines">@@ -3099,7 +3099,7 @@
</span><span class="cx">                 930705EB09E0C9F600B17FE4 /* JSCSSPrimitiveValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 930705EA09E0C9F600B17FE4 /* JSCSSPrimitiveValue.h */; };
</span><span class="cx">                 9307F1D70AF2D59000DBA31A /* HitTestResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9307F1D50AF2D59000DBA31A /* HitTestResult.cpp */; };
</span><span class="cx">                 9307F1D80AF2D59000DBA31A /* HitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 9307F1D60AF2D59000DBA31A /* HitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                930841341CDDB15500B0958C /* JSDOMConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 930841331CDDB15500B0958C /* JSDOMConvert.h */; };
</del><ins>+                930841341CDDB15500B0958C /* JSDOMConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 930841331CDDB15500B0958C /* JSDOMConvert.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 930908910AF7EDE40081DF01 /* HitTestRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 930908900AF7EDE40081DF01 /* HitTestRequest.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 930C90DD19CF965300D6C21A /* InlineIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 930C90DC19CF965300D6C21A /* InlineIterator.cpp */; };
</span><span class="cx">                 93153BDA14181F7A00FCF5BE /* missingImage@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 93153BD914181F7A00FCF5BE /* missingImage@2x.png */; };
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsgenericIDLTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/generic/IDLTypes.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/generic/IDLTypes.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx">
</span><span class="cx"> #include <wtf/Brigand.h>
</span><span class="cx"> #include <wtf/StdLibExtras.h>
</span><ins>+#include <wtf/text/WTFString.h>
</ins><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class JSValue;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMConverth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMConvert.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -408,4 +408,8 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+// Used for IDL enumerations.
+template<typename T> Optional<T> parse(JSC::ExecState&, JSC::JSValue);
+template<typename T> const char* expectedEnumerationValues();
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -128,10 +128,10 @@
</span><span class="cx"> AddStringifierOperationIfNeeded($interface);
</span><span class="cx">
</span><span class="cx"> if ($interface->isCallback) {
</span><del>- $object->GenerateCallbackHeader($interface);
</del><ins>+ $object->GenerateCallbackHeader($interface, $enumerations, $dictionaries);
</ins><span class="cx"> $object->GenerateCallbackImplementation($interface, $enumerations, $dictionaries);
</span><span class="cx"> } else {
</span><del>- $object->GenerateHeader($interface);
</del><ins>+ $object->GenerateHeader($interface, $enumerations, $dictionaries);
</ins><span class="cx"> $object->GenerateImplementation($interface, $enumerations, $dictionaries);
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -808,14 +808,7 @@
</span><span class="cx">
</span><span class="cx"> return "" unless @$enumerations;
</span><span class="cx">
</span><del>- # FIXME: Could optimize this to only generate the parts of each enumeration that are actually
- # used, which would require iterating over everything in the interface.
-
</del><span class="cx"> my $result = "";
</span><del>-
- $result .= "template<typename T> Optional<T> parse(ExecState&, JSValue);\n";
- $result .= "template<typename T> const char* expectedEnumerationValues();\n\n";
-
</del><span class="cx"> foreach my $enumeration (@$enumerations) {
</span><span class="cx"> my $name = $enumeration->name;
</span><span class="cx">
</span><span class="lines">@@ -827,9 +820,6 @@
</span><span class="cx"> my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
</span><span class="cx"> $result .= "#if ${conditionalString}\n\n" if $conditionalString;
</span><span class="cx">
</span><del>- # Declare this instead of using "static" because it may be unused and we don't want warnings about that.
- $result .= "JSString* jsStringWithCache(ExecState*, $className);\n\n";
-
</del><span class="cx"> # Take an ExecState* instead of an ExecState& to match the jsStringWithCache from JSString.h.
</span><span class="cx"> # FIXME: Change to take VM& instead of ExecState*.
</span><span class="cx"> $result .= "JSString* jsStringWithCache(ExecState* state, $className enumerationValue)\n";
</span><span class="lines">@@ -855,10 +845,6 @@
</span><span class="cx"> $result .= " return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);\n";
</span><span class="cx"> $result .= "}\n\n";
</span><span class="cx">
</span><del>- $result .= "template<> struct JSValueTraits<$className> {\n";
- $result .= " static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, $className value) { return jsStringWithCache(state, value); }\n";
- $result .= "};\n\n";
-
</del><span class="cx"> # FIXME: Change to take VM& instead of ExecState&.
</span><span class="cx"> # FIXME: Consider using toStringOrNull to make exception checking faster.
</span><span class="cx"> # FIXME: Consider finding a more efficient way to match against all the strings quickly.
</span><span class="lines">@@ -892,7 +878,7 @@
</span><span class="cx"> $result .= " return result.value();\n";
</span><span class="cx"> $result .= "}\n\n";
</span><span class="cx">
</span><del>- $result .= "template<> inline const char* expectedEnumerationValues<$className>()\n";
</del><ins>+ $result .= "template<> const char* expectedEnumerationValues<$className>()\n";
</ins><span class="cx"> $result .= "{\n";
</span><span class="cx"> $result .= " return \"\\\"" . join ("\\\", \\\"", @{$enumeration->values}) . "\\\"\";\n";
</span><span class="cx"> $result .= "}\n\n";
</span><span class="lines">@@ -902,6 +888,42 @@
</span><span class="cx"> return $result;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+sub GenerateEnumerationHeaderContent
+{
+ my ($interface, $enumerations) = @_;
+
+ return "" unless @$enumerations;
+
+ # FIXME: Could optimize this to only generate the parts of each enumeration that are actually
+ # used, which would require iterating over everything in the interface.
+
+ $headerIncludes{"JSDOMConvert.h"} = 1;
+
+ my $result = "";
+
+ foreach my $enumeration (@$enumerations) {
+ my $name = $enumeration->name;
+
+ my $className = GetEnumerationClassName($interface, $name);
+
+ my $conditionalString = $codeGenerator->GenerateConditionalString($enumeration);
+ $result .= "#if ${conditionalString}\n\n" if $conditionalString;
+
+ $result .= "JSC::JSString* jsStringWithCache(JSC::ExecState*, $className);\n\n";
+
+ $result .= "template<> struct JSValueTraits<$className> {\n";
+ $result .= " static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, $className value) { return jsStringWithCache(state, value); }\n";
+ $result .= "};\n\n";
+
+ $result .= "template<> Optional<$className> parse<$className>(JSC::ExecState&, JSC::JSValue);\n";
+ $result .= "template<> $className convert<$className>(JSC::ExecState&, JSC::JSValue);\n";
+ $result .= "template<> const char* expectedEnumerationValues<$className>();\n\n";
+
+ $result .= "#endif\n\n" if $conditionalString;
+ }
+ return $result;
+}
+
</ins><span class="cx"> sub GetDictionaryClassName
</span><span class="cx"> {
</span><span class="cx"> my ($interface, $name) = @_;
</span><span class="lines">@@ -951,6 +973,31 @@
</span><span class="cx"> return "";
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+sub GenerateDictionaryHeaderContent
+{
+ my ($interface, $allDictionaries) = @_;
+
+ return "" unless @$allDictionaries;
+
+ $headerIncludes{"JSDOMConvert.h"} = 1;
+
+ my $result = "";
+ foreach my $dictionary (@$allDictionaries) {
+ my $name = $dictionary->name;
+
+ my $conditionalString = $codeGenerator->GenerateConditionalString($dictionary);
+ $result .= "#if ${conditionalString}\n\n" if $conditionalString;
+
+ $headerIncludes{$interface->name . ".h"} = 1;
+
+ my $className = GetDictionaryClassName($interface, $name);
+ $result .= "template<> Optional<$className> convertDictionary<$className>(JSC::ExecState&, JSC::JSValue);\n\n";
+
+ $result .= "#endif\n\n" if $conditionalString;
+ }
+ return $result;
+}
+
</ins><span class="cx"> sub GenerateDictionaryImplementationContent
</span><span class="cx"> {
</span><span class="cx"> my ($interface, $allDictionaries) = @_;
</span><span class="lines">@@ -1079,7 +1126,7 @@
</span><span class="cx">
</span><span class="cx"> sub GenerateHeader
</span><span class="cx"> {
</span><del>- my ($object, $interface) = @_;
</del><ins>+ my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx">
</span><span class="cx"> my $interfaceName = $interface->name;
</span><span class="cx"> my $className = "JS$interfaceName";
</span><span class="lines">@@ -1571,6 +1618,9 @@
</span><span class="cx"> push(@headerContent, "};\n");
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+ push(@headerContent, GenerateEnumerationHeaderContent($interface, $enumerations));
+ push(@headerContent, GenerateDictionaryHeaderContent($interface, $dictionaries));
+
</ins><span class="cx"> my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
</span><span class="cx"> push(@headerContent, "\n} // namespace WebCore\n");
</span><span class="cx"> push(@headerContent, "\n#endif // ${conditionalString}\n") if $conditionalString;
</span><span class="lines">@@ -4126,7 +4176,7 @@
</span><span class="cx">
</span><span class="cx"> sub GenerateCallbackHeader
</span><span class="cx"> {
</span><del>- my ($object, $interface) = @_;
</del><ins>+ my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx">
</span><span class="cx"> my $interfaceName = $interface->name;
</span><span class="cx"> my $className = "JS$interfaceName";
</span><span class="lines">@@ -4185,6 +4235,9 @@
</span><span class="cx"> push(@headerContent, "JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, $interfaceName&);\n");
</span><span class="cx"> push(@headerContent, "inline JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, $interfaceName* impl) { return impl ? toJS(state, globalObject, *impl) : JSC::jsNull(); }\n\n");
</span><span class="cx">
</span><ins>+ push(@headerContent, GenerateEnumerationHeaderContent($interface, $enumerations));
+ push(@headerContent, GenerateDictionaryHeaderContent($interface, $dictionaries));
+
</ins><span class="cx"> push(@headerContent, "} // namespace WebCore\n");
</span><span class="cx">
</span><span class="cx"> my $conditionalString = $codeGenerator->GenerateConditionalString($interface);
</span><span class="lines">@@ -4193,7 +4246,7 @@
</span><span class="cx">
</span><span class="cx"> sub GenerateCallbackImplementation
</span><span class="cx"> {
</span><del>- my ($object, $interface, $enumerations) = @_;
</del><ins>+ my ($object, $interface, $enumerations, $dictionaries) = @_;
</ins><span class="cx">
</span><span class="cx"> my $interfaceName = $interface->name;
</span><span class="cx"> my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
</span><span class="lines">@@ -4211,6 +4264,7 @@
</span><span class="cx"> push(@implContent, "namespace WebCore {\n\n");
</span><span class="cx">
</span><span class="cx"> push(@implContent, GenerateEnumerationImplementationContent($interface, $enumerations));
</span><ins>+ push(@implContent, GenerateDictionaryImplementationContent($interface, $dictionaries));
</ins><span class="cx">
</span><span class="cx"> # Constructor
</span><span class="cx"> push(@implContent, "${className}::${className}(JSObject* callback, JSDOMGlobalObject* globalObject)\n");
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx"> #include "JSBlob.h"
</span><span class="cx"> #include "JSDOMBinding.h"
</span><span class="cx"> #include "JSDOMConstructor.h"
</span><del>-#include "JSDOMConvert.h"
</del><span class="cx"> #include "JSDOMIterator.h"
</span><span class="cx"> #include "JSDOMPromise.h"
</span><span class="cx"> #include "JSDOMStringList.h"
</span><span class="lines">@@ -92,11 +91,6 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-template<typename T> Optional<T> parse(ExecState&, JSValue);
-template<typename T> const char* expectedEnumerationValues();
-
-JSString* jsStringWithCache(ExecState*, TestObj::EnumType);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumType enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -113,10 +107,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::EnumType> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumType value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::EnumType> parse<TestObj::EnumType>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -143,13 +133,11 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::EnumType>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::EnumType>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"\", \"enumValue1\", \"EnumValue2\", \"EnumValue3\"";
</span><span class="cx"> }
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Optional);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Optional enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -166,10 +154,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::Optional> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Optional value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::Optional> parse<TestObj::Optional>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -196,13 +180,11 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::Optional>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::Optional>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"\", \"OptionalValue1\", \"OptionalValue2\", \"OptionalValue3\"";
</span><span class="cx"> }
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, AlternateEnumName);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, AlternateEnumName enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -215,10 +197,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<AlternateEnumName> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, AlternateEnumName value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<AlternateEnumName> parse<AlternateEnumName>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -241,7 +219,7 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<AlternateEnumName>()
</del><ins>+template<> const char* expectedEnumerationValues<AlternateEnumName>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"enumValue1\", \"EnumValue2\"";
</span><span class="cx"> }
</span><span class="lines">@@ -248,8 +226,6 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(Condition1)
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumA);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumA enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -260,10 +236,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::EnumA> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumA value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::EnumA> parse<TestObj::EnumA>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -284,7 +256,7 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::EnumA>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::EnumA>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"A\"";
</span><span class="cx"> }
</span><span class="lines">@@ -293,8 +265,6 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(Condition1) && ENABLE(Condition2)
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumB);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumB enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -305,10 +275,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::EnumB> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumB value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::EnumB> parse<TestObj::EnumB>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -329,7 +295,7 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::EnumB>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::EnumB>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"B\"";
</span><span class="cx"> }
</span><span class="lines">@@ -338,8 +304,6 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(Condition1) || ENABLE(Condition2)
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::EnumC);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::EnumC enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -350,10 +314,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::EnumC> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::EnumC value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::EnumC> parse<TestObj::EnumC>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -374,7 +334,7 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::EnumC>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::EnumC>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"C\"";
</span><span class="cx"> }
</span><span class="lines">@@ -381,8 +341,6 @@
</span><span class="cx">
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Kind);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Kind enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -395,10 +353,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::Kind> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Kind value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::Kind> parse<TestObj::Kind>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -421,13 +375,11 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::Kind>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::Kind>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"quick\", \"dead\"";
</span><span class="cx"> }
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Size);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Size enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -440,10 +392,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::Size> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Size value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::Size> parse<TestObj::Size>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -466,13 +414,11 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::Size>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::Size>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"small\", \"much-much-larger\"";
</span><span class="cx"> }
</span><span class="cx">
</span><del>-JSString* jsStringWithCache(ExecState*, TestObj::Confidence);
-
</del><span class="cx"> JSString* jsStringWithCache(ExecState* state, TestObj::Confidence enumerationValue)
</span><span class="cx"> {
</span><span class="cx"> static NeverDestroyed<const String> values[] = {
</span><span class="lines">@@ -485,10 +431,6 @@
</span><span class="cx"> return jsStringWithCache(state, values[static_cast<size_t>(enumerationValue)]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> struct JSValueTraits<TestObj::Confidence> {
- static JSString* arrayJSValue(ExecState* state, JSDOMGlobalObject*, TestObj::Confidence value) { return jsStringWithCache(state, value); }
-};
-
</del><span class="cx"> template<> Optional<TestObj::Confidence> parse<TestObj::Confidence>(ExecState& state, JSValue value)
</span><span class="cx"> {
</span><span class="cx"> auto stringValue = value.toWTFString(&state);
</span><span class="lines">@@ -511,7 +453,7 @@
</span><span class="cx"> return result.value();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<> inline const char* expectedEnumerationValues<TestObj::Confidence>()
</del><ins>+template<> const char* expectedEnumerationValues<TestObj::Confidence>()
</ins><span class="cx"> {
</span><span class="cx"> return "\"high\", \"kinda-low\"";
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h (206811 => 206812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-10-05 16:02:35 UTC (rev 206811)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h        2016-10-05 16:09:20 UTC (rev 206812)
</span><span class="lines">@@ -20,6 +20,7 @@
</span><span class="cx">
</span><span class="cx"> #pragma once
</span><span class="cx">
</span><ins>+#include "JSDOMConvert.h"
</ins><span class="cx"> #include "JSDOMWrapper.h"
</span><span class="cx"> #include "TestObj.h"
</span><span class="cx"> #include <wtf/NeverDestroyed.h>
</span><span class="lines">@@ -104,5 +105,119 @@
</span><span class="cx"> template<> struct JSDOMWrapperConverterTraits<TestObj> {
</span><span class="cx"> using WrapperClass = JSTestObj;
</span><span class="cx"> };
</span><ins>+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumType);
</ins><span class="cx">
</span><ins>+template<> struct JSValueTraits<TestObj::EnumType> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumType value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumType> parse<TestObj::EnumType>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumType convert<TestObj::EnumType>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumType>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Optional);
+
+template<> struct JSValueTraits<TestObj::Optional> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Optional value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Optional> parse<TestObj::Optional>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Optional convert<TestObj::Optional>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Optional>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, AlternateEnumName);
+
+template<> struct JSValueTraits<AlternateEnumName> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, AlternateEnumName value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<AlternateEnumName> parse<AlternateEnumName>(JSC::ExecState&, JSC::JSValue);
+template<> AlternateEnumName convert<AlternateEnumName>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<AlternateEnumName>();
+
+#if ENABLE(Condition1)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumA);
+
+template<> struct JSValueTraits<TestObj::EnumA> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumA value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumA> parse<TestObj::EnumA>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumA convert<TestObj::EnumA>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumA>();
+
+#endif
+
+#if ENABLE(Condition1) && ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumB);
+
+template<> struct JSValueTraits<TestObj::EnumB> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumB value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumB> parse<TestObj::EnumB>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumB convert<TestObj::EnumB>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumB>();
+
+#endif
+
+#if ENABLE(Condition1) || ENABLE(Condition2)
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::EnumC);
+
+template<> struct JSValueTraits<TestObj::EnumC> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::EnumC value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::EnumC> parse<TestObj::EnumC>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::EnumC convert<TestObj::EnumC>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::EnumC>();
+
+#endif
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Kind);
+
+template<> struct JSValueTraits<TestObj::Kind> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Kind value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Kind> parse<TestObj::Kind>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Kind convert<TestObj::Kind>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Kind>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Size);
+
+template<> struct JSValueTraits<TestObj::Size> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Size value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Size> parse<TestObj::Size>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Size convert<TestObj::Size>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Size>();
+
+JSC::JSString* jsStringWithCache(JSC::ExecState*, TestObj::Confidence);
+
+template<> struct JSValueTraits<TestObj::Confidence> {
+ static JSC::JSString* arrayJSValue(JSC::ExecState* state, JSDOMGlobalObject*, TestObj::Confidence value) { return jsStringWithCache(state, value); }
+};
+
+template<> Optional<TestObj::Confidence> parse<TestObj::Confidence>(JSC::ExecState&, JSC::JSValue);
+template<> TestObj::Confidence convert<TestObj::Confidence>(JSC::ExecState&, JSC::JSValue);
+template<> const char* expectedEnumerationValues<TestObj::Confidence>();
+
+template<> Optional<TestObj::Dictionary> convertDictionary<TestObj::Dictionary>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::DictionaryThatShouldNotTolerateNull> convertDictionary<TestObj::DictionaryThatShouldNotTolerateNull>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::DictionaryThatShouldTolerateNull> convertDictionary<TestObj::DictionaryThatShouldTolerateNull>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<AlternateDictionaryName> convertDictionary<AlternateDictionaryName>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::ParentDictionary> convertDictionary<TestObj::ParentDictionary>(JSC::ExecState&, JSC::JSValue);
+
+template<> Optional<TestObj::ChildDictionary> convertDictionary<TestObj::ChildDictionary>(JSC::ExecState&, JSC::JSValue);
+
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>
</body>
</html>