<!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>[204497] 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/204497">204497</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-08-15 23:24:39 -0700 (Mon, 15 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add support for dictionary members of non nullable wrapper types
https://bugs.webkit.org/show_bug.cgi?id=160876

Reviewed by Darin Adler.

Add support for dictionary members of non nullable wrapper types. We
only supported nullable wrapper types as dictionary members so far.

No new tests, updated bindings tests.

* bindings/js/JSDOMConvert.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateDictionaryImplementationContent):
(GenerateParametersCheck):
(JSValueToNative):
(GenerateConstructorDefinition):
* bindings/scripts/test/JS/JSTestInterface.cpp:
(WebCore::JSTestInterfaceConstructor::construct):
* bindings/scripts/test/JS/JSTestNamedConstructor.cpp:
(WebCore::JSTestNamedConstructorNamedConstructor::construct):
* bindings/scripts/test/JS/JSTestObj.cpp:
(WebCore::convertDictionary&lt;TestObj::Dictionary&gt;):
(WebCore::convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;):
(WebCore::convertDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;):
(WebCore::jsTestObjPrototypeFunctionAttachShadowRoot):
* bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp:
(WebCore::constructJSTestOverloadedConstructors4):
(WebCore::constructJSTestOverloadedConstructors5):
* bindings/scripts/test/JS/JSTestTypedefs.cpp:
(WebCore::JSTestTypedefsConstructor::construct):
* bindings/scripts/test/TestObj.idl:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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="#trunkSourceWebCorebindingsscriptstestJSJSTestInterfacecpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestNamedConstructorcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestOverloadedConstructorscpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestJSJSTestTypedefscpp">trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptstestTestObjidl">trunk/Source/WebCore/bindings/scripts/test/TestObj.idl</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/ChangeLog        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -1,5 +1,39 @@
</span><span class="cx"> 2016-08-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Add support for dictionary members of non nullable wrapper types
+        https://bugs.webkit.org/show_bug.cgi?id=160876
+
+        Reviewed by Darin Adler.
+
+        Add support for dictionary members of non nullable wrapper types. We
+        only supported nullable wrapper types as dictionary members so far.
+
+        No new tests, updated bindings tests.
+
+        * bindings/js/JSDOMConvert.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateDictionaryImplementationContent):
+        (GenerateParametersCheck):
+        (JSValueToNative):
+        (GenerateConstructorDefinition):
+        * bindings/scripts/test/JS/JSTestInterface.cpp:
+        (WebCore::JSTestInterfaceConstructor::construct):
+        * bindings/scripts/test/JS/JSTestNamedConstructor.cpp:
+        (WebCore::JSTestNamedConstructorNamedConstructor::construct):
+        * bindings/scripts/test/JS/JSTestObj.cpp:
+        (WebCore::convertDictionary&lt;TestObj::Dictionary&gt;):
+        (WebCore::convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;):
+        (WebCore::convertDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;):
+        (WebCore::jsTestObjPrototypeFunctionAttachShadowRoot):
+        * bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp:
+        (WebCore::constructJSTestOverloadedConstructors4):
+        (WebCore::constructJSTestOverloadedConstructors5):
+        * bindings/scripts/test/JS/JSTestTypedefs.cpp:
+        (WebCore::JSTestTypedefsConstructor::construct):
+        * bindings/scripts/test/TestObj.idl:
+
+2016-08-15  Chris Dumez  &lt;cdumez@apple.com&gt;
+
</ins><span class="cx">         Drop unused EventTarget::hasActiveEventListeners()
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=160869
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMConverth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMConvert.h (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/js/JSDOMConvert.h        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -49,6 +49,8 @@
</span><span class="cx"> template&lt;typename T, typename U&gt; EnableIfIntegralType&lt;T&gt; convertOptional(JSC::ExecState&amp;, JSC::JSValue, IntegerConversionConfiguration, U&amp;&amp; defaultValue);
</span><span class="cx"> template&lt;typename T, typename U&gt; EnableIfFloatingPointType&lt;T&gt; convertOptional(JSC::ExecState&amp;, JSC::JSValue, ShouldAllowNonFinite, U&amp;&amp; defaultValue);
</span><span class="cx"> 
</span><ins>+template&lt;typename T&gt; Optional&lt;T&gt; convertDictionary(JSC::ExecState&amp;, JSC::JSValue);
+
</ins><span class="cx"> enum class IsNullable { No, Yes };
</span><span class="cx"> template&lt;typename T, typename JST&gt; T* convertWrapperType(JSC::ExecState&amp;, JSC::JSValue, IsNullable);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -980,14 +980,14 @@
</span><span class="cx">             $comma = &quot;, &quot;;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        $result .= &quot;template&lt;&gt; $className convert&lt;$className&gt;(ExecState&amp; state, JSValue value)\n&quot;;
</del><ins>+        $result .= &quot;template&lt;&gt; Optional&lt;$className&gt; convertDictionary&lt;$className&gt;(ExecState&amp; state, JSValue value)\n&quot;;
</ins><span class="cx">         $result .= &quot;{\n&quot;;
</span><span class="cx">         $result .= &quot;    if (value.isUndefinedOrNull())\n&quot; if $defaultValues;
</span><del>-        $result .= &quot;        return { &quot; . $defaultValues . &quot; };\n&quot; if $defaultValues;
</del><ins>+        $result .= &quot;        return $className { &quot; . $defaultValues . &quot; };\n&quot; if $defaultValues;
</ins><span class="cx">         $result .= &quot;    auto* object = value.getObject();\n&quot;;
</span><span class="cx">         $result .= &quot;    if (UNLIKELY(!object || object-&gt;type() == RegExpObjectType)) {\n&quot;;
</span><span class="cx">         $result .= &quot;        throwTypeError(&amp;state);\n&quot;;
</span><del>-        $result .= &quot;        return { };\n&quot;;
</del><ins>+        $result .= &quot;        return Nullopt;\n&quot;;
</ins><span class="cx">         $result .= &quot;    }\n&quot;;
</span><span class="cx"> 
</span><span class="cx">         my $needExceptionCheck = 0;
</span><span class="lines">@@ -994,7 +994,7 @@
</span><span class="cx">         foreach my $member (@{$dictionary-&gt;members}) {
</span><span class="cx">             if ($needExceptionCheck) {
</span><span class="cx">                 $result .= &quot;    if (UNLIKELY(state.hadException()))\n&quot;;
</span><del>-                $result .= &quot;        return { };\n&quot;;
</del><ins>+                $result .= &quot;        return Nullopt;\n&quot;;
</ins><span class="cx">             }
</span><span class="cx">             # FIXME: Eventually we will want this to share a lot more code with JSValueToNative.
</span><span class="cx">             my $type = $member-&gt;type;
</span><span class="lines">@@ -1001,9 +1001,10 @@
</span><span class="cx">             my $name = $member-&gt;name;
</span><span class="cx">             my $value = &quot;object-&gt;get(&amp;state, Identifier::fromString(&amp;state, \&quot;${name}\&quot;))&quot;;
</span><span class="cx">             if ($codeGenerator-&gt;IsWrapperType($member-&gt;type)) {
</span><del>-                die &quot;Dictionary member of non-nullable wrapper types are not supported yet&quot; unless $member-&gt;isNullable;
</del><span class="cx">                 AddToImplIncludes(&quot;JS${type}.h&quot;);
</span><del>-                $result .= &quot;    auto* $name = convertWrapperType&lt;$type, JS${type}&gt;(state, $value, IsNullable::Yes);\n&quot;;
</del><ins>+                die &quot;Dictionary members of non-nullable wrapper types must be marked as required&quot; if !$member-&gt;isNullable &amp;&amp; $member-&gt;isOptional;
+                my $nullableParameter = $member-&gt;isNullable ? &quot;IsNullable::Yes&quot; : &quot;IsNullable::No&quot;;
+                $result .= &quot;    auto* $name = convertWrapperType&lt;$type, JS${type}&gt;(state, $value, $nullableParameter);\n&quot;;
</ins><span class="cx">             } else {
</span><span class="cx">                 my $function = $member-&gt;isOptional ? &quot;convertOptional&quot; : &quot;convert&quot;;
</span><span class="cx">                 $result .= &quot;    auto $name = ${function}&lt;&quot; . GetNativeTypeFromSignature($interface, $member) . &quot;&gt;(state, $value&quot;
</span><span class="lines">@@ -1016,11 +1017,17 @@
</span><span class="cx">         my $arguments = &quot;&quot;;
</span><span class="cx">         $comma = &quot;&quot;;
</span><span class="cx">         foreach my $member (@{$dictionary-&gt;members}) {
</span><del>-            $arguments .= $comma . &quot;WTFMove(&quot; . $member-&gt;name . &quot;)&quot;;
</del><ins>+            my $value;
+            if ($codeGenerator-&gt;IsWrapperType($member-&gt;type) &amp;&amp; !$member-&gt;isNullable) {
+                $value = &quot;*&quot; . $member-&gt;name;
+            } else {
+                $value = &quot;WTFMove(&quot; . $member-&gt;name . &quot;)&quot;;
+            }
+            $arguments .= $comma . $value;
</ins><span class="cx">             $comma = &quot;, &quot;;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        $result .= &quot;    return { &quot; . $arguments . &quot; };\n&quot;;
</del><ins>+        $result .= &quot;    return $className { &quot; . $arguments . &quot; };\n&quot;;
</ins><span class="cx">         $result .= &quot;}\n\n&quot;;
</span><span class="cx"> 
</span><span class="cx">         $result .= &quot;#endif\n\n&quot; if $conditionalString;
</span><span class="lines">@@ -4007,6 +4014,8 @@
</span><span class="cx"> 
</span><span class="cx">             if ($codeGenerator-&gt;IsTypedArrayType($type) and $parameter-&gt;type ne &quot;ArrayBuffer&quot;) {
</span><span class="cx">                $value = $shouldPassByReference ? &quot;$name.releaseNonNull()&quot; : &quot;WTFMove($name)&quot;;
</span><ins>+            } elsif ($codeGenerator-&gt;IsDictionaryType($type)) {
+                $value = &quot;${name}.value()&quot;;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -4678,7 +4687,7 @@
</span><span class="cx"> 
</span><span class="cx">     return (&quot;to$type($value)&quot;, 1) if $codeGenerator-&gt;IsTypedArrayType($type);
</span><span class="cx">     return (&quot;parse&lt;&quot; . GetEnumerationClassName($interface, $type) . &quot;&gt;(*state, $value)&quot;, 1) if $codeGenerator-&gt;IsEnumType($type);
</span><del>-    return (&quot;convert&lt;&quot; . GetDictionaryClassName($interface, $type) . &quot;&gt;(*state, $value)&quot;, 1) if $codeGenerator-&gt;IsDictionaryType($type);
</del><ins>+    return (&quot;convertDictionary&lt;&quot; . GetDictionaryClassName($interface, $type) . &quot;&gt;(*state, $value)&quot;, 1) if $codeGenerator-&gt;IsDictionaryType($type);
</ins><span class="cx"> 
</span><span class="cx">     AddToImplIncludes(&quot;JS$type.h&quot;, $conditional);
</span><span class="cx"> 
</span><span class="lines">@@ -5308,8 +5317,10 @@
</span><span class="cx">                 last if $index eq $paramIndex;
</span><span class="cx">                 if (ShouldPassWrapperByReference($parameter, $interface)) {
</span><span class="cx">                     push(@constructorArgList, &quot;*&quot; . $parameter-&gt;name);
</span><ins>+                } elsif ($codeGenerator-&gt;IsDictionaryType($parameter-&gt;type)) {
+                    push(@constructorArgList, $parameter-&gt;name . &quot;.value()&quot;);
</ins><span class="cx">                 } else {
</span><del>-                    push(@constructorArgList, $parameter-&gt;name);
</del><ins>+                    push(@constructorArgList, &quot;WTFMove(&quot; . $parameter-&gt;name . &quot;)&quot;);
</ins><span class="cx">                 }
</span><span class="cx">                 $index++;
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestInterfacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -235,7 +235,7 @@
</span><span class="cx">     ScriptExecutionContext* context = castedThis-&gt;scriptExecutionContext();
</span><span class="cx">     if (UNLIKELY(!context))
</span><span class="cx">         return throwConstructorDocumentUnavailableError(*state, &quot;TestInterface&quot;);
</span><del>-    auto object = TestInterface::create(*context, str1, str2, ec);
</del><ins>+    auto object = TestInterface::create(*context, WTFMove(str1), WTFMove(str2), ec);
</ins><span class="cx">     if (UNLIKELY(ec)) {
</span><span class="cx">         setDOMException(state, ec);
</span><span class="cx">         return JSValue::encode(JSValue());
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestNamedConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">     auto str3 = state-&gt;argument(2).isUndefined() ? String() : state-&gt;uncheckedArgument(2).toWTFString(state);
</span><span class="cx">     if (UNLIKELY(state-&gt;hadException()))
</span><span class="cx">         return JSValue::encode(jsUndefined());
</span><del>-    auto object = TestNamedConstructor::createForJSConstructor(*castedThis-&gt;document(), str1, str2, str3, ec);
</del><ins>+    auto object = TestNamedConstructor::createForJSConstructor(*castedThis-&gt;document(), WTFMove(str1), WTFMove(str2), WTFMove(str3), ec);
</ins><span class="cx">     if (UNLIKELY(ec)) {
</span><span class="cx">         setDOMException(state, ec);
</span><span class="cx">         return JSValue::encode(JSValue());
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestObjcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -452,137 +452,140 @@
</span><span class="cx">     return &quot;\&quot;high\&quot;, \&quot;kinda-low\&quot;&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; TestObj::Dictionary convert&lt;TestObj::Dictionary&gt;(ExecState&amp; state, JSValue value)
</del><ins>+template&lt;&gt; Optional&lt;TestObj::Dictionary&gt; convertDictionary&lt;TestObj::Dictionary&gt;(ExecState&amp; state, JSValue value)
</ins><span class="cx"> {
</span><span class="cx">     if (value.isUndefinedOrNull())
</span><del>-        return { { }, TestObj::EnumType::EnumValue1, TestObj::EnumType::EmptyString, &quot;defaultString&quot;, { }, false, { }, { }, { }, { }, 0, 0, { }, { }, 0, 0, { }, { }, { }, 0, { }, 0, { }, 0, { }, 0, { }, 0, nullptr, jsUndefined(), jsUndefined() };
</del><ins>+        return TestObj::Dictionary { { }, TestObj::EnumType::EnumValue1, TestObj::EnumType::EmptyString, &quot;defaultString&quot;, { }, false, { }, { }, { }, { }, 0, 0, { }, { }, 0, 0, { }, { }, { }, 0, { }, 0, { }, 0, { }, 0, { }, 0, nullptr, jsUndefined(), jsUndefined() };
</ins><span class="cx">     auto* object = value.getObject();
</span><span class="cx">     if (UNLIKELY(!object || object-&gt;type() == RegExpObjectType)) {
</span><span class="cx">         throwTypeError(&amp;state);
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     }
</span><span class="cx">     auto enumerationValueWithoutDefault = convertOptional&lt;TestObj::EnumType&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;enumerationValueWithoutDefault&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto enumerationValueWithDefault = convertOptional&lt;TestObj::EnumType&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;enumerationValueWithDefault&quot;)), TestObj::EnumType::EnumValue1);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto enumerationValueWithEmptyStringDefault = convertOptional&lt;TestObj::EnumType&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;enumerationValueWithEmptyStringDefault&quot;)), TestObj::EnumType::EmptyString);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto stringWithDefault = convertOptional&lt;String&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;stringWithDefault&quot;)), &quot;defaultString&quot;);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto stringWithoutDefault = convertOptional&lt;String&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;stringWithoutDefault&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto booleanWithDefault = convertOptional&lt;bool&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;booleanWithDefault&quot;)), false);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto booleanWithoutDefault = convertOptional&lt;bool&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;booleanWithoutDefault&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto sequenceOfStrings = convertOptional&lt;Vector&lt;String&gt;&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;sequenceOfStrings&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto restrictedDouble = convertOptional&lt;double&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;restrictedDouble&quot;)), ShouldAllowNonFinite::No);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unrestrictedDouble = convertOptional&lt;double&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unrestrictedDouble&quot;)), ShouldAllowNonFinite::Yes);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto restrictedDoubleWithDefault = convertOptional&lt;double&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;restrictedDoubleWithDefault&quot;)), ShouldAllowNonFinite::No, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unrestrictedDoubleWithDefault = convertOptional&lt;double&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unrestrictedDoubleWithDefault&quot;)), ShouldAllowNonFinite::Yes, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto restrictedFloat = convertOptional&lt;float&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;restrictedFloat&quot;)), ShouldAllowNonFinite::No);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unrestrictedFloat = convertOptional&lt;float&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unrestrictedFloat&quot;)), ShouldAllowNonFinite::Yes);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto restrictedFloatWithDefault = convertOptional&lt;float&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;restrictedFloatWithDefault&quot;)), ShouldAllowNonFinite::No, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unrestrictedFloatWithDefault = convertOptional&lt;float&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unrestrictedFloatWithDefault&quot;)), ShouldAllowNonFinite::Yes, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto smallIntegerClamped = convertOptional&lt;int8_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;smallIntegerClamped&quot;)), Clamp);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto smallIntegerWithDefault = convertOptional&lt;int8_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;smallIntegerWithDefault&quot;)), NormalConversion);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto smallUnsignedIntegerEnforcedRange = convertOptional&lt;uint8_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;smallUnsignedIntegerEnforcedRange&quot;)), EnforceRange);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto smallUnsignedIntegerWithDefault = convertOptional&lt;uint8_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;smallUnsignedIntegerWithDefault&quot;)), NormalConversion, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto integer = convertOptional&lt;int32_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;integer&quot;)), NormalConversion);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto integerWithDefault = convertOptional&lt;int32_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;integerWithDefault&quot;)), NormalConversion, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unsignedInteger = convertOptional&lt;uint32_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unsignedInteger&quot;)), NormalConversion);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unsignedIntegerWithDefault = convertOptional&lt;uint32_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unsignedIntegerWithDefault&quot;)), NormalConversion, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto largeInteger = convertOptional&lt;int64_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;largeInteger&quot;)), NormalConversion);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto largeIntegerWithDefault = convertOptional&lt;int64_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;largeIntegerWithDefault&quot;)), NormalConversion, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unsignedLargeInteger = convertOptional&lt;uint64_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unsignedLargeInteger&quot;)), NormalConversion);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto unsignedLargeIntegerWithDefault = convertOptional&lt;uint64_t&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;unsignedLargeIntegerWithDefault&quot;)), NormalConversion, 0);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto* nullableNode = convertWrapperType&lt;Node, JSNode&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;nullableNode&quot;)), IsNullable::Yes);
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto anyValue = convertOptional&lt;JSC::JSValue&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;anyValue&quot;)), jsUndefined());
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto anyTypedefValue = convertOptional&lt;JSC::JSValue&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;anyTypedefValue&quot;)), jsUndefined());
</span><del>-    return { WTFMove(enumerationValueWithoutDefault), WTFMove(enumerationValueWithDefault), WTFMove(enumerationValueWithEmptyStringDefault), WTFMove(stringWithDefault), WTFMove(stringWithoutDefault), WTFMove(booleanWithDefault), WTFMove(booleanWithoutDefault), WTFMove(sequenceOfStrings), WTFMove(restrictedDouble), WTFMove(unrestrictedDouble), WTFMove(restrictedDoubleWithDefault), WTFMove(unrestrictedDoubleWithDefault), WTFMove(restrictedFloat), WTFMove(unrestrictedFloat), WTFMove(restrictedFloatWithDefault), WTFMove(unrestrictedFloatWithDefault), WTFMove(smallIntegerClamped), WTFMove(smallIntegerWithDefault), WTFMove(smallUnsignedIntegerEnforcedRange), WTFMove(smallUnsignedIntegerWithDefault), WTFMove(integer), WTFMove(integerWithDefault), WTFMove(unsignedInteger), WTFMove(unsignedIntegerWithDefault), WTFMove(largeInteger), WTFMove(largeIntegerWithDefault), WTFMove(unsignedLargeInteger), WTFMove(unsignedLargeIntegerWithDefault), WTFMove(nullableNode), WTFMove(any
 Value), WTFMove(anyTypedefValue) };
