<!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>[212462] trunk/Source/JavaScriptCore</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/212462">212462</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2017-02-16 13:31:17 -0800 (Thu, 16 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Cocoa] Web Inspector: Inspector::fromProtocolString&lt;T&gt; should return std::optional&lt;T&gt;
https://bugs.webkit.org/show_bug.cgi?id=168018
&lt;rdar://problem/30468779&gt;

Reviewed by Joseph Pecoraro.

These methods parse untrusted string inputs, so they should return an optional instead
of asserting or crashing when the input is not usable.

Update various pieces of generated code to handle the error case gracefully.

* inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
(ObjCBackendDispatcherImplementationGenerator._generate_conversions_for_command):
(ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command):
The local variable holding the ObjC-friendly converted value should take a std::optional
when converting an enum from a string into an NS_ENUM value. If the enum command parameter
is not optional, then send a response with a command failure message and return.

The optional enum parameter case is not handled correctly, but no existing code requires it.

* inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py:
(ObjCProtocolTypeConversionsHeaderGenerator._generate_enum_from_protocol_string):
Fix signature and remove default case ASSERT_NOT_REACHED.

* inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py:
(ObjCProtocolTypeConversionsImplementationGenerator._generate_type_factory_method_implementation):
Since this code assumes all inputs to be valid and throws an exception otherwise, we
try to convert the enum and throw an exception if it's nullopt. If it's valid, write to outValue.

* inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
(ObjCProtocolTypesImplementationGenerator._generate_init_method_for_payload):
The local variable holding the ObjC-friendly converted value should take a std::optional
when converting an enum from a string into an NS_ENUM value. If the enum command parameter
is not optional, then throw an exception if the value is nullopt. Otherwise, allow it to be empty.

* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator.protocol_to_objc_expression_for_member):
Unconditionally unwrap the optional. This expression is only used inside the typechecked
ObjC protocol objects. In this case we are guaranteed to have already initialized the enum with a valid
value, but must store it as a string inside a wrapped InspectorObject. The getter needs to
re-convert the stored string into an NS_ENUM value.

* inspector/scripts/codegen/objc_generator_templates.py:
Update type template for fromProtocolString&lt;T&gt;().

* inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/domain-availability.json-result:
* inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result:
* inspector/scripts/tests/generic/expected/enum-values.json-result:
* inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
* inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
* inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result:
* inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
* inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
* inspector/scripts/tests/generic/expected/worker-supported-domains.json-result:
* inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
Rebaseline tests.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_implementationpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_type_conversions_headerpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_type_conversions_implementationpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_types_implementationpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generator_templatespy">trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsallexpecteddefinitionswithmacplatformjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedcommandswithasyncattributejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedcommandswithoptionalcallreturnparametersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddefinitionswithmacplatformjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddomainavailabilityjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domain-availability.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddomainswithvaryingcommandsizesjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedenumvaluesjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/enum-values.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedeventswithoptionalparametersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedgeneratedomainswithfeatureguardsjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedsametypeiddifferentdomainjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationaliasedprimitivetypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationarraytypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationenumtypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtyperequiringruntimecastsjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedworkersupporteddomainsjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/worker-supported-domains.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsiosexpecteddefinitionswithmacplatformjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorscriptstestsmacexpecteddefinitionswithmacplatformjsonresult">trunk/Source/JavaScriptCore/inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1,3 +1,71 @@
</span><ins>+2017-02-15  Brian Burg  &lt;bburg@apple.com&gt;
+
+        [Cocoa] Web Inspector: Inspector::fromProtocolString&lt;T&gt; should return std::optional&lt;T&gt;
+        https://bugs.webkit.org/show_bug.cgi?id=168018
+        &lt;rdar://problem/30468779&gt;
+
+        Reviewed by Joseph Pecoraro.
+
+        These methods parse untrusted string inputs, so they should return an optional instead
+        of asserting or crashing when the input is not usable.
+
+        Update various pieces of generated code to handle the error case gracefully.
+
+        * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
+        (ObjCBackendDispatcherImplementationGenerator._generate_conversions_for_command):
+        (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command):
+        The local variable holding the ObjC-friendly converted value should take a std::optional
+        when converting an enum from a string into an NS_ENUM value. If the enum command parameter
+        is not optional, then send a response with a command failure message and return.
+
+        The optional enum parameter case is not handled correctly, but no existing code requires it.
+
+        * inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py:
+        (ObjCProtocolTypeConversionsHeaderGenerator._generate_enum_from_protocol_string):
+        Fix signature and remove default case ASSERT_NOT_REACHED.
+
+        * inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py:
+        (ObjCProtocolTypeConversionsImplementationGenerator._generate_type_factory_method_implementation):
+        Since this code assumes all inputs to be valid and throws an exception otherwise, we
+        try to convert the enum and throw an exception if it's nullopt. If it's valid, write to outValue.
+
+        * inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
+        (ObjCProtocolTypesImplementationGenerator._generate_init_method_for_payload):
+        The local variable holding the ObjC-friendly converted value should take a std::optional
+        when converting an enum from a string into an NS_ENUM value. If the enum command parameter
+        is not optional, then throw an exception if the value is nullopt. Otherwise, allow it to be empty.
+
+        * inspector/scripts/codegen/objc_generator.py:
+        (ObjCGenerator.protocol_to_objc_expression_for_member):
+        Unconditionally unwrap the optional. This expression is only used inside the typechecked
+        ObjC protocol objects. In this case we are guaranteed to have already initialized the enum with a valid
+        value, but must store it as a string inside a wrapped InspectorObject. The getter needs to
+        re-convert the stored string into an NS_ENUM value.
+
+        * inspector/scripts/codegen/objc_generator_templates.py:
+        Update type template for fromProtocolString&lt;T&gt;().
+
+        * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
+        * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
+        * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
+        * inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result:
+        * inspector/scripts/tests/generic/expected/domain-availability.json-result:
+        * inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result:
+        * inspector/scripts/tests/generic/expected/enum-values.json-result:
+        * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
+        * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
+        * inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result:
+        * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
+        * inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result:
+        * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
+        * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
+        * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
+        * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
+        * inspector/scripts/tests/generic/expected/worker-supported-domains.json-result:
+        * inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result:
+        * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
+        Rebaseline tests.
+
</ins><span class="cx"> 2017-02-16  Keith Miller  &lt;keith_miller@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         ASSERTION FAILED: vm.heap.mutatorState() == MutatorState::Running || vm.apiLock().ownerThread() != std::this_thread::get_id()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_backend_dispatcher_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -168,10 +168,19 @@
</span><span class="cx">             in_param_name = 'in_%s' % parameter.parameter_name
</span><span class="cx">             objc_in_param_name = 'o_%s' % in_param_name
</span><span class="cx">             objc_type = self.objc_type_for_param(domain, command.command_name, parameter, False)
</span><ins>+            if isinstance(parameter.type, EnumType):
+                objc_type = 'std::optional&lt;%s&gt;' % objc_type
</ins><span class="cx">             param_expression = in_param_expression(in_param_name, parameter)
</span><span class="cx">             import_expression = self.objc_protocol_import_expression_for_parameter(param_expression, domain, command.command_name, parameter)
</span><span class="cx">             if not parameter.is_optional:
</span><span class="cx">                 lines.append('    %s = %s;' % (join_type_and_name(objc_type, objc_in_param_name), import_expression))
</span><ins>+
+                if isinstance(parameter.type, EnumType):
+                    lines.append('    if (!%s) {' % objc_in_param_name)
+                    lines.append('        backendDispatcher()-&gt;reportProtocolError(BackendDispatcher::InvalidParams, String::format(&quot;Parameter \'%%s\' of method \'%%s\' cannot be processed&quot;, &quot;%s&quot;, &quot;%s.%s&quot;));' % (parameter.parameter_name, domain.domain_name, command.command_name))
+                    lines.append('        return;')
+                    lines.append('    }')
+
</ins><span class="cx">             else:
</span><span class="cx">                 lines.append('    %s;' % join_type_and_name(objc_type, objc_in_param_name))
</span><span class="cx">                 lines.append('    if (%s)' % in_param_name)
</span><span class="lines">@@ -187,10 +196,15 @@
</span><span class="cx">         pairs.append('successCallback:successCallback')
</span><span class="cx">         for parameter in command.call_parameters:
</span><span class="cx">             in_param_name = 'in_%s' % parameter.parameter_name
</span><del>-            objc_in_param_name = 'o_%s' % in_param_name
</del><ins>+            objc_in_param_expression = 'o_%s' % in_param_name
</ins><span class="cx">             if not parameter.is_optional:
</span><del>-                pairs.append('%s:%s' % (parameter.parameter_name, objc_in_param_name))
</del><ins>+                # FIXME: we don't handle optional enum values in commands here because it isn't used anywhere yet.
+                # We'd need to change the delegate's signature to take std::optional for optional enum values.
+                if isinstance(parameter.type, EnumType):
+                    objc_in_param_expression = '%s.value()' % objc_in_param_expression
+
+                pairs.append('%s:%s' % (parameter.parameter_name, objc_in_param_expression))
</ins><span class="cx">             else:
</span><del>-                optional_expression = '(%s ? &amp;%s : nil)' % (in_param_name, objc_in_param_name)
</del><ins>+                optional_expression = '(%s ? &amp;%s : nil)' % (in_param_name, objc_in_param_expression)
</ins><span class="cx">                 pairs.append('%s:%s' % (parameter.parameter_name, optional_expression))
</span><span class="cx">         return '    [m_delegate %s%s];' % (command.command_name, ' '.join(pairs))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_type_conversions_headerpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -155,12 +155,11 @@
</span><span class="cx">     def _generate_enum_from_protocol_string(self, objc_enum_name, enum_values):
</span><span class="cx">         lines = []
</span><span class="cx">         lines.append('template&lt;&gt;')
</span><del>-        lines.append('inline %s fromProtocolString(const String&amp; value)' % objc_enum_name)
</del><ins>+        lines.append('inline std::optional&lt;%s&gt; fromProtocolString(const String&amp; value)' % objc_enum_name)
</ins><span class="cx">         lines.append('{')
</span><span class="cx">         for enum_value in enum_values:
</span><span class="cx">             lines.append('    if (value == &quot;%s&quot;)' % enum_value)
</span><span class="cx">             lines.append('        return %s%s;' % (objc_enum_name, Generator.stylized_name_for_enum_value(enum_value)))
</span><del>-        lines.append('    ASSERT_NOT_REACHED();')
-        lines.append('    return %s%s;' % (objc_enum_name, Generator.stylized_name_for_enum_value(enum_values[0])))
</del><ins>+        lines.append('    return std::nullopt;')
</ins><span class="cx">         lines.append('}')
</span><span class="cx">         return '\n'.join(lines)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_type_conversions_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_type_conversions_implementation.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -125,7 +125,9 @@
</span><span class="cx">         lines.append('{')
</span><span class="cx">         if isinstance(resolved_type, EnumType):
</span><span class="cx">             lines.append('    THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);')
</span><del>-            lines.append('    *outValue = @(Inspector::fromProtocolString&lt;%s&gt;(payload));' % self.objc_name_for_type(resolved_type))
</del><ins>+            lines.append('    std::optional&lt;%(type)s&gt; result = Inspector::fromProtocolString&lt;%(type)s&gt;(payload);' % {'type': self.objc_name_for_type(resolved_type)})
+            lines.append('    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;%s&quot;);' % declaration.type.raw_name())
+            lines.append('    *outValue = @(result.value());')
</ins><span class="cx">         elif isinstance(resolved_type, (ArrayType, PrimitiveType)):
</span><span class="cx">             lines.append('    THROW_EXCEPTION_FOR_BAD_TYPE(payload, [%s class]);' % objc_class)
</span><span class="cx">             lines.append('    *outValue = (%s *)payload;' % objc_class)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegengenerate_objc_protocol_types_implementationpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/generate_objc_protocol_types_implementation.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> from string import Template
</span><span class="cx"> 
</span><span class="cx"> from generator import Generator, ucfirst
</span><del>-from models import ObjectType, Frameworks
</del><ins>+from models import ObjectType, EnumType, Frameworks
</ins><span class="cx"> from objc_generator import ObjCGenerator
</span><span class="cx"> from objc_generator_templates import ObjCGeneratorTemplates as ObjCTemplates
</span><span class="cx"> 
</span><span class="lines">@@ -129,13 +129,24 @@
</span><span class="cx"> 
</span><span class="cx">         for member in declaration.type_members:
</span><span class="cx">             member_name = member.member_name
</span><del>-            conversion_expression = self.payload_to_objc_expression_for_member(declaration, member)
</del><span class="cx"> 
</span><span class="cx">             if not member.is_optional:
</span><span class="cx">                 lines.append('    THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;%s&quot;], @&quot;%s&quot;);' % (member_name, member_name))
</span><span class="cx"> 
</span><ins>+            objc_type = self.objc_type_for_member(declaration, member)
</ins><span class="cx">             var_name = ObjCGenerator.identifier_to_objc_identifier(member_name)
</span><del>-            lines.append('    self.%s = %s;' % (var_name, conversion_expression))
</del><ins>+            conversion_expression = self.payload_to_objc_expression_for_member(declaration, member)
+            if isinstance(member.type, EnumType):
+                lines.append('    std::optional&lt;%s&gt; %s = %s;' % (objc_type, var_name, conversion_expression))
+                if not member.is_optional:
+                    lines.append('    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(%s, @&quot;%s&quot;);' % (var_name, member_name))
+                    lines.append('    self.%s = %s.value();' % (var_name, var_name))
+                else:
+                    lines.append('    if (%s)' % var_name)
+                    lines.append('        self.%s = %s.value();' % (var_name, var_name))
+            else:
+                lines.append('    self.%s = %s;' % (var_name, conversion_expression))
+
</ins><span class="cx">             lines.append('')
</span><span class="cx"> 
</span><span class="cx">         lines.append('    return self;')
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generatorpy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -442,8 +442,8 @@
</span><span class="cx">         if category in [ObjCTypeCategory.Simple, ObjCTypeCategory.String]:
</span><span class="cx">             if isinstance(member.type, EnumType):
</span><span class="cx">                 if member.type.is_anonymous:
</span><del>-                    return 'fromProtocolString&lt;%s&gt;(%s)' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), sub_expression)
-                return 'fromProtocolString&lt;%s&gt;(%s)' % (self.objc_enum_name_for_non_anonymous_enum(member.type), sub_expression)
</del><ins>+                    return 'fromProtocolString&lt;%s&gt;(%s).value()' % (self.objc_enum_name_for_anonymous_enum_member(declaration, member), sub_expression)
+                return 'fromProtocolString&lt;%s&gt;(%s).value()' % (self.objc_enum_name_for_non_anonymous_enum(member.type), sub_expression)
</ins><span class="cx">             return sub_expression
</span><span class="cx">         if category is ObjCTypeCategory.Object:
</span><span class="cx">             objc_class = self.objc_class_for_type(member.type)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptscodegenobjc_generator_templatespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/codegen/objc_generator_templates.py        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx">     TypeConversionsHeaderStandard = (
</span><span class="cx">     &quot;&quot;&quot;template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);&quot;&quot;&quot;)
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);&quot;&quot;&quot;)
</ins><span class="cx"> 
</span><span class="cx">     BackendDispatcherHeaderPrelude = (
</span><span class="cx">     &quot;&quot;&quot;${includes}
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsallexpecteddefinitionswithmacplatformjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1006,7 +1006,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1023,7 +1023,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1033,8 +1033,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedcommandswithasyncattributejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1425,7 +1425,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1442,7 +1442,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1452,8 +1452,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1470,7 +1469,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabasePrimaryColors fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabasePrimaryColors&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;red&quot;)
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsRed;
</span><span class="lines">@@ -1478,8 +1477,7 @@
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsGreen;
</span><span class="cx">     if (value == &quot;blue&quot;)
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsBlue;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabasePrimaryColorsRed;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColor value)
</span><span class="lines">@@ -1497,7 +1495,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColorCyan;
</span><span class="lines">@@ -1507,8 +1505,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteSQLSyncOptionalReturnValuesPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColor value)
</span><span class="lines">@@ -1526,7 +1523,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColorCyan;
</span><span class="lines">@@ -1536,8 +1533,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteSQLAsyncOptionalReturnValuesPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteSQLSyncPrintColor value)
</span><span class="lines">@@ -1555,7 +1551,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteSQLSyncPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteSQLSyncPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncPrintColorCyan;
</span><span class="lines">@@ -1565,8 +1561,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLSyncPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteSQLSyncPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteSQLAsyncPrintColor value)
</span><span class="lines">@@ -1584,7 +1579,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteSQLAsyncPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteSQLAsyncPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncPrintColorCyan;
</span><span class="lines">@@ -1594,8 +1589,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteSQLAsyncPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteSQLAsyncPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1661,7 +1655,9 @@
</span><span class="cx"> + (void)_parsePrimaryColors:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolDatabasePrimaryColors&gt; result = Inspector::fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;PrimaryColors&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseColorList:(NSArray/*&lt;NSString&gt;*/ **)outValue fromPayload:(id)payload
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedcommandswithoptionalcallreturnparametersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -872,13 +872,13 @@
</span><span class="cx">     TestProtocolDatabaseError *o_in_sqlError;
</span><span class="cx">     if (in_sqlError)
</span><span class="cx">         o_in_sqlError = [[[TestProtocolDatabaseError alloc] initWithInspectorObject:in_sqlError] autorelease];
</span><del>-    TestProtocolDatabasePrimaryColors o_in_screenColor;
</del><ins>+    std::optional&lt;TestProtocolDatabasePrimaryColors&gt; o_in_screenColor;
</ins><span class="cx">     if (in_screenColor)
</span><span class="cx">         o_in_screenColor = fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(*in_screenColor);
</span><span class="cx">     NSArray/*&lt;NSString&gt;*/ *o_in_alternateColors;
</span><span class="cx">     if (in_alternateColors)
</span><span class="cx">         o_in_alternateColors = objcStringArray(in_alternateColors);
</span><del>-    TestProtocolDatabaseExecuteAllOptionalParametersPrintColor o_in_printColor;
</del><ins>+    std::optional&lt;TestProtocolDatabaseExecuteAllOptionalParametersPrintColor&gt; o_in_printColor;
</ins><span class="cx">     if (in_printColor)
</span><span class="cx">         o_in_printColor = fromProtocolString&lt;TestProtocolDatabaseExecuteAllOptionalParametersPrintColor&gt;(*in_printColor);
</span><span class="cx"> 
</span><span class="lines">@@ -920,11 +920,19 @@
</span><span class="cx">     RWIProtocolJSONObject *o_in_payload = [[[RWIProtocolJSONObject alloc] initWithInspectorObject:&amp;in_payload] autorelease];
</span><span class="cx">     int o_in_databaseId = in_databaseId;
</span><span class="cx">     TestProtocolDatabaseError *o_in_sqlError = [[[TestProtocolDatabaseError alloc] initWithInspectorObject:&amp;in_sqlError] autorelease];
</span><del>-    TestProtocolDatabasePrimaryColors o_in_screenColor = fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(in_screenColor);
</del><ins>+    std::optional&lt;TestProtocolDatabasePrimaryColors&gt; o_in_screenColor = fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(in_screenColor);
+    if (!o_in_screenColor) {
+        backendDispatcher()-&gt;reportProtocolError(BackendDispatcher::InvalidParams, String::format(&quot;Parameter '%s' of method '%s' cannot be processed&quot;, &quot;screenColor&quot;, &quot;Database.executeNoOptionalParameters&quot;));
+        return;
+    }
</ins><span class="cx">     NSArray/*&lt;NSString&gt;*/ *o_in_alternateColors = objcStringArray(&amp;in_alternateColors);
</span><del>-    TestProtocolDatabaseExecuteNoOptionalParametersPrintColor o_in_printColor = fromProtocolString&lt;TestProtocolDatabaseExecuteNoOptionalParametersPrintColor&gt;(in_printColor);
</del><ins>+    std::optional&lt;TestProtocolDatabaseExecuteNoOptionalParametersPrintColor&gt; o_in_printColor = fromProtocolString&lt;TestProtocolDatabaseExecuteNoOptionalParametersPrintColor&gt;(in_printColor);
+    if (!o_in_printColor) {
+        backendDispatcher()-&gt;reportProtocolError(BackendDispatcher::InvalidParams, String::format(&quot;Parameter '%s' of method '%s' cannot be processed&quot;, &quot;printColor&quot;, &quot;Database.executeNoOptionalParameters&quot;));
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    [m_delegate executeNoOptionalParametersWithErrorCallback:errorCallback successCallback:successCallback columnNames:o_in_columnNames notes:o_in_notes timestamp:o_in_timestamp values:o_in_values payload:o_in_payload databaseId:o_in_databaseId sqlError:o_in_sqlError screenColor:o_in_screenColor alternateColors:o_in_alternateColors printColor:o_in_printColor];
</del><ins>+    [m_delegate executeNoOptionalParametersWithErrorCallback:errorCallback successCallback:successCallback columnNames:o_in_columnNames notes:o_in_notes timestamp:o_in_timestamp values:o_in_values payload:o_in_payload databaseId:o_in_databaseId sqlError:o_in_sqlError screenColor:o_in_screenColor.value() alternateColors:o_in_alternateColors printColor:o_in_printColor.value()];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1280,7 +1288,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1297,7 +1305,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1307,8 +1315,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1325,7 +1332,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabasePrimaryColors fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabasePrimaryColors&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;red&quot;)
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsRed;
</span><span class="lines">@@ -1333,8 +1340,7 @@
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsGreen;
</span><span class="cx">     if (value == &quot;blue&quot;)
</span><span class="cx">         return TestProtocolDatabasePrimaryColorsBlue;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabasePrimaryColorsRed;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteAllOptionalParametersPrintColor value)
</span><span class="lines">@@ -1352,7 +1358,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteAllOptionalParametersPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteAllOptionalParametersPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorCyan;
</span><span class="lines">@@ -1362,8 +1368,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteAllOptionalParametersPrintColor value)
</span><span class="lines">@@ -1381,7 +1386,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteAllOptionalParametersPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteAllOptionalParametersPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorCyan;
</span><span class="lines">@@ -1391,8 +1396,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteAllOptionalParametersPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteNoOptionalParametersPrintColor value)
</span><span class="lines">@@ -1410,7 +1414,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteNoOptionalParametersPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteNoOptionalParametersPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorCyan;
</span><span class="lines">@@ -1420,8 +1424,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolDatabaseExecuteNoOptionalParametersPrintColor value)
</span><span class="lines">@@ -1439,7 +1442,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDatabaseExecuteNoOptionalParametersPrintColor fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDatabaseExecuteNoOptionalParametersPrintColor&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;cyan&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorCyan;
</span><span class="lines">@@ -1449,8 +1452,7 @@
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorYellow;
</span><span class="cx">     if (value == &quot;black&quot;)
</span><span class="cx">         return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorBlack;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDatabaseExecuteNoOptionalParametersPrintColorCyan;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1516,7 +1518,9 @@
</span><span class="cx"> + (void)_parsePrimaryColors:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolDatabasePrimaryColors&gt; result = Inspector::fromProtocolString&lt;TestProtocolDatabasePrimaryColors&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;PrimaryColors&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseColorList:(NSArray/*&lt;NSString&gt;*/ **)outValue fromPayload:(id)payload
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddefinitionswithmacplatformjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -742,7 +742,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -759,7 +759,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -769,8 +769,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddomainavailabilityjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domain-availability.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domain-availability.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domain-availability.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -996,7 +996,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1013,7 +1013,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1023,8 +1023,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpecteddomainswithvaryingcommandsizesjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1259,7 +1259,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1276,7 +1276,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1286,8 +1286,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedenumvaluesjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/enum-values.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/enum-values.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/enum-values.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1039,7 +1039,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1056,7 +1056,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1066,8 +1066,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1086,7 +1085,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolTypeDomainEnum fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolTypeDomainEnum&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;shared&quot;)
</span><span class="cx">         return TestProtocolTypeDomainEnumShared;
</span><span class="lines">@@ -1096,8 +1095,7 @@
</span><span class="cx">         return TestProtocolTypeDomainEnumGreen;
</span><span class="cx">     if (value == &quot;blue&quot;)
</span><span class="cx">         return TestProtocolTypeDomainEnumBlue;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolTypeDomainEnumShared;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1154,7 +1152,9 @@
</span><span class="cx"> + (void)_parseTypeDomainEnum:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolTypeDomainEnum&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolTypeDomainEnum&gt; result = Inspector::fromProtocolString&lt;TestProtocolTypeDomainEnum&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;TypeDomainEnum&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedeventswithoptionalparametersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -992,7 +992,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1009,7 +1009,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1019,8 +1019,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedgeneratedomainswithfeatureguardsjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1033,7 +1033,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1050,7 +1050,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1060,8 +1060,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedsametypeiddifferentdomainjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -752,7 +752,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -769,7 +769,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -779,8 +779,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedshadowedoptionaltypesettersjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -889,7 +889,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -906,7 +906,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -916,8 +916,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -934,7 +933,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolRuntimeKeyPathType fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolRuntimeKeyPathType&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;null&quot;)
</span><span class="cx">         return TestProtocolRuntimeKeyPathTypeNull;
</span><span class="lines">@@ -942,8 +941,7 @@
</span><span class="cx">         return TestProtocolRuntimeKeyPathTypeString;
</span><span class="cx">     if (value == &quot;array&quot;)
</span><span class="cx">         return TestProtocolRuntimeKeyPathTypeArray;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolRuntimeKeyPathTypeNull;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1057,7 +1055,9 @@
</span><span class="cx">         return nil;
</span><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;type&quot;], @&quot;type&quot;);
</span><del>-    self.type = fromProtocolString&lt;TestProtocolRuntimeKeyPathType&gt;(payload[@&quot;type&quot;]);
</del><ins>+    std::optional&lt;TestProtocolRuntimeKeyPathType&gt; type = fromProtocolString&lt;TestProtocolRuntimeKeyPathType&gt;(payload[@&quot;type&quot;]);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(type, @&quot;type&quot;);
+    self.type = type.value();
</ins><span class="cx"> 
</span><span class="cx">     self.string = payload[@&quot;string&quot;];
</span><span class="cx"> 
</span><span class="lines">@@ -1090,7 +1090,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (TestProtocolRuntimeKeyPathType)type
</span><span class="cx"> {
</span><del>-    return fromProtocolString&lt;TestProtocolRuntimeKeyPathType&gt;([super stringForKey:@&quot;type&quot;]);
</del><ins>+    return fromProtocolString&lt;TestProtocolRuntimeKeyPathType&gt;([super stringForKey:@&quot;type&quot;]).value();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setString:(NSString *)string
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationaliasedprimitivetypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -747,7 +747,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -764,7 +764,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -774,8 +774,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationarraytypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -830,7 +830,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -847,7 +847,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -857,8 +857,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -875,7 +874,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolDebuggerReason fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolDebuggerReason&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;Died&quot;)
</span><span class="cx">         return TestProtocolDebuggerReasonDied;
</span><span class="lines">@@ -883,8 +882,7 @@
</span><span class="cx">         return TestProtocolDebuggerReasonFainted;
</span><span class="cx">     if (value == &quot;Hungry&quot;)
</span><span class="cx">         return TestProtocolDebuggerReasonHungry;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolDebuggerReasonDied;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -960,7 +958,9 @@
</span><span class="cx"> + (void)_parseReason:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolDebuggerReason&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolDebuggerReason&gt; result = Inspector::fromProtocolString&lt;TestProtocolDebuggerReason&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;Reason&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationenumtypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -858,7 +858,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -875,7 +875,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -885,8 +885,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -905,7 +904,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolRuntimeFarmAnimals fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolRuntimeFarmAnimals&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;Pigs&quot;)
</span><span class="cx">         return TestProtocolRuntimeFarmAnimalsPigs;
</span><span class="lines">@@ -915,8 +914,7 @@
</span><span class="cx">         return TestProtocolRuntimeFarmAnimalsCats;
</span><span class="cx">     if (value == &quot;Hens&quot;)
</span><span class="cx">         return TestProtocolRuntimeFarmAnimalsHens;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolRuntimeFarmAnimalsPigs;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolRuntimeTwoLeggedAnimals value)
</span><span class="lines">@@ -934,7 +932,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolRuntimeTwoLeggedAnimals fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolRuntimeTwoLeggedAnimals&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;Ducks&quot;)
</span><span class="cx">         return TestProtocolRuntimeTwoLeggedAnimalsDucks;
</span><span class="lines">@@ -944,8 +942,7 @@
</span><span class="cx">         return TestProtocolRuntimeTwoLeggedAnimalsCrows;
</span><span class="cx">     if (value == &quot;Flamingos&quot;)
</span><span class="cx">         return TestProtocolRuntimeTwoLeggedAnimalsFlamingos;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolRuntimeTwoLeggedAnimalsDucks;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1003,13 +1000,17 @@
</span><span class="cx"> + (void)_parseFarmAnimals:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolRuntimeFarmAnimals&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolRuntimeFarmAnimals&gt; result = Inspector::fromProtocolString&lt;TestProtocolRuntimeFarmAnimals&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;FarmAnimals&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseTwoLeggedAnimals:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolRuntimeTwoLeggedAnimals&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolRuntimeTwoLeggedAnimals&gt; result = Inspector::fromProtocolString&lt;TestProtocolRuntimeTwoLeggedAnimals&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;TwoLeggedAnimals&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtypedeclarationobjecttypejsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1283,7 +1283,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1300,7 +1300,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1310,8 +1310,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedtyperequiringruntimecastsjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1212,7 +1212,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1229,7 +1229,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1239,8 +1239,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -1259,7 +1258,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolTestUncastedAnimals fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolTestUncastedAnimals&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;Pigs&quot;)
</span><span class="cx">         return TestProtocolTestUncastedAnimalsPigs;
</span><span class="lines">@@ -1269,8 +1268,7 @@
</span><span class="cx">         return TestProtocolTestUncastedAnimalsCats;
</span><span class="cx">     if (value == &quot;Hens&quot;)
</span><span class="cx">         return TestProtocolTestUncastedAnimalsHens;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolTestUncastedAnimalsPigs;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolTestCastedAnimals value)
</span><span class="lines">@@ -1288,7 +1286,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolTestCastedAnimals fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolTestCastedAnimals&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;Ducks&quot;)
</span><span class="cx">         return TestProtocolTestCastedAnimalsDucks;
</span><span class="lines">@@ -1298,8 +1296,7 @@
</span><span class="cx">         return TestProtocolTestCastedAnimalsCrows;
</span><span class="cx">     if (value == &quot;Flamingos&quot;)
</span><span class="cx">         return TestProtocolTestCastedAnimalsFlamingos;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolTestCastedAnimalsDucks;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span><span class="lines">@@ -1380,13 +1377,17 @@
</span><span class="cx"> + (void)_parseUncastedAnimals:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolTestUncastedAnimals&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolTestUncastedAnimals&gt; result = Inspector::fromProtocolString&lt;TestProtocolTestUncastedAnimals&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;UncastedAnimals&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseCastedAnimals:(NSNumber **)outValue fromPayload:(id)payload
</span><span class="cx"> {
</span><span class="cx">     THROW_EXCEPTION_FOR_BAD_TYPE(payload, [NSString class]);
</span><del>-    *outValue = @(Inspector::fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;(payload));
</del><ins>+    std::optional&lt;TestProtocolTestCastedAnimals&gt; result = Inspector::fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;(payload);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(result, @&quot;CastedAnimals&quot;);
+    *outValue = @(result.value());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)_parseRecursiveObject1:(TestProtocolTestRecursiveObject1 **)outValue fromPayload:(id)payload
</span><span class="lines">@@ -1461,7 +1462,9 @@
</span><span class="cx">     self.number = [payload[@&quot;number&quot;] integerValue];
</span><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;animals&quot;], @&quot;animals&quot;);
</span><del>-    self.animals = fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;(payload[@&quot;animals&quot;]);
</del><ins>+    std::optional&lt;TestProtocolTestCastedAnimals&gt; animals = fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;(payload[@&quot;animals&quot;]);
+    THROW_EXCEPTION_FOR_BAD_ENUM_VALUE(animals, @&quot;animals&quot;);
+    self.animals = animals.value();
</ins><span class="cx"> 
</span><span class="cx">     THROW_EXCEPTION_FOR_REQUIRED_PROPERTY(payload[@&quot;id&quot;], @&quot;id&quot;);
</span><span class="cx">     self.identifier = [payload[@&quot;id&quot;] integerValue];
</span><span class="lines">@@ -1523,7 +1526,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (TestProtocolTestCastedAnimals)animals
</span><span class="cx"> {
</span><del>-    return fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;([super stringForKey:@&quot;animals&quot;]);
</del><ins>+    return fromProtocolString&lt;TestProtocolTestCastedAnimals&gt;([super stringForKey:@&quot;animals&quot;]).value();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setIdentifier:(int)identifier
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsgenericexpectedworkersupporteddomainsjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/worker-supported-domains.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/worker-supported-domains.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/generic/expected/worker-supported-domains.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -997,7 +997,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1014,7 +1014,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1024,8 +1024,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsiosexpecteddefinitionswithmacplatformjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -742,7 +742,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -759,7 +759,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -769,8 +769,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorscriptstestsmacexpecteddefinitionswithmacplatformjsonresult"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result (212461 => 212462)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result        2017-02-16 21:23:33 UTC (rev 212461)
+++ trunk/Source/JavaScriptCore/inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result        2017-02-16 21:31:17 UTC (rev 212462)
</span><span class="lines">@@ -1006,7 +1006,7 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ObjCEnumType&gt;
</span><del>-ObjCEnumType fromProtocolString(const String&amp; value);
</del><ins>+std::optional&lt;ObjCEnumType&gt; fromProtocolString(const String&amp; value);
</ins><span class="cx"> 
</span><span class="cx"> inline String toProtocolString(TestProtocolPlatform value)
</span><span class="cx"> {
</span><span class="lines">@@ -1023,7 +1023,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline TestProtocolPlatform fromProtocolString(const String&amp; value)
</del><ins>+inline std::optional&lt;TestProtocolPlatform&gt; fromProtocolString(const String&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     if (value == &quot;all&quot;)
</span><span class="cx">         return TestProtocolPlatformAll;
</span><span class="lines">@@ -1033,8 +1033,7 @@
</span><span class="cx">         return TestProtocolPlatformIOS;
</span><span class="cx">     if (value == &quot;macos&quot;)
</span><span class="cx">         return TestProtocolPlatformMacOS;
</span><del>-    ASSERT_NOT_REACHED();
-    return TestProtocolPlatformAll;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>