</del><ins>+    return TestObj::Dictionary { WTFMove(enumerationValueWithoutDefault), WTFMove(enumerationValueWithDefault), WTFMove(enumerationValueWithEmptyStringDefault), WTFMove(stringWithDefault), WTFMove(stringWithoutDefault), WTFMove(booleanWithDefault), WTFMove(booleanWithoutDefault), WTFMove(sequenceOfStrings), WTFMove(restrictedDouble), WTFMove(unrestrictedDouble), WTFMove(restrictedDoubleWithDefault), WTFMove(unrestrictedDoubleWithDefault), WTFMove(restrictedFloat), WTFMove(unrestrictedFloat), WTFMove(restrictedFloatWithDefault), WTFMove(unrestrictedFloatWithDefault), WTFMove(smallIntegerClamped), WTFMove(smallIntegerWithDefault), WTFMove(smallUnsignedIntegerEnforcedRange), WTFMove(smallUnsignedIntegerWithDefault), WTFMove(integer), WTFMove(integerWithDefault), WTFMove(unsignedInteger), WTFMove(unsignedIntegerWithDefault), WTFMove(largeInteger), WTFMove(largeIntegerWithDefault), WTFMove(unsignedLargeInteger), WTFMove(unsignedLargeIntegerWithDefault), WTFMove(nullabl
 eNode), WTFMove(anyValue), WTFMove(anyTypedefValue) };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; TestObj::DictionaryThatShouldNotTolerateNull convert&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;(ExecState&amp; state, JSValue value)
</del><ins>+template&lt;&gt; Optional&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt; convertDictionary&lt;TestObj::DictionaryThatShouldNotTolerateNull&gt;(ExecState&amp; state, JSValue value)
</ins><span class="cx"> {
</span><span class="cx">     auto* object = value.getObject();
</span><span class="cx">     if (UNLIKELY(!object || object-&gt;type() == RegExpObjectType)) {
</span><span class="cx">         throwTypeError(&amp;state);
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     }
</span><span class="cx">     auto requiredEnumerationValue = convert&lt;TestObj::EnumType&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;requiredEnumerationValue&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto booleanWithoutDefault = convertOptional&lt;bool&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;booleanWithoutDefault&quot;)));
</span><del>-    return { WTFMove(requiredEnumerationValue), WTFMove(booleanWithoutDefault) };
</del><ins>+    if (UNLIKELY(state.hadException()))
+        return Nullopt;
+    auto* nonNullableNode = convertWrapperType&lt;Node, JSNode&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;nonNullableNode&quot;)), IsNullable::No);
+    return TestObj::DictionaryThatShouldNotTolerateNull { WTFMove(requiredEnumerationValue), WTFMove(booleanWithoutDefault), *nonNullableNode };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt; TestObj::DictionaryThatShouldTolerateNull convert&lt;TestObj::DictionaryThatShouldTolerateNull&gt;(ExecState&amp; state, JSValue value)
</del><ins>+template&lt;&gt; Optional&lt;TestObj::DictionaryThatShouldTolerateNull&gt; convertDictionary&lt;TestObj::DictionaryThatShouldTolerateNull&gt;(ExecState&amp; state, JSValue value)
</ins><span class="cx"> {
</span><span class="cx">     if (value.isUndefinedOrNull())
</span><del>-        return { { }, { } };
</del><ins>+        return TestObj::DictionaryThatShouldTolerateNull { { }, { } };
</ins><span class="cx">     auto* object = value.getObject();
</span><span class="cx">     if (UNLIKELY(!object || object-&gt;type() == RegExpObjectType)) {
</span><span class="cx">         throwTypeError(&amp;state);
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     }
</span><span class="cx">     auto enumerationValue = convertOptional&lt;TestObj::EnumType&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;enumerationValue&quot;)));
</span><span class="cx">     if (UNLIKELY(state.hadException()))
</span><del>-        return { };
</del><ins>+        return Nullopt;
</ins><span class="cx">     auto booleanWithoutDefault = convertOptional&lt;bool&gt;(state, object-&gt;get(&amp;state, Identifier::fromString(&amp;state, &quot;booleanWithoutDefault&quot;)));
</span><del>-    return { WTFMove(enumerationValue), WTFMove(booleanWithoutDefault) };
</del><ins>+    return TestObj::DictionaryThatShouldTolerateNull { WTFMove(enumerationValue), WTFMove(booleanWithoutDefault) };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Functions
</span><span class="lines">@@ -6392,10 +6395,10 @@
</span><span class="cx">     auto&amp; impl = castedThis-&gt;wrapped();
</span><span class="cx">     if (UNLIKELY(state-&gt;argumentCount() &lt; 1))
</span><span class="cx">         return throwVMError(state, createNotEnoughArgumentsError(state));
</span><del>-    auto init = convert&lt;TestObj::Dictionary&gt;(*state, state-&gt;argument(0));
</del><ins>+    auto init = convertDictionary&lt;TestObj::Dictionary&gt;(*state, state-&gt;argument(0));
</ins><span class="cx">     if (UNLIKELY(state-&gt;hadException()))
</span><span class="cx">         return JSValue::encode(jsUndefined());
</span><del>-    impl.attachShadowRoot(WTFMove(init));
</del><ins>+    impl.attachShadowRoot(init.value());
</ins><span class="cx">     return JSValue::encode(jsUndefined());
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestOverloadedConstructorscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -113,7 +113,7 @@
</span><span class="cx">     auto string = state-&gt;argument(0).toWTFString(state);
</span><span class="cx">     if (UNLIKELY(state-&gt;hadException()))
</span><span class="cx">         return JSValue::encode(jsUndefined());
</span><del>-    auto object = TestOverloadedConstructors::create(string);
</del><ins>+    auto object = TestOverloadedConstructors::create(WTFMove(string));
</ins><span class="cx">     return JSValue::encode(asObject(toJSNewlyCreated(state, castedThis-&gt;globalObject(), WTFMove(object))));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx">     Vector&lt;int32_t&gt; longArgs = toNativeArguments&lt;int32_t&gt;(*state, 0);
</span><span class="cx">     if (UNLIKELY(state-&gt;hadException()))
</span><span class="cx">         return JSValue::encode(jsUndefined());
</span><del>-    auto object = TestOverloadedConstructors::create(longArgs);
</del><ins>+    auto object = TestOverloadedConstructors::create(WTFMove(longArgs));
</ins><span class="cx">     return JSValue::encode(asObject(toJSNewlyCreated(state, castedThis-&gt;globalObject(), WTFMove(object))));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestJSJSTestTypedefscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -133,7 +133,7 @@
</span><span class="cx">     if (UNLIKELY(!state-&gt;argument(1).isObject()))
</span><span class="cx">         return throwArgumentMustBeFunctionError(*state, 1, &quot;testCallback&quot;, &quot;TestTypedefs&quot;, nullptr);
</span><span class="cx">     auto testCallback = JSTestCallback::create(asObject(state-&gt;uncheckedArgument(1)), castedThis-&gt;globalObject());
</span><del>-    auto object = TestTypedefs::create(hello, *testCallback);
</del><ins>+    auto object = TestTypedefs::create(WTFMove(hello), *testCallback);
</ins><span class="cx">     return JSValue::encode(asObject(toJSNewlyCreated(state, castedThis-&gt;globalObject(), WTFMove(object))));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptstestTestObjidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/test/TestObj.idl (204496 => 204497)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-08-16 05:14:17 UTC (rev 204496)
+++ trunk/Source/WebCore/bindings/scripts/test/TestObj.idl        2016-08-16 06:24:39 UTC (rev 204497)
</span><span class="lines">@@ -438,6 +438,7 @@
</span><span class="cx"> dictionary TestDictionaryThatShouldNotTolerateNull {
</span><span class="cx">     required TestEnumType requiredEnumerationValue;
</span><span class="cx">     boolean booleanWithoutDefault;
</span><ins>+    required Node nonNullableNode;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> dictionary TestDictionaryThatShouldTolerateNull {
</span></span></pre>
</div>
</div>

</body>
</html>