<!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>[163918] trunk</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/163918">163918</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2014-02-11 16:22:01 -0800 (Tue, 11 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Replay: upstream replay input code generator and EncodedValue class
https://bugs.webkit.org/show_bug.cgi?id=128215

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

Add the replay inputs code generator. Most features of the input generator are
exercised by included generator regression tests, which produce useful but
non-compilable test replay inputs.

Add EncodedValue, the main replay input serialization class that encodes and
decodes inputs and their data between C++ types and the JSON-based replay recording
format. EncodedValue uses EncodingTraits specializations for type-specific encoding.
Relative to other WebKit marshalling mechanisms, EncodedValue is key/value based.
EncodedValue uses InspectorValue subclasses as its backing data structure.

Add some missing numerical conversions to InspectorValue.

* JavaScriptCore.xcodeproj/project.pbxproj:
* inspector/InspectorValues.cpp:
(Inspector::InspectorValue::asNumber):
(Inspector::InspectorBasicValue::asNumber):
* inspector/InspectorValues.h:
* replay/EncodedValue.cpp: Added.
(JSC::EncodedValue::asObject):
(JSC::EncodedValue::asArray):
(JSC::ScalarEncodingTraits&lt;bool&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;double&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;float&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;int32_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;int64_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue):
(JSC::ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue):
(JSC::long&gt;::encodeValue):
(JSC::EncodedValue::convertTo&lt;bool&gt;):
(JSC::EncodedValue::convertTo&lt;double&gt;):
(JSC::EncodedValue::convertTo&lt;float&gt;):
(JSC::EncodedValue::convertTo&lt;int32_t&gt;):
(JSC::EncodedValue::convertTo&lt;int64_t&gt;):
(JSC::EncodedValue::convertTo&lt;uint32_t&gt;):
(JSC::EncodedValue::convertTo&lt;uint64_t&gt;):
(JSC::long&gt;):
(JSC::EncodedValue::convertTo&lt;String&gt;):
(JSC::EncodedValue::put&lt;EncodedValue&gt;):
(JSC::EncodedValue::append&lt;EncodedValue&gt;):
(JSC::EncodedValue::get&lt;EncodedValue&gt;):
* replay/EncodedValue.h: Added.
(JSC::EncodedValue::EncodedValue):
(JSC::EncodedValue::createObject):
(JSC::EncodedValue::createArray):
(JSC::EncodedValue::createString):
(JSC::EncodedValue::~EncodedValue):
(JSC::ScalarEncodingTraits::decodeValue):
(JSC::EncodingTraits&lt;String&gt;::encodeValue):
(JSC::EncodedValue::put):
(JSC::EncodedValue::append):
(JSC::EncodedValue::get):
* replay/scripts/CodeGeneratorReplayInputs.py: Added.
(ParseException):
(TypecheckException):
(Framework):
(Framework.__init__):
(Framework.setting):
(Framework.fromString):
(Frameworks):
(InputQueue):
(InputQueue.__init__):
(InputQueue.setting):
(InputQueue.fromString):
(InputQueues):
(Input):
(Input.__init__):
(Input.setting):
(InputMember):
(InputMember.__init__):
(InputMember.has_flag):
(TypeMode):
(TypeMode.__init__):
(TypeMode.fromString):
(TypeModes):
(Type):
(Type.__init__):
(Type.__eq__):
(Type.__hash__):
(Type.has_flag):
(Type.is_struct):
(Type.is_enum):
(Type.is_enum_class):
(Type.declaration_kind):
(Type.qualified_prefix):
(Type.qualified_prefix.is):
(Type.type_name):
(Type.storage_type):
(Type.borrow_type):
(Type.argument_type):
(check_properties):
(VectorType):
(VectorType.__init__):
(VectorType.has_flag):
(VectorType.is_struct):
(VectorType.is_enum):
(VectorType.is_enum_class):
(VectorType.qualified_prefix):
(VectorType.type_name):
(VectorType.argument_type):
(InputsModel):
(InputsModel.__init__):
(InputsModel.enum_types):
(InputsModel.get_type_for_member):
(InputsModel.parse_toplevel):
(InputsModel.parse_type_with_framework_name):
(InputsModel.parse_input):
(InputsModel.typecheck):
(InputsModel.typecheck_type):
(InputsModel.typecheck_input):
(InputsModel.typecheck_input_member):
(IncrementalFileWriter):
(IncrementalFileWriter.__init__):
(IncrementalFileWriter.write):
(IncrementalFileWriter.close):
(lcfirst):
(wrap_with_guard):
(Generator):
(Generator.__init__):
(Generator.setting):
(Generator.output_filename):
(Generator.write_output_files):
(Generator.generate_header):
(Generator.generate_implementation):
(Generator.generate_license):
(Generator.generate_includes):
(Generator.generate_includes.declaration):
(Generator.generate_includes.declaration.is):
(Generator.generate_type_forward_declarations):
(Generator.generate_type_forward_declarations.is):
(Generator.generate_class_declaration):
(Generator.generate_input_constructor_declaration):
(Generator.generate_input_destructor_declaration):
(Generator.generate_input_member_getter):
(Generator.generate_input_member_declaration):
(Generator.generate_input_member_tuples):
(Generator.qualified_input_name):
(Generator.generate_input_trait_declaration):
(Generator.generate_enum_trait_declaration):
(Generator.generate_for_each_macro):
(Generator.generate_class_implementation):
(Generator.generate_enum_trait_implementation):
(Generator.generate_enum_trait_implementation.is):
(Generator.generate_input_trait_implementation):
(Generator.generate_input_encode_implementation):
(Generator.generate_input_decode_implementation):
(Generator.generate_constructor_initializer_list):
(Generator.generate_constructor_formals_list):
(Generator.generate_member_borrow_expression):
(Generator.generate_member_move_expression):
(Generator.generate_constructor_arguments_list):
(generate_from_specification):
* replay/scripts/CodeGeneratorReplayInputsTemplates.py: Added.
(Templates):
* replay/scripts/tests/expected/JSInputs.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/JSInputs.json-TestReplayInputs.h: Added.
* replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error: Added.
* replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error: Added.
* replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error: Added.
* replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error: Added.
* replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error: Added.
* replay/scripts/tests/expected/fail-on-missing-input-name.json-error: Added.
* replay/scripts/tests/expected/fail-on-missing-input-queue.json-error: Added.
* replay/scripts/tests/expected/fail-on-missing-type-mode.json-error: Added.
* replay/scripts/tests/expected/fail-on-missing-type-name.json-error: Added.
* replay/scripts/tests/expected/fail-on-no-inputs.json-error: Added.
* replay/scripts/tests/expected/fail-on-no-types.json-error: Added.
* replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error: Added.
* replay/scripts/tests/expected/fail-on-unknown-member-type.json-error: Added.
* replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error: Added.
* replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h: Added.
* replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h: Added.
* replay/scripts/tests/expected/generate-enum-encoding-helpers.json-error: Added.
* replay/scripts/tests/expected/generate-event-loop-shape-types.json-error: Added.
* replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h: Added.
* replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h: Added.
* replay/scripts/tests/expected/generate-inputs-with-flags.json-error: Added.
* replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp: Added.
* replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h: Added.
* replay/scripts/tests/fail-on-c-style-enum-no-storage.json: Added.
* replay/scripts/tests/fail-on-duplicate-input-names.json: Added.
* replay/scripts/tests/fail-on-duplicate-type-names.json: Added.
* replay/scripts/tests/fail-on-enum-type-missing-values.json: Added.
* replay/scripts/tests/fail-on-missing-input-member-name.json: Added.
* replay/scripts/tests/fail-on-missing-input-name.json: Added.
* replay/scripts/tests/fail-on-missing-input-queue.json: Added.
* replay/scripts/tests/fail-on-missing-type-mode.json: Added.
* replay/scripts/tests/fail-on-missing-type-name.json: Added.
* replay/scripts/tests/fail-on-no-inputs.json: Added.
* replay/scripts/tests/fail-on-no-types.json: Added.
* replay/scripts/tests/fail-on-unknown-input-queue.json: Added.
* replay/scripts/tests/fail-on-unknown-member-type.json: Added.
* replay/scripts/tests/fail-on-unknown-type-mode.json: Added.
* replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json: Added.
* replay/scripts/tests/generate-enum-encoding-helpers.json: Added.
* replay/scripts/tests/generate-event-loop-shape-types.json: Added.
* replay/scripts/tests/generate-input-with-guard.json: Added.
* replay/scripts/tests/generate-input-with-vector-members.json: Added.
* replay/scripts/tests/generate-inputs-with-flags.json: Added.
* replay/scripts/tests/generate-memoized-type-modes.json: Added.

Tools:

Add an executable script to launch the replay input generator tests.
Add a test harness for running the code generator tests, mostly taken
from the bindings test harness (but simplified).

* Scripts/run-input-generator-tests: Added.
(main):
* Scripts/webkitpy/replay/__init__.py: Added.
* Scripts/webkitpy/replay/main.py: Added.
(InputGeneratorTests):
(InputGeneratorTests.__init__):
(InputGeneratorTests.generate_from_json):
(InputGeneratorTests.write_error_file):
(InputGeneratorTests.detect_changes):
(InputGeneratorTests.run_tests):
(InputGeneratorTests.main):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorValuescpp">trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorValuesh">trunk/Source/JavaScriptCore/inspector/InspectorValues.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCorereplayEncodedValuecpp">trunk/Source/JavaScriptCore/replay/EncodedValue.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayEncodedValueh">trunk/Source/JavaScriptCore/replay/EncodedValue.h</a></li>
<li>trunk/Source/JavaScriptCore/replay/scripts/</li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptsCodeGeneratorReplayInputspy">trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptsCodeGeneratorReplayInputsTemplatespy">trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py</a></li>
<li>trunk/Source/JavaScriptCore/replay/scripts/tests/</li>
<li>trunk/Source/JavaScriptCore/replay/scripts/tests/expected/</li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailoncstyleenumnostoragejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonduplicateinputnamesjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonduplicatetypenamesjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonenumtypemissingvaluesjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputmembernamejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputnamejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-name.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputqueuejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-queue.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissingtypemodejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-mode.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissingtypenamejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-name.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonnoinputsjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-inputs.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonnotypesjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-types.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknowninputqueuejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknownmembertypejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-member-type.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknowntypemodejsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelperswithguardedvaluesjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelperswithguardedvaluesjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelpersjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelpersjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateeventloopshapetypesjsonerror">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-event-loop-shape-types.json-error</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithguardjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithguardjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithvectormembersjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithvectormembersjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputswithflagsjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputswithflagsjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgeneratememoizedtypemodesjsonTestReplayInputscpp">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsexpectedgeneratememoizedtypemodesjsonTestReplayInputsh">trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailoncstyleenumnostoragejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-c-style-enum-no-storage.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonduplicateinputnamesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-input-names.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonduplicatetypenamesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-type-names.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonenumtypemissingvaluesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-enum-type-missing-values.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputmembernamejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-member-name.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputnamejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-name.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputqueuejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-queue.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonmissingtypemodejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-mode.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonmissingtypenamejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-name.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonnoinputsjson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-inputs.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonnotypesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-types.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonunknowninputqueuejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-input-queue.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonunknownmembertypejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-member-type.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsfailonunknowntypemodejson">trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-type-mode.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateenumencodinghelperswithguardedvaluesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateenumencodinghelpersjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateeventloopshapetypesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-event-loop-shape-types.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateinputwithguardjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-guard.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateinputwithvectormembersjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-vector-members.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgenerateinputswithflagsjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-inputs-with-flags.json</a></li>
<li><a href="#trunkSourceJavaScriptCorereplayscriptstestsgeneratememoizedtypemodesjson">trunk/Source/JavaScriptCore/replay/scripts/tests/generate-memoized-type-modes.json</a></li>
<li><a href="#trunkToolsScriptsruninputgeneratortests">trunk/Tools/Scripts/run-input-generator-tests</a></li>
<li>trunk/Tools/Scripts/webkitpy/replay/</li>
<li><a href="#trunkToolsScriptswebkitpyreplay__init__py">trunk/Tools/Scripts/webkitpy/replay/__init__.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyreplaymainpy">trunk/Tools/Scripts/webkitpy/replay/main.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (163917 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-12 00:08:16 UTC (rev 163917)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -1,3 +1,214 @@
</span><ins>+2014-02-11  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Replay: upstream replay input code generator and EncodedValue class
+        https://bugs.webkit.org/show_bug.cgi?id=128215
+
+        Reviewed by Joseph Pecoraro.
+
+        Add the replay inputs code generator. Most features of the input generator are
+        exercised by included generator regression tests, which produce useful but
+        non-compilable test replay inputs.
+
+        Add EncodedValue, the main replay input serialization class that encodes and
+        decodes inputs and their data between C++ types and the JSON-based replay recording
+        format. EncodedValue uses EncodingTraits specializations for type-specific encoding.
+        Relative to other WebKit marshalling mechanisms, EncodedValue is key/value based.
+        EncodedValue uses InspectorValue subclasses as its backing data structure.
+
+        Add some missing numerical conversions to InspectorValue.
+
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * inspector/InspectorValues.cpp:
+        (Inspector::InspectorValue::asNumber):
+        (Inspector::InspectorBasicValue::asNumber):
+        * inspector/InspectorValues.h:
+        * replay/EncodedValue.cpp: Added.
+        (JSC::EncodedValue::asObject):
+        (JSC::EncodedValue::asArray):
+        (JSC::ScalarEncodingTraits&lt;bool&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;double&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;float&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;int32_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;int64_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue):
+        (JSC::ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue):
+        (JSC::long&gt;::encodeValue):
+        (JSC::EncodedValue::convertTo&lt;bool&gt;):
+        (JSC::EncodedValue::convertTo&lt;double&gt;):
+        (JSC::EncodedValue::convertTo&lt;float&gt;):
+        (JSC::EncodedValue::convertTo&lt;int32_t&gt;):
+        (JSC::EncodedValue::convertTo&lt;int64_t&gt;):
+        (JSC::EncodedValue::convertTo&lt;uint32_t&gt;):
+        (JSC::EncodedValue::convertTo&lt;uint64_t&gt;):
+        (JSC::long&gt;):
+        (JSC::EncodedValue::convertTo&lt;String&gt;):
+        (JSC::EncodedValue::put&lt;EncodedValue&gt;):
+        (JSC::EncodedValue::append&lt;EncodedValue&gt;):
+        (JSC::EncodedValue::get&lt;EncodedValue&gt;):
+        * replay/EncodedValue.h: Added.
+        (JSC::EncodedValue::EncodedValue):
+        (JSC::EncodedValue::createObject):
+        (JSC::EncodedValue::createArray):
+        (JSC::EncodedValue::createString):
+        (JSC::EncodedValue::~EncodedValue):
+        (JSC::ScalarEncodingTraits::decodeValue):
+        (JSC::EncodingTraits&lt;String&gt;::encodeValue):
+        (JSC::EncodedValue::put):
+        (JSC::EncodedValue::append):
+        (JSC::EncodedValue::get):
+        * replay/scripts/CodeGeneratorReplayInputs.py: Added.
+        (ParseException):
+        (TypecheckException):
+        (Framework):
+        (Framework.__init__):
+        (Framework.setting):
+        (Framework.fromString):
+        (Frameworks):
+        (InputQueue):
+        (InputQueue.__init__):
+        (InputQueue.setting):
+        (InputQueue.fromString):
+        (InputQueues):
+        (Input):
+        (Input.__init__):
+        (Input.setting):
+        (InputMember):
+        (InputMember.__init__):
+        (InputMember.has_flag):
+        (TypeMode):
+        (TypeMode.__init__):
+        (TypeMode.fromString):
+        (TypeModes):
+        (Type):
+        (Type.__init__):
+        (Type.__eq__):
+        (Type.__hash__):
+        (Type.has_flag):
+        (Type.is_struct):
+        (Type.is_enum):
+        (Type.is_enum_class):
+        (Type.declaration_kind):
+        (Type.qualified_prefix):
+        (Type.qualified_prefix.is):
+        (Type.type_name):
+        (Type.storage_type):
+        (Type.borrow_type):
+        (Type.argument_type):
+        (check_properties):
+        (VectorType):
+        (VectorType.__init__):
+        (VectorType.has_flag):
+        (VectorType.is_struct):
+        (VectorType.is_enum):
+        (VectorType.is_enum_class):
+        (VectorType.qualified_prefix):
+        (VectorType.type_name):
+        (VectorType.argument_type):
+        (InputsModel):
+        (InputsModel.__init__):
+        (InputsModel.enum_types):
+        (InputsModel.get_type_for_member):
+        (InputsModel.parse_toplevel):
+        (InputsModel.parse_type_with_framework_name):
+        (InputsModel.parse_input):
+        (InputsModel.typecheck):
+        (InputsModel.typecheck_type):
+        (InputsModel.typecheck_input):
+        (InputsModel.typecheck_input_member):
+        (IncrementalFileWriter):
+        (IncrementalFileWriter.__init__):
+        (IncrementalFileWriter.write):
+        (IncrementalFileWriter.close):
+        (lcfirst):
+        (wrap_with_guard):
+        (Generator):
+        (Generator.__init__):
+        (Generator.setting):
+        (Generator.output_filename):
+        (Generator.write_output_files):
+        (Generator.generate_header):
+        (Generator.generate_implementation):
+        (Generator.generate_license):
+        (Generator.generate_includes):
+        (Generator.generate_includes.declaration):
+        (Generator.generate_includes.declaration.is):
+        (Generator.generate_type_forward_declarations):
+        (Generator.generate_type_forward_declarations.is):
+        (Generator.generate_class_declaration):
+        (Generator.generate_input_constructor_declaration):
+        (Generator.generate_input_destructor_declaration):
+        (Generator.generate_input_member_getter):
+        (Generator.generate_input_member_declaration):
+        (Generator.generate_input_member_tuples):
+        (Generator.qualified_input_name):
+        (Generator.generate_input_trait_declaration):
+        (Generator.generate_enum_trait_declaration):
+        (Generator.generate_for_each_macro):
+        (Generator.generate_class_implementation):
+        (Generator.generate_enum_trait_implementation):
+        (Generator.generate_enum_trait_implementation.is):
+        (Generator.generate_input_trait_implementation):
+        (Generator.generate_input_encode_implementation):
+        (Generator.generate_input_decode_implementation):
+        (Generator.generate_constructor_initializer_list):
+        (Generator.generate_constructor_formals_list):
+        (Generator.generate_member_borrow_expression):
+        (Generator.generate_member_move_expression):
+        (Generator.generate_constructor_arguments_list):
+        (generate_from_specification):
+        * replay/scripts/CodeGeneratorReplayInputsTemplates.py: Added.
+        (Templates):
+        * replay/scripts/tests/expected/JSInputs.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/JSInputs.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-missing-input-name.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-missing-input-queue.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-missing-type-mode.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-missing-type-name.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-no-inputs.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-no-types.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-unknown-member-type.json-error: Added.
+        * replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error: Added.
+        * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-error: Added.
+        * replay/scripts/tests/expected/generate-event-loop-shape-types.json-error: Added.
+        * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/expected/generate-inputs-with-flags.json-error: Added.
+        * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp: Added.
+        * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h: Added.
+        * replay/scripts/tests/fail-on-c-style-enum-no-storage.json: Added.
+        * replay/scripts/tests/fail-on-duplicate-input-names.json: Added.
+        * replay/scripts/tests/fail-on-duplicate-type-names.json: Added.
+        * replay/scripts/tests/fail-on-enum-type-missing-values.json: Added.
+        * replay/scripts/tests/fail-on-missing-input-member-name.json: Added.
+        * replay/scripts/tests/fail-on-missing-input-name.json: Added.
+        * replay/scripts/tests/fail-on-missing-input-queue.json: Added.
+        * replay/scripts/tests/fail-on-missing-type-mode.json: Added.
+        * replay/scripts/tests/fail-on-missing-type-name.json: Added.
+        * replay/scripts/tests/fail-on-no-inputs.json: Added.
+        * replay/scripts/tests/fail-on-no-types.json: Added.
+        * replay/scripts/tests/fail-on-unknown-input-queue.json: Added.
+        * replay/scripts/tests/fail-on-unknown-member-type.json: Added.
+        * replay/scripts/tests/fail-on-unknown-type-mode.json: Added.
+        * replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json: Added.
+        * replay/scripts/tests/generate-enum-encoding-helpers.json: Added.
+        * replay/scripts/tests/generate-event-loop-shape-types.json: Added.
+        * replay/scripts/tests/generate-input-with-guard.json: Added.
+        * replay/scripts/tests/generate-input-with-vector-members.json: Added.
+        * replay/scripts/tests/generate-inputs-with-flags.json: Added.
+        * replay/scripts/tests/generate-memoized-type-modes.json: Added.
+
</ins><span class="cx"> 2014-02-11  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add Availability Macros to new JSC APIs
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (163917 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-12 00:08:16 UTC (rev 163917)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -929,9 +929,11 @@
</span><span class="cx">                 969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07950ED1D3AE00F1F681 /* Opcode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 978801401471AD920041B016 /* JSDateMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9788FC221471AD0C0068CE2D /* JSDateMath.cpp */; };
</span><span class="cx">                 978801411471AD920041B016 /* JSDateMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 9788FC231471AD0C0068CE2D /* JSDateMath.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                99E45A1018A01F350026D88F /* EmptyInputCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A0D18A01F350026D88F /* EmptyInputCursor.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                99E45A1118A01F350026D88F /* InputCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A0E18A01F350026D88F /* InputCursor.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                99E45A1218A01F350026D88F /* NondeterministicInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A0F18A01F350026D88F /* NondeterministicInput.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                99E45A2418A1B2590026D88F /* EmptyInputCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A1F18A1B2590026D88F /* EmptyInputCursor.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                99E45A2518A1B2590026D88F /* EncodedValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E45A2018A1B2590026D88F /* EncodedValue.cpp */; };
+                99E45A2618A1B2590026D88F /* EncodedValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A2118A1B2590026D88F /* EncodedValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                99E45A2718A1B2590026D88F /* InputCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A2218A1B2590026D88F /* InputCursor.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                99E45A2818A1B2590026D88F /* NondeterministicInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 99E45A2318A1B2590026D88F /* NondeterministicInput.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 A1712B3B11C7B212007A5315 /* RegExpCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1712B3A11C7B212007A5315 /* RegExpCache.cpp */; };
</span><span class="cx">                 A1712B3F11C7B228007A5315 /* RegExpCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A1712B3E11C7B228007A5315 /* RegExpCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 A1712B4111C7B235007A5315 /* RegExpKey.h in Headers */ = {isa = PBXBuildFile; fileRef = A1712B4011C7B235007A5315 /* RegExpKey.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2400,9 +2402,13 @@
</span><span class="cx">                 969A09220ED1E09C00F1F681 /* Completion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Completion.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 9788FC221471AD0C0068CE2D /* JSDateMath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDateMath.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 9788FC231471AD0C0068CE2D /* JSDateMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDateMath.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                99E45A0D18A01F350026D88F /* EmptyInputCursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmptyInputCursor.h; path = replay/EmptyInputCursor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                99E45A0E18A01F350026D88F /* InputCursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InputCursor.h; path = replay/InputCursor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                99E45A0F18A01F350026D88F /* NondeterministicInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NondeterministicInput.h; path = replay/NondeterministicInput.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                99E45A1D18A1B1E70026D88F /* CodeGeneratorReplayInputs.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = CodeGeneratorReplayInputs.py; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A1E18A1B1E70026D88F /* CodeGeneratorReplayInputsTemplates.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = CodeGeneratorReplayInputsTemplates.py; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A1F18A1B2590026D88F /* EmptyInputCursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmptyInputCursor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A2018A1B2590026D88F /* EncodedValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EncodedValue.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A2118A1B2590026D88F /* EncodedValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EncodedValue.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A2218A1B2590026D88F /* InputCursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputCursor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                99E45A2318A1B2590026D88F /* NondeterministicInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NondeterministicInput.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 A1712B3A11C7B212007A5315 /* RegExpCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegExpCache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A1712B3E11C7B228007A5315 /* RegExpCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegExpCache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A1712B4011C7B235007A5315 /* RegExpKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegExpKey.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4545,13 +4551,25 @@
</span><span class="cx">                 99E45A0C18A01E930026D88F /* replay */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><del>-                                99E45A0D18A01F350026D88F /* EmptyInputCursor.h */,
-                                99E45A0E18A01F350026D88F /* InputCursor.h */,
-                                99E45A0F18A01F350026D88F /* NondeterministicInput.h */,
</del><ins>+                                99E45A1C18A1B1B80026D88F /* scripts */,
+                                99E45A2018A1B2590026D88F /* EncodedValue.cpp */,
+                                99E45A2118A1B2590026D88F /* EncodedValue.h */,
+                                99E45A1F18A1B2590026D88F /* EmptyInputCursor.h */,
+                                99E45A2218A1B2590026D88F /* InputCursor.h */,
+                                99E45A2318A1B2590026D88F /* NondeterministicInput.h */,
</ins><span class="cx">                         );
</span><del>-                        name = replay;
</del><ins>+                        path = replay;
</ins><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="cx">                 };
</span><ins>+                99E45A1C18A1B1B80026D88F /* scripts */ = {
+                        isa = PBXGroup;
+                        children = (
+                                99E45A1D18A1B1E70026D88F /* CodeGeneratorReplayInputs.py */,
+                                99E45A1E18A1B1E70026D88F /* CodeGeneratorReplayInputsTemplates.py */,
+                        );
+                        path = scripts;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
</ins><span class="cx">                 A513E5CC185FB992007E95AD /* agents */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><span class="lines">@@ -4777,6 +4795,7 @@
</span><span class="cx">                                 969A07230ED1CE3300F1F681 /* BytecodeGenerator.h in Headers */,
</span><span class="cx">                                 0F8023EA1613832B00A0BA45 /* ByValInfo.h in Headers */,
</span><span class="cx">                                 BC18C3ED0E16F5CD00B34460 /* CallData.h in Headers */,
</span><ins>+                                99E45A2618A1B2590026D88F /* EncodedValue.h in Headers */,
</ins><span class="cx">                                 1429D8DE0ED2205B00B89619 /* CallFrame.h in Headers */,
</span><span class="cx">                                 A7C1EAEF17987AB600299DB2 /* CallFrameInlines.h in Headers */,
</span><span class="cx">                                 95E3BC050E1AE68200B2D1C1 /* CallIdentifier.h in Headers */,
</span><span class="lines">@@ -4943,6 +4962,7 @@
</span><span class="cx">                                 0FEFC9AB1681A3B600567F53 /* DFGOSRExitJumpPlaceholder.h in Headers */,
</span><span class="cx">                                 0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */,
</span><span class="cx">                                 0FFFC95C14EF90AF00C72532 /* DFGPhase.h in Headers */,
</span><ins>+                                99E45A2718A1B2590026D88F /* InputCursor.h in Headers */,
</ins><span class="cx">                                 A78A977B179738B8009DF744 /* DFGPlan.h in Headers */,
</span><span class="cx">                                 0FBE0F7516C1DB0B0082C5E8 /* DFGPredictionInjectionPhase.h in Headers */,
</span><span class="cx">                                 0FFFC95E14EF90B700C72532 /* DFGPredictionPropagationPhase.h in Headers */,
</span><span class="lines">@@ -5028,7 +5048,6 @@
</span><span class="cx">                                 0FEA0A10170513DB00BB722C /* FTLLowerDFGToLLVM.h in Headers */,
</span><span class="cx">                                 A7D89D0217A0B90400773AD8 /* FTLLoweredNodeValue.h in Headers */,
</span><span class="cx">                                 0FD8A31C17D51F2200CA2C40 /* FTLOSREntry.h in Headers */,
</span><del>-                                99E45A1118A01F350026D88F /* InputCursor.h in Headers */,
</del><span class="cx">                                 0F235BDD17178E1C00690C7F /* FTLOSRExit.h in Headers */,
</span><span class="cx">                                 0F235BDE17178E1C00690C7F /* FTLOSRExitCompilationInfo.h in Headers */,
</span><span class="cx">                                 0F235BE017178E1C00690C7F /* FTLOSRExitCompiler.h in Headers */,
</span><span class="lines">@@ -5049,6 +5068,7 @@
</span><span class="cx">                                 DDF7ABD411F60ED200108E36 /* GCActivityCallback.h in Headers */,
</span><span class="cx">                                 BCBE2CAE14E985AA000593AD /* GCAssertions.h in Headers */,
</span><span class="cx">                                 0F766D3015A8DCE2008F363E /* GCAwareJITStubRoutine.h in Headers */,
</span><ins>+                                99E45A2418A1B2590026D88F /* EmptyInputCursor.h in Headers */,
</ins><span class="cx">                                 0F2B66AC17B6B53F00A7AE3F /* GCIncomingRefCounted.h in Headers */,
</span><span class="cx">                                 0F2B66AD17B6B54500A7AE3F /* GCIncomingRefCountedInlines.h in Headers */,
</span><span class="cx">                                 0F2B66AE17B6B54500A7AE3F /* GCIncomingRefCountedSet.h in Headers */,
</span><span class="lines">@@ -5202,7 +5222,6 @@
</span><span class="cx">                                 BC18C45E0E16F5CD00B34460 /* JSStack.h in Headers */,
</span><span class="cx">                                 A7C1EAF017987AB600299DB2 /* JSStackInlines.h in Headers */,
</span><span class="cx">                                 BC18C4270E16F5CD00B34460 /* JSString.h in Headers */,
</span><del>-                                99E45A1218A01F350026D88F /* NondeterministicInput.h in Headers */,
</del><span class="cx">                                 86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */,
</span><span class="cx">                                 2600B5A7152BAAA70091EE5F /* JSStringJoiner.h in Headers */,
</span><span class="cx">                                 BC18C4280E16F5CD00B34460 /* JSStringRef.h in Headers */,
</span><span class="lines">@@ -5352,6 +5371,7 @@
</span><span class="cx">                                 86158AB3155C8B4000B45C9C /* PropertyName.h in Headers */,
</span><span class="cx">                                 BC18C4540E16F5CD00B34460 /* PropertyNameArray.h in Headers */,
</span><span class="cx">                                 0FF7168C15A3B235008F5DAA /* PropertyOffset.h in Headers */,
</span><ins>+                                99E45A2818A1B2590026D88F /* NondeterministicInput.h in Headers */,
</ins><span class="cx">                                 BC18C4550E16F5CD00B34460 /* PropertySlot.h in Headers */,
</span><span class="cx">                                 0FB7F39C15ED8E4600F167B2 /* PropertyStorage.h in Headers */,
</span><span class="cx">                                 A532438818568335002ED692 /* InspectorJSBackendDispatchers.h in Headers */,
</span><span class="lines">@@ -5404,7 +5424,6 @@
</span><span class="cx">                                 E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */,
</span><span class="cx">                                 0FB7F39E15ED8E4600F167B2 /* SparseArrayValueMap.h in Headers */,
</span><span class="cx">                                 A7386554118697B400540279 /* SpecializedThunkJIT.h in Headers */,
</span><del>-                                99E45A1018A01F350026D88F /* EmptyInputCursor.h in Headers */,
</del><span class="cx">                                 0F5541B21613C1FB00CE3E25 /* SpecialPointer.h in Headers */,
</span><span class="cx">                                 0FD82E54141DAEEE00179C94 /* SpeculatedType.h in Headers */,
</span><span class="cx">                                 A7C1EAF217987AB600299DB2 /* StackVisitor.h in Headers */,
</span><span class="lines">@@ -6240,6 +6259,7 @@
</span><span class="cx">                                 1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */,
</span><span class="cx">                                 146AAB380B66A94400E55F16 /* JSStringRefCF.cpp in Sources */,
</span><span class="cx">                                 0F919D0C157EE09F004A4E7D /* JSSymbolTableObject.cpp in Sources */,
</span><ins>+                                99E45A2518A1B2590026D88F /* EncodedValue.cpp in Sources */,
</ins><span class="cx">                                 0F2B66FA17B6B5AB00A7AE3F /* JSTypedArrayConstructors.cpp in Sources */,
</span><span class="cx">                                 A532438B18568335002ED692 /* InspectorJSTypeBuilders.cpp in Sources */,
</span><span class="cx">                                 0F2B66FC17B6B5AB00A7AE3F /* JSTypedArrayPrototypes.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorValuescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp (163917 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2014-02-12 00:08:16 UTC (rev 163917)
+++ trunk/Source/JavaScriptCore/inspector/InspectorValues.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -492,7 +492,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asNumber(long*) const
</del><ins>+bool InspectorValue::asNumber(float*) const
</ins><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="lines">@@ -502,12 +502,27 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool InspectorValue::asNumber(unsigned*) const
+{
+    return false;
+}
+
+bool InspectorValue::asNumber(long*) const
+{
+    return false;
+}
+
+bool InspectorValue::asNumber(long long*) const
+{
+    return false;
+}
+
</ins><span class="cx"> bool InspectorValue::asNumber(unsigned long*) const
</span><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorValue::asNumber(unsigned int*) const
</del><ins>+bool InspectorValue::asNumber(unsigned long long*) const
</ins><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="lines">@@ -584,11 +599,11 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asNumber(long* output) const
</del><ins>+bool InspectorBasicValue::asNumber(float* output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != TypeNumber)
</span><span class="cx">         return false;
</span><del>-    *output = static_cast&lt;long&gt;(m_doubleValue);
</del><ins>+    *output = static_cast&lt;float&gt;(m_doubleValue);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -600,6 +615,30 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool InspectorBasicValue::asNumber(unsigned* output) const
+{
+    if (type() != TypeNumber)
+        return false;
+    *output = static_cast&lt;unsigned&gt;(m_doubleValue);
+    return true;
+}
+
+bool InspectorBasicValue::asNumber(long* output) const
+{
+    if (type() != TypeNumber)
+        return false;
+    *output = static_cast&lt;long&gt;(m_doubleValue);
+    return true;
+}
+
+bool InspectorBasicValue::asNumber(long long* output) const
+{
+    if (type() != TypeNumber)
+        return false;
+    *output = static_cast&lt;long long&gt;(m_doubleValue);
+    return true;
+}
+
</ins><span class="cx"> bool InspectorBasicValue::asNumber(unsigned long* output) const
</span><span class="cx"> {
</span><span class="cx">     if (type() != TypeNumber)
</span><span class="lines">@@ -608,11 +647,11 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool InspectorBasicValue::asNumber(unsigned int* output) const
</del><ins>+bool InspectorBasicValue::asNumber(unsigned long long* output) const
</ins><span class="cx"> {
</span><span class="cx">     if (type() != TypeNumber)
</span><span class="cx">         return false;
</span><del>-    *output = static_cast&lt;unsigned int&gt;(m_doubleValue);
</del><ins>+    *output = static_cast&lt;unsigned long long&gt;(m_doubleValue);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorValuesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorValues.h (163917 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorValues.h        2014-02-12 00:08:16 UTC (rev 163917)
+++ trunk/Source/JavaScriptCore/inspector/InspectorValues.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -67,10 +67,13 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool asBoolean(bool* output) const;
</span><span class="cx">     virtual bool asNumber(double* output) const;
</span><ins>+    virtual bool asNumber(float* output) const;
+    virtual bool asNumber(int* output) const;
+    virtual bool asNumber(unsigned* output) const;
</ins><span class="cx">     virtual bool asNumber(long* output) const;
</span><del>-    virtual bool asNumber(int* output) const;
</del><ins>+    virtual bool asNumber(long long* output) const;
</ins><span class="cx">     virtual bool asNumber(unsigned long* output) const;
</span><del>-    virtual bool asNumber(unsigned int* output) const;
</del><ins>+    virtual bool asNumber(unsigned long long* output) const;
</ins><span class="cx">     virtual bool asString(String* output) const;
</span><span class="cx">     virtual bool asValue(RefPtr&lt;InspectorValue&gt;* output);
</span><span class="cx">     virtual bool asObject(RefPtr&lt;InspectorObject&gt;* output);
</span><span class="lines">@@ -99,10 +102,13 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool asBoolean(bool* output) const override;
</span><span class="cx">     virtual bool asNumber(double* output) const override;
</span><ins>+    virtual bool asNumber(float* output) const override;
+    virtual bool asNumber(int* output) const override;
+    virtual bool asNumber(unsigned* output) const override;
</ins><span class="cx">     virtual bool asNumber(long* output) const override;
</span><del>-    virtual bool asNumber(int* output) const override;
</del><ins>+    virtual bool asNumber(long long* output) const override;
</ins><span class="cx">     virtual bool asNumber(unsigned long* output) const override;
</span><del>-    virtual bool asNumber(unsigned* output) const override;
</del><ins>+    virtual bool asNumber(unsigned long long* output) const override;
</ins><span class="cx"> 
</span><span class="cx">     virtual void writeJSON(StringBuilder* output) const override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayEncodedValuecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/EncodedValue.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/EncodedValue.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/EncodedValue.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,196 @@
</span><ins>+/*
+ * Copyright (C) 2013 University of Washington. All rights reserved.
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;EncodedValue.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+
+#include &quot;InspectorValues.h&quot;
+#include &lt;wtf/text/Base64.h&gt;
+
+using namespace Inspector;
+
+namespace JSC {
+
+PassRefPtr&lt;InspectorObject&gt; EncodedValue::asObject()
+{
+    RefPtr&lt;InspectorObject&gt; result;
+    bool castSucceeded = m_value-&gt;asObject(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result.release();
+}
+
+PassRefPtr&lt;InspectorArray&gt; EncodedValue::asArray()
+{
+    RefPtr&lt;InspectorArray&gt; result;
+    bool castSucceeded = m_value-&gt;asArray(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result.release();
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;bool&gt;::encodeValue(const bool&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create(value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;double&gt;::encodeValue(const double&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create(value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;float&gt;::encodeValue(const float&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;int32_t&gt;::encodeValue(const int32_t&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;int64_t&gt;::encodeValue(const int64_t&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;uint32_t&gt;::encodeValue(const uint32_t&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;uint64_t&gt;::encodeValue(const uint64_t&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; EncodedValue ScalarEncodingTraits&lt;unsigned long&gt;::encodeValue(const unsigned long&amp; value)
+{
+    return EncodedValue(InspectorBasicValue::create((double)value));
+}
+
+template&lt;&gt; bool EncodedValue::convertTo&lt;bool&gt;()
+{
+    bool result;
+    bool castSucceeded = m_value-&gt;asBoolean(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; double EncodedValue::convertTo&lt;double&gt;()
+{
+    double result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; float EncodedValue::convertTo&lt;float&gt;()
+{
+    float result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; int32_t EncodedValue::convertTo&lt;int32_t&gt;()
+{
+    int32_t result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; int64_t EncodedValue::convertTo&lt;int64_t&gt;()
+{
+    int64_t result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; uint32_t EncodedValue::convertTo&lt;uint32_t&gt;()
+{
+    uint32_t result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; uint64_t EncodedValue::convertTo&lt;uint64_t&gt;()
+{
+    uint64_t result;
+    bool castSucceeded = m_value-&gt;asNumber(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt; String EncodedValue::convertTo&lt;String&gt;()
+{
+    String result;
+    bool castSucceeded = m_value-&gt;asString(&amp;result);
+    ASSERT_UNUSED(castSucceeded, castSucceeded);
+
+    return result;
+}
+
+template&lt;&gt;
+void EncodedValue::put&lt;EncodedValue&gt;(const String&amp; key, const typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp; value)
+{
+    asObject()-&gt;setValue(key, value.m_value);
+}
+
+template&lt;&gt;
+void EncodedValue::append&lt;EncodedValue&gt;(const typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp; value)
+{
+    asArray()-&gt;pushValue(value.m_value);
+}
+
+template&lt;&gt;
+bool EncodedValue::get&lt;EncodedValue&gt;(const String&amp; key, typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp; decodedValue)
+{
+    RefPtr&lt;Inspector::InspectorValue&gt; inspectorValue(asObject()-&gt;get(key));
+    if (!inspectorValue)
+        return false;
+
+    decodedValue = EncodedValue(inspectorValue);
+    return true;
+}
+
+
+}; // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayEncodedValueh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/EncodedValue.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/EncodedValue.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/EncodedValue.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,219 @@
</span><ins>+/*
+ * Copyright (C) 2013 University of Washington. All rights reserved.
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef EncodedValue_h
+#define EncodedValue_h
+
+#if ENABLE(WEB_REPLAY)
+
+#include &quot;InspectorValues.h&quot;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace JSC {
+
+class NondeterministicInputBase;
+template&lt;typename T&gt; struct EncodingTraits;
+
+class EncodedValue final {
+public:
+    explicit EncodedValue(PassRefPtr&lt;Inspector::InspectorValue&gt; value)
+        : m_value(value) { }
+
+    EncodedValue()
+        : m_value(nullptr) { }
+
+    static EncodedValue createObject()
+    {
+        return EncodedValue(Inspector::InspectorObject::create());
+    }
+
+    static EncodedValue createArray()
+    {
+        return EncodedValue(Inspector::InspectorArray::create());
+    }
+
+    static EncodedValue createString(const String&amp; value)
+    {
+        return EncodedValue(Inspector::InspectorString::create(value));
+    }
+
+    static EncodedValue createString(const char* value)
+    {
+        return EncodedValue(Inspector::InspectorString::create(value));
+    }
+
+    template&lt;typename T&gt;
+    void put(const String&amp;, const typename EncodingTraits&lt;T&gt;::DecodedType&amp;);
+
+    template&lt;typename T&gt;
+    void append(const typename EncodingTraits&lt;T&gt;::DecodedType&amp;);
+
+    template&lt;typename T&gt; bool get(const String&amp;, typename EncodingTraits&lt;T&gt;::DecodedType&amp;);
+    template&lt;typename T&gt; bool get(const String&amp;, std::unique_ptr&lt;typename EncodingTraits&lt;T&gt;::DecodedType&gt;&amp;);
+
+    template&lt;typename T&gt; T convertTo();
+
+    JS_EXPORT_PRIVATE PassRefPtr&lt;Inspector::InspectorObject&gt; asObject();
+    JS_EXPORT_PRIVATE PassRefPtr&lt;Inspector::InspectorArray&gt; asArray();
+
+private:
+    RefPtr&lt;Inspector::InspectorValue&gt; m_value;
+};
+
+template&lt;&gt; JS_EXPORT_PRIVATE bool EncodedValue::convertTo&lt;bool&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE double EncodedValue::convertTo&lt;double&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE float EncodedValue::convertTo&lt;float&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE int32_t EncodedValue::convertTo&lt;int32_t&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE int64_t EncodedValue::convertTo&lt;int64_t&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE uint32_t EncodedValue::convertTo&lt;uint32_t&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE uint64_t EncodedValue::convertTo&lt;uint64_t&gt;();
+template&lt;&gt; JS_EXPORT_PRIVATE String EncodedValue::convertTo&lt;String&gt;();
+
+template&lt;typename T&gt;
+struct EncodingTraits {
+    typedef T DecodedType;
+
+    static EncodedValue encodeValue(DecodedType);
+    static EncodedValue encodeValue(const DecodedType&amp;);
+
+    static bool decodeValue(EncodedValue&amp;, DecodedType&amp;);
+    static bool decodeValue(EncodedValue&amp;, std::unique_ptr&lt;DecodedType&gt;&amp;);
+};
+
+template&lt;typename T, size_t inlineCapacity, typename OverflowHandler&gt;
+struct EncodingTraits&lt;Vector&lt;T, inlineCapacity, OverflowHandler&gt;&gt; {
+    typedef Vector&lt;typename EncodingTraits&lt;T&gt;::DecodedType, inlineCapacity, OverflowHandler&gt; DecodedType;
+
+    static EncodedValue encodeValue(const DecodedType&amp; vectorOfValues)
+    {
+        EncodedValue encodedVector = EncodedValue::createArray();
+        for (const typename EncodingTraits&lt;T&gt;::DecodedType&amp; value : vectorOfValues)
+            encodedVector.append&lt;typename EncodingTraits&lt;T&gt;::DecodedType&gt;(value);
+
+        return std::move(encodedVector);
+    }
+
+    static bool decodeValue(EncodedValue&amp; encodedVector, DecodedType&amp; decodedValue)
+    {
+        RefPtr&lt;Inspector::InspectorArray&gt; inspectorArray = encodedVector.asArray();
+        decodedValue = Vector&lt;typename EncodingTraits&lt;T&gt;::DecodedType, inlineCapacity, OverflowHandler&gt;(inspectorArray-&gt;length());
+        for (size_t i = 0; i &lt; inspectorArray-&gt;length(); ++i) {
+            EncodedValue encodedElement(inspectorArray-&gt;get(i));
+            if (!EncodingTraits&lt;T&gt;::decodeValue(encodedElement, decodedValue.at(i)))
+                return false;
+        }
+        return true;
+    }
+};
+
+template&lt;&gt; struct EncodingTraits&lt;EncodedValue&gt; {
+    typedef EncodedValue DecodedType;
+    // We should never attempt to decode or encode an encoded value,
+    // so encodeValue and decodeValue are intentionally omitted here.
+};
+
+template&lt;typename T&gt;
+struct ScalarEncodingTraits {
+    typedef T DecodedType;
+
+    static JS_EXPORT_PRIVATE EncodedValue encodeValue(const DecodedType&amp; decodedValue);
+    static bool decodeValue(EncodedValue&amp; encodedValue, DecodedType&amp; decodedValue)
+    {
+        decodedValue = encodedValue.convertTo&lt;DecodedType&gt;();
+        return true;
+    }
+};
+
+template&lt;&gt; struct EncodingTraits&lt;bool&gt; : public ScalarEncodingTraits&lt;bool&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;double&gt; : public ScalarEncodingTraits&lt;double&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;float&gt; : public ScalarEncodingTraits&lt;float&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;int32_t&gt; : public ScalarEncodingTraits&lt;int32_t&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;int64_t&gt; : public ScalarEncodingTraits&lt;int64_t&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;uint32_t&gt; : public ScalarEncodingTraits&lt;uint32_t&gt; { };
+template&lt;&gt; struct EncodingTraits&lt;uint64_t&gt; : public ScalarEncodingTraits&lt;uint64_t&gt; { };
+
+template&lt;&gt; struct EncodingTraits&lt;String&gt; : public ScalarEncodingTraits&lt;String&gt; {
+    static EncodedValue encodeValue(const String&amp; value)
+    {
+        return EncodedValue::createString(value);
+    }
+};
+
+// Base cases for loading and storing values.
+template&lt;&gt; JS_EXPORT_PRIVATE
+void EncodedValue::put&lt;EncodedValue&gt;(const String&amp; key, const typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp;);
+
+template&lt;&gt; JS_EXPORT_PRIVATE
+void EncodedValue::append&lt;EncodedValue&gt;(const typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp;);
+
+template&lt;&gt; JS_EXPORT_PRIVATE
+bool EncodedValue::get&lt;EncodedValue&gt;(const String&amp; key, typename EncodingTraits&lt;EncodedValue&gt;::DecodedType&amp;);
+
+// Load and store types with an accompanying EncodingTraits implementation.
+template&lt;typename T&gt;
+void EncodedValue::put(const String&amp; key, const typename EncodingTraits&lt;T&gt;::DecodedType&amp; value)
+{
+    EncodedValue encodedValue = EncodingTraits&lt;T&gt;::encodeValue(value);
+    put&lt;EncodedValue&gt;(key, encodedValue);
+}
+
+template&lt;typename T&gt;
+void EncodedValue::append(const typename EncodingTraits&lt;T&gt;::DecodedType&amp; value)
+{
+    EncodedValue encodedValue = EncodingTraits&lt;T&gt;::encodeValue(value);
+    append&lt;EncodedValue&gt;(encodedValue);
+}
+
+template&lt;typename T&gt;
+bool EncodedValue::get(const String&amp; key, typename EncodingTraits&lt;T&gt;::DecodedType&amp; decodedValue)
+{
+    EncodedValue encodedValue;
+    if (!get&lt;EncodedValue&gt;(key, encodedValue))
+        return false;
+
+    return EncodingTraits&lt;T&gt;::decodeValue(encodedValue, decodedValue);
+}
+
+template&lt;typename T&gt;
+bool EncodedValue::get(const String&amp; key, std::unique_ptr&lt;typename EncodingTraits&lt;T&gt;::DecodedType&gt;&amp; decodedValue)
+{
+    EncodedValue encodedValue;
+    if (!get&lt;EncodedValue&gt;(key, encodedValue))
+        return false;
+
+    return EncodingTraits&lt;T&gt;::decodeValue(encodedValue, decodedValue);
+}
+
+} // namespace JSC
+
+using JSC::EncodedValue;
+using JSC::EncodingTraits;
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // EncodedValue_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptsCodeGeneratorReplayInputspy"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,982 @@
</span><ins>+#!/usr/bin/env python
+# Copyright (c) 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os.path
+import re
+import sys
+import string
+from string import Template
+import optparse
+import logging
+from CodeGeneratorReplayInputsTemplates import Templates
+
+try:
+    import json
+except ImportError:
+    import simplejson as json
+
+# Configuration values are first looked up in the framework configuration,
+# and then in the global configuration if there is no framework-specific value.
+GLOBAL_CONFIG = {
+    &quot;baseFilename&quot;: &quot;ReplayInputs&quot;,
+    &quot;guardCondition&quot;: &quot;ENABLE(WEB_REPLAY)&quot;,
+    &quot;traitsFrameworkName&quot;: &quot;JavaScriptCore&quot;,
+
+    # These are formatted as ([allowed_frameworks], (framework, header_path)).
+    # The generator can figure out how to format the includes.
+    &quot;headerIncludes&quot;: [
+        ([&quot;WebCore&quot;],
+            (&quot;WebCore&quot;, &quot;replay/EventLoopInput.h&quot;)
+        ),
+        ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
+            (&quot;JavaScriptCore&quot;, &quot;replay/EncodedValue.h&quot;)
+        ),
+        ([&quot;JavaScriptCore&quot;],
+            (&quot;JavaScriptCore&quot;, &quot;replay/NondeterministicInput.h&quot;)
+        ),
+        ([&quot;WebCore&quot;],
+            (&quot;WTF&quot;, &quot;wtf/text/WTFString.h&quot;)
+        ),
+
+        # Testing fixtures.
+        ([&quot;Test&quot;],
+            (&quot;WebCore&quot;, &quot;platform/ExternalNamespaceHeaderIncludeDummy.h&quot;)
+        ),
+        ([&quot;Test&quot;],
+            (&quot;Test&quot;, &quot;platform/InternalNamespaceHeaderIncludeDummy.h&quot;)
+        )
+    ],
+
+    &quot;implIncludes&quot;: [
+        ([&quot;WebCore&quot;],
+            (&quot;WebCore&quot;, &quot;replay/ReplayInputTypes.h&quot;)
+        ),
+        ([&quot;WebCore&quot;],
+            (&quot;WebCore&quot;, &quot;replay/SerializationMethods.h&quot;)
+        ),
+        ([&quot;WebCore&quot;, &quot;JavaScriptCore&quot;],
+            (&quot;JavaScriptCore&quot;, &quot;inspector/InspectorValues.h&quot;)
+        ),
+        ([&quot;JavaScriptCore&quot;],
+            (&quot;WTF&quot;, &quot;wtf/NeverDestroyed.h&quot;)
+        ),
+        ([&quot;JavaScriptCore&quot;],
+            (&quot;WTF&quot;, &quot;wtf/text/AtomicString.h&quot;)
+        ),
+
+        # Testing fixtures.
+        ([&quot;Test&quot;],
+            (&quot;WebCore&quot;, &quot;platform/ExternalNamespaceImplIncludeDummy.h&quot;)
+        ),
+        ([&quot;Test&quot;],
+            (&quot;Test&quot;, &quot;platform/InternalNamespaceImplIncludeDummy.h&quot;)
+        )
+    ],
+}
+
+FRAMEWORK_CONFIG_MAP = {
+    &quot;Global&quot;: {
+        &quot;prefix&quot;: &quot;&quot;,
+        &quot;namespace&quot;: &quot;&quot;
+    },
+
+    &quot;JavaScriptCore&quot;: {
+        &quot;prefix&quot;: &quot;JS&quot;,
+        &quot;namespace&quot;: &quot;JSC&quot;,
+        &quot;exportMacro&quot;: &quot;JS_EXPORT_PRIVATE&quot;,
+        &quot;inputTypeTemplate&quot;: Templates.InputTypeFromStaticLocal,
+    },
+    &quot;WebCore&quot;: {
+        &quot;prefix&quot;: &quot;Web&quot;,
+        &quot;namespace&quot;: &quot;WebCore&quot;,
+        &quot;inputTypeTemplate&quot;: Templates.InputTypeFromThreadLocal,
+    },
+    # Used for bindings tests.
+    &quot;Test&quot;: {
+        &quot;prefix&quot;: &quot;Test&quot;,
+        &quot;namespace&quot;: &quot;Test&quot;,
+        &quot;inputTypeTemplate&quot;: Templates.InputTypeFromStaticLocal,
+    }
+}
+
+# These settings are specific to an input queue.
+QUEUE_CONFIG_MAP = {
+    &quot;SCRIPT_MEMOIZED&quot;: {
+        &quot;enumValue&quot;: &quot;ScriptMemoizedData&quot;,
+        &quot;baseClass&quot;: &quot;NondeterministicInput&lt;%s&gt;&quot;,
+    },
+    &quot;LOADER_MEMOIZED&quot;: {
+        &quot;enumValue&quot;: &quot;LoaderMemoizedData&quot;,
+        &quot;baseClass&quot;: &quot;NondeterministicInput&lt;%s&gt;&quot;,
+    },
+    &quot;EVENT_LOOP&quot;: {
+        &quot;enumValue&quot;: &quot;EventLoopInput&quot;,
+        &quot;baseClass&quot;: &quot;EventLoopInput&lt;%s&gt;&quot;,
+    },
+}
+
+# Use a global logger, which normally only logs errors.
+# It can be configured to log debug messages from the CLI.
+logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.ERROR)
+log = logging.getLogger('global')
+
+
+# Model classes, which transliterate JSON input.
+class ParseException(Exception):
+    pass
+
+
+class TypecheckException(Exception):
+    pass
+
+
+class Framework:
+    def __init__(self, name):
+        self._settings = FRAMEWORK_CONFIG_MAP[name]
+        self.name = name
+
+    def setting(self, key, default=''):
+        return self._settings.get(key, default)
+
+    @staticmethod
+    def fromString(frameworkString):
+        if frameworkString == &quot;Global&quot;:
+            return Frameworks.Global
+
+        if frameworkString == &quot;JavaScriptCore&quot;:
+            return Frameworks.JavaScriptCore
+
+        if frameworkString == &quot;WebCore&quot;:
+            return Frameworks.WebCore
+
+        if frameworkString == &quot;Test&quot;:
+            return Frameworks.Test
+
+        raise ParseException(&quot;Unknown framework: &quot; + frameworkString)
+
+
+class Frameworks:
+    Global = Framework(&quot;Global&quot;)
+    JavaScriptCore = Framework(&quot;JavaScriptCore&quot;)
+    WebCore = Framework(&quot;WebCore&quot;)
+    Test = Framework(&quot;Test&quot;)
+
+
+class InputQueue:
+    def __init__(self, settings):
+        self._settings = settings
+
+    def setting(self, key, default=''):
+        return self._settings.get(key, default)
+
+    @staticmethod
+    def fromString(queueString):
+        if queueString == &quot;SCRIPT_MEMOIZED&quot;:
+            return InputQueues.SCRIPT_MEMOIZED
+
+        if queueString == &quot;LOADER_MEMOIZED&quot;:
+            return InputQueues.LOADER_MEMOIZED
+
+        if queueString == &quot;EVENT_LOOP&quot;:
+            return InputQueues.EVENT_LOOP
+
+        raise ParseException(&quot;Unknown input queue: &quot; + queueString)
+
+
+class InputQueues:
+    SCRIPT_MEMOIZED = InputQueue(QUEUE_CONFIG_MAP[&quot;SCRIPT_MEMOIZED&quot;])
+    LOADER_MEMOIZED = InputQueue(QUEUE_CONFIG_MAP[&quot;LOADER_MEMOIZED&quot;])
+    EVENT_LOOP = InputQueue(QUEUE_CONFIG_MAP[&quot;EVENT_LOOP&quot;])
+
+
+class Input:
+    def __init__(self, name, description, queueString, flags, guard=None):
+        self.name = name
+        self.description = description
+        self.queue = InputQueue.fromString(queueString)
+        self._flags = flags
+        self.guard = guard
+        self.members = []  # names should be unique, but ordered.
+
+    def setting(self, key, default=''):
+        if key in self._flags:
+            return True
+
+        return self.queue.setting(key, default)
+
+
+class InputMember:
+    def __init__(self, memberName, typeName, flags=[]):
+        self.memberName = memberName
+        self.typeName = typeName
+        self._flags = flags
+
+    def has_flag(self, key, default=''):
+        return key in self._flags
+
+
+class TypeMode:
+    def __init__(self, name):
+        self._name = name
+
+    @staticmethod
+    def fromString(modeString):
+        modeString = modeString.upper()
+        if modeString == 'SCALAR':
+            return TypeModes.SCALAR
+        if modeString == 'HEAVY_SCALAR':
+            return TypeModes.HEAVY_SCALAR
+        if modeString == 'OWNED':
+            return TypeModes.OWNED
+        if modeString == 'SHARED':
+            return TypeModes.SHARED
+        if modeString == 'VECTOR':
+            return TypeModes.VECTOR
+
+        raise ParseException(&quot;Unknown type mode: &quot; + modeString)
+
+
+class TypeModes:
+    # Copy for assignment and for getter
+    SCALAR = TypeMode(&quot;SCALAR&quot;)
+    # Copy for assignment, pass by reference for getter
+    HEAVY_SCALAR = TypeMode(&quot;HEAVY_SCALAR&quot;)
+    # Move for assignment, pass by reference for getter
+    OWNED = TypeMode(&quot;OWNED&quot;)
+    # Copy a RefPtr for assignment and getter
+    SHARED = TypeMode(&quot;SHARED&quot;)
+    # Move operator for assignment, pass by reference for getter
+    VECTOR = TypeMode(&quot;VECTOR&quot;)
+
+
+class Type:
+    def __init__(self, name, mode, framework, header, enclosing_class, values, guard_values_map, underlying_storage, flags):
+        self._name = name
+        self.mode = mode
+        self.framework = framework
+        self.header = header
+        self.enclosing_class = enclosing_class
+        self.values = values
+        self.guard_values_map = guard_values_map
+        self.underlying_storage = underlying_storage
+        self._flags = flags
+
+    def __eq__(self, other):
+        return self.type_name() == other.type_name() and self.mode == other.mode
+
+    def __hash__(self):
+        return self._name.__hash__()
+
+    def has_flag(self, flagString):
+        return flagString in self._flags
+
+    def is_struct(self):
+        return self.has_flag(&quot;STRUCT&quot;)
+
+    def is_enum(self):
+        return self.has_flag(&quot;ENUM&quot;)
+
+    def is_enum_class(self):
+        return self.has_flag(&quot;ENUM_CLASS&quot;)
+
+    def declaration_kind(self):
+        if self.is_enum():
+            return &quot;enum&quot;
+        elif self.is_enum_class():
+            return &quot;enum class&quot;
+        elif self.is_struct():
+            return &quot;struct&quot;
+        else:
+            return &quot;class&quot;
+
+    def qualified_prefix(self):
+        components = []
+        if self.framework != Frameworks.Global:
+            components.append(self.framework.setting('namespace'))
+        if self.enclosing_class is not None:
+            components.append(self.enclosing_class)
+        components.append(&quot;&quot;)
+        return &quot;::&quot;.join(components)
+
+    def type_name(self, qualified=False):
+        return &quot;%s%s&quot; % (self.qualified_prefix(), self._name) if qualified else self._name
+
+    def storage_type(self, qualified=False):
+        if self.mode == TypeModes.OWNED:
+            return &quot;std::unique_ptr&lt;%s&gt;&quot; % self.type_name(qualified)
+        elif self.mode == TypeModes.SHARED:
+            return &quot;RefPtr&lt;%s&gt;&quot; % self.type_name(qualified)
+        else:
+            return self.type_name(qualified)
+
+    def borrow_type(self, qualified=False):
+        if self.mode == TypeModes.SCALAR:
+            return self.type_name(qualified)
+        elif self.mode == TypeModes.SHARED:
+            return &quot;PassRefPtr&lt;%s&gt;&quot; % self.type_name(qualified)
+        else:
+            return &quot;const %s&amp;&quot; % self.type_name(qualified)
+
+    def argument_type(self, qualified=False):
+        if self.mode == TypeModes.SHARED:
+            return &quot;PassRefPtr&lt;%s&gt;&quot; % self.type_name(qualified)
+        else:
+            return self.storage_type()
+
+
+def check_for_required_properties(props, obj, what):
+    for prop in props:
+        if prop not in obj:
+            raise ParseException(&quot;When parsing %s, required property missing: %s&quot; % (what, prop))
+
+
+class VectorType(Type):
+    def __init__(self, element_type):
+        self._element_type = element_type
+        self.mode = TypeModes.VECTOR
+        self.framework = element_type.framework
+        self.enclosing_class = None
+
+    def has_flag(self):
+        return False
+
+    def is_struct(self):
+        return False
+
+    def is_enum(self):
+        return False
+
+    def is_enum_class(self):
+        return False
+
+    def qualified_prefix(self):
+        return &quot;&quot;
+
+    def type_name(self, qualified=False):
+        return &quot;Vector&lt;%s&gt;&quot; % self._element_type.type_name(qualified=qualified)
+
+    def argument_type(self, qualified=False):
+        return self.type_name(qualified=qualified) + &quot;&amp;&quot;
+
+
+class InputsModel:
+    def __init__(self, parsed_json):
+        self.inputs = []
+        self.types = []
+
+        # Types have associated frameworks and are in their namespace, but within the specification
+        # file types are in a flat namespace. Types with the same name are not allowed.
+        self.types_by_name = {}
+        self.inputs_by_name = {}
+
+        self.parse_toplevel(parsed_json)
+
+    def enum_types(self):
+        _enums = filter(lambda x: x.is_enum() or x.is_enum_class(), self.types)
+        return sorted(_enums, key=lambda _enum: _enum.type_name())
+
+    def get_type_for_member(self, member):
+        if member.has_flag(&quot;VECTOR&quot;):
+            return VectorType(self.types_by_name.get(member.typeName))
+        else:
+            return self.types_by_name.get(member.typeName)
+
+    def parse_toplevel(self, json):
+        check_for_required_properties(['types', 'inputs'], json, 'toplevel')
+        if not isinstance(json['types'], dict):
+            raise ParseException(&quot;Malformed specification: types is not a dict of framework-&gt;type list&quot;)
+
+        if not isinstance(json['inputs'], list):
+            raise ParseException(&quot;Malformed specification: inputs is not an array&quot;)
+
+        for type_framework_name, type_list in json['types'].iteritems():
+            if not isinstance(type_list, list):
+                raise ParseException(&quot;Malformed specification: type list for framework %s is not a list&quot; % type_framework_name)
+
+            for _type in type_list:
+                self.parse_type_with_framework_name(_type, type_framework_name)
+
+        for val in json['inputs']:
+            self.parse_input(val)
+
+    def parse_type_with_framework_name(self, json, framework_name):
+        check_for_required_properties(['name', 'mode'], json, 'type')
+        framework = Framework.fromString(framework_name)
+        if framework is not Frameworks.Global:
+            check_for_required_properties(['header'], json, 'non-global type')
+
+        type_name = json['name']
+        type_mode = TypeMode.fromString(json['mode'])
+        header = json.get('header')
+        enclosing_class = json.get('enclosing_class')
+        enum_values = json.get('values')
+        guarded_enum_values = json.get('guarded_values', {})
+        type_storage = json.get('storage')
+        type_flags = json.get('flags', [])
+        _type = Type(type_name, type_mode, framework, header, enclosing_class, enum_values, guarded_enum_values, type_storage, type_flags)
+        if _type.is_enum() or _type.is_enum_class():
+            check_for_required_properties(['values'], json, 'enum')
+            if not isinstance(json['values'], list) or len(_type.values) == 0:
+                raise ParseException(&quot;Malformed specification: enum %s does not supply a list of values&quot; % type_name)
+
+            if _type.is_enum() and &quot;storage&quot; not in json:
+                raise ParseException(&quot;Could not parse enum %s: C-style enums must also specify their storage type so they can be forward declared.&quot; % type_name)
+
+        self.types.append(_type)
+
+    def parse_input(self, json):
+        check_for_required_properties(['name', 'description', 'queue', 'members'], json, 'input')
+        _input = Input(json['name'], json['description'], json['queue'], json.get('flags', []), json.get('guard'))
+        if isinstance(json['members'], list):
+            for member in json['members']:
+                check_for_required_properties(['name', 'type'], member, 'member')
+                _input.members.append(InputMember(member['name'], member['type'], member.get('flags', [])))
+
+        self.inputs.append(_input)
+
+    # Types cannot (yet) reference other types, so we can check references in one pass.
+    def resolve_types(self):
+        for _type in self.types:
+            self.typecheck_type(_type)
+
+        for _input in self.inputs:
+            self.typecheck_input(_input)
+
+    def typecheck_type(self, _type):
+        log.debug(&quot;typecheck type &quot; + _type.type_name())
+
+        if _type.type_name() in self.types_by_name:
+            raise TypecheckException(&quot;Duplicate type with name: &quot; + _type.type_name())
+
+        self.types_by_name[_type.type_name()] = _type
+
+    def typecheck_input(self, _input):
+        log.debug(&quot;typecheck input &quot; + _input.name)
+
+        if _input.name in self.inputs_by_name:
+            raise TypecheckException(&quot;Duplicate input with name: &quot; + _input.name)
+
+        seen_members = {}
+
+        for member in _input.members:
+            if member.memberName in seen_members:
+                raise TypecheckException(&quot;Duplicate input member with name: &quot; + member.memberName)
+
+            self.typecheck_input_member(member, _input)
+            seen_members[member.memberName] = member
+
+        self.inputs_by_name[_input.name] = _input
+
+    def typecheck_input_member(self, input_member, _input):
+        log.debug(&quot;typecheck member '%s' of '%s'&quot; % (input_member.memberName, _input.name))
+
+        if not input_member.typeName in self.types_by_name:
+            raise TypecheckException(&quot;Unknown type '%s' referenced by member '%s' of input '%s'&quot; % (input_member.typeName, input_member.memberName, _input.name))
+
+
+# A writer that only updates file if it actually changed.
+class IncrementalFileWriter:
+    def __init__(self, filepath, force_output):
+        self._filepath = filepath
+        self._output = &quot;&quot;
+        self.force_output = force_output
+
+    def write(self, text):
+        self._output += text
+
+    def close(self):
+        text_changed = True
+        self._output = self._output.rstrip() + &quot;\n&quot;
+
+        try:
+            read_file = open(self._filepath, &quot;r&quot;)
+            old_text = read_file.read()
+            read_file.close()
+            text_changed = old_text != self._output
+        except:
+            # Ignore, just overwrite by default
+            pass
+
+        if text_changed or self.force_output:
+            out_file = open(self._filepath, &quot;w&quot;)
+            out_file.write(self._output)
+            out_file.close()
+
+
+def wrap_with_guard(contents, condition=None):
+    if condition is None:
+        return contents
+
+    return &quot;\n&quot;.join([
+        &quot;#if %s&quot; % condition,
+        contents,
+        &quot;#endif // %s&quot; % condition
+    ])
+
+
+class Generator:
+    def __init__(self, model, target_framework_name, input_filepath, output_prefix):
+        self._model = model
+        self.target_framework = Framework.fromString(target_framework_name)
+        self.traits_framework = Framework.fromString(self.setting('traitsFrameworkName'))
+        self._input_filepath = input_filepath
+        self._output_prefix = output_prefix
+
+    def setting(self, key, default=''):
+        return self.target_framework.setting(key, GLOBAL_CONFIG.get(key, default))
+
+    # This does not account for any filename mangling performed on behalf of the test harness.
+    def output_filename(self, extension=None):
+        components = []
+        if len(self._output_prefix) &gt; 0:
+            components.extend([self._output_prefix, '-'])
+
+        components.extend([self.setting('prefix'), self.setting('baseFilename')])
+
+        if extension is not None:
+            components.extend(['.', extension])
+
+        return &quot;&quot;.join(components)
+
+    def write_output_files(self, _dir, force=False):
+        header_file = IncrementalFileWriter(os.path.join(_dir, self.output_filename('h')), force)
+        implementation_file = IncrementalFileWriter(os.path.join(_dir, self.output_filename('cpp')), force)
+
+        header_file.write(self.generate_header())
+        implementation_file.write(self.generate_implementation())
+
+        header_file.close()
+        implementation_file.close()
+
+    def generate_header(self):
+        template_arguments = {
+            'licenseBlock': self.generate_license(),
+            'headerGuard': re.sub('[-./]', '_', self.output_filename() + &quot;.h&quot;),
+            'filename': self.output_filename(),
+            'guardCondition': self.setting('guardCondition'),
+            'traitsNamespace': self.traits_framework.setting('namespace'),
+            'inputsNamespace': self.target_framework.setting('namespace'),
+            'includes': self.generate_includes(defaults=self.setting('headerIncludes')),
+            'typeForwardDeclarations': self.generate_type_forward_declarations(),
+            'inputForwardDeclarations': &quot;\n&quot;.join([wrap_with_guard(&quot;class %s;&quot;, _input.guard) % _input.name for _input in self._model.inputs]),
+            'inputClassDeclarations': &quot;\n\n&quot;.join([self.generate_class_declaration(_input) for _input in self._model.inputs]),
+            'inputTraitDeclarations': &quot;\n\n&quot;.join([self.generate_input_trait_declaration(_input) for _input in self._model.inputs]),
+            'enumTraitDeclarations': &quot;\n\n&quot;.join([self.generate_enum_trait_declaration(_type) for _type in self._model.enum_types()]),
+            'forEachMacro': self.generate_for_each_macro(),
+        }
+
+        return Template(Templates.HeaderSkeleton).substitute(template_arguments)
+
+    def generate_implementation(self):
+        template_arguments = {
+            'licenseBlock': self.generate_license(),
+            'filename': self.output_filename(),
+            'guardCondition': self.setting('guardCondition'),
+            'traitsNamespace': self.traits_framework.setting('namespace'),
+            'inputsNamespace': self.target_framework.setting('namespace'),
+            'includes': self.generate_includes(defaults=self.setting('implIncludes'), includes_for_types=True),
+            'inputClassImplementations': &quot;\n\n&quot;.join([self.generate_class_implementation(_input) for _input in self._model.inputs]),
+            'inputTraitImplementations': &quot;\n\n&quot;.join([self.generate_input_trait_implementation(_input) for _input in self._model.inputs]),
+            'enumTraitImplementations': &quot;\n\n&quot;.join([self.generate_enum_trait_implementation(_type) for _type in self._model.enum_types()]),
+        }
+
+        return Template(Templates.ImplementationSkeleton).substitute(template_arguments)
+
+    def generate_license(self):
+        return Template(Templates.CopyrightBlock).substitute(None, inputFilename=os.path.basename(self._input_filepath))
+
+    def generate_includes(self, defaults=[], includes_for_types=False):
+        lines = set()
+
+        for _type in self._model.types:
+            # Types in the &quot;global&quot; framework are implicitly declared and available in all namespaces.
+            if _type.framework is Frameworks.Global:
+                continue
+            # For RefCounted types, we reverse when to include the header so that the destructor can be
+            # used in the header file. Enums within classes cannot be forward declared, so we include
+            # headers with the relevant class declaration.
+            include_for_destructor = _type.mode is TypeModes.SHARED
+            include_for_enclosing_class = _type.is_enum() and _type.enclosing_class is not None
+            if (not includes_for_types) ^ (include_for_destructor or include_for_enclosing_class):
+                continue
+
+            if self.target_framework != _type.framework:
+                lines.add(&quot;#include &lt;%s&gt;&quot; % _type.header)
+            else:
+                lines.add(&quot;#include \&quot;%s\&quot;&quot; % os.path.basename(_type.header))
+
+        for entry in defaults:
+            (allowed_framework_names, data) = entry
+            (framework_name, header_path) = data
+
+            if self.target_framework.name not in allowed_framework_names:
+                continue
+            if self.target_framework.name != framework_name:
+                lines.add(&quot;#include &lt;%s&gt;&quot; % header_path)
+            else:
+                lines.add(&quot;#include \&quot;%s\&quot;&quot; % os.path.basename(header_path))
+
+        return &quot;\n&quot;.join(sorted(list(lines)))
+
+    def generate_type_forward_declarations(self):
+        lines = []
+
+        decls_by_framework = {}
+        frameworks = [Framework.fromString(s) for s in FRAMEWORK_CONFIG_MAP.keys() if s != Frameworks.Global.name]
+        for framework in frameworks:
+            decls_by_framework[framework] = []
+
+        for _type in self._model.types:
+            if _type.framework not in frameworks:
+                continue
+            if _type.enclosing_class is not None:
+                continue
+            if _type.is_enum():
+                declaration = &quot;enum %s : %s;&quot; % (_type.type_name(), _type.underlying_storage)
+            else:
+                declaration = &quot;%s %s;&quot; % (_type.declaration_kind(), _type.type_name())
+            decls_by_framework[_type.framework].append(declaration)
+
+        # Declare all namespaces explicitly, even if it's the main namespace.
+        for framework in frameworks:
+            if len(decls_by_framework[framework]) == 0:
+                continue
+
+            decls_by_framework[framework].sort()
+            lines.append(&quot;namespace %s {&quot; % framework.setting('namespace'))
+            lines.extend(decls_by_framework[framework])
+            lines.append(&quot;}&quot;)
+            lines.append(&quot;&quot;)
+
+        return &quot;\n&quot;.join(lines)
+
+    def generate_class_declaration(self, _input):
+        extra_declarations = []
+        if _input.queue == InputQueues.EVENT_LOOP:
+            extra_declarations.extend([
+                &quot;&quot;,
+                &quot;    // EventLoopInput API&quot;,
+                &quot;    virtual void dispatch(ReplayController&amp;) override final;&quot;,
+            ])
+
+            if _input.setting('CREATE_FROM_PAGE'):
+                extra_declarations.extend([
+                    &quot;    static std::unique_ptr&lt;%s&gt; createFromPage(const Page&amp;);&quot; % _input.name
+                ])
+
+        member_getters = [self.generate_input_member_getter(_member) for _member in _input.members]
+
+        member_declarations = [self.generate_input_member_declaration(_member) for _member in _input.members]
+        if len(member_declarations) &gt; 0:
+            member_declarations.insert(0, &quot;private:&quot;)
+
+        template_arguments = {
+            'inputConstructor': self.generate_input_constructor_declaration(_input),
+            'inputDestructor': self.generate_input_destructor_declaration(_input),
+            'inputName': _input.name,
+            'inputQueue': _input.setting('enumValue'),
+            'baseClass': _input.setting('baseClass') % _input.name,
+            'extraDeclarations': &quot;\n&quot;.join(extra_declarations),
+            'memberGetters': &quot;\n&quot;.join(member_getters),
+            'memberDeclarations': &quot;\n&quot;.join(member_declarations),
+        }
+
+        return wrap_with_guard(Template(Templates.InputClassDeclaration).substitute(template_arguments), _input.guard)
+
+    def generate_input_constructor_declaration(self, _input):
+        formals_list = self.generate_constructor_formals_list(_input)
+        terms = []
+        if self.setting('exportMacro'):
+            terms.append(self.setting('exportMacro'))
+        terms.append(&quot;%s(%s)&quot; % (_input.name, formals_list))
+        return &quot;    %s;&quot; % &quot; &quot;.join(terms)
+
+    def generate_input_destructor_declaration(self, _input):
+        return &quot;    virtual ~%s();&quot; % _input.name
+
+    def generate_input_member_getter(self, _member):
+        member_type = self._model.get_type_for_member(_member)
+        return &quot;    %s %s() const { return %s; }&quot; % (member_type.borrow_type(), _member.memberName, self.generate_member_borrow_expression(_member))
+
+    def generate_input_member_declaration(self, _member):
+        member_type = self._model.get_type_for_member(_member)
+        return &quot;    %s m_%s;&quot; % (member_type.storage_type(), _member.memberName)
+
+    def generate_input_member_tuples(self, _input):
+        return [(_member, self._model.get_type_for_member(_member)) for _member in _input.members]
+
+    def qualified_input_name(self, _input):
+        if self.target_framework == self.traits_framework:
+            return _input.name
+        else:
+            return &quot;%s::%s&quot; % (self.target_framework.setting('namespace'), _input.name)
+
+    def generate_input_trait_declaration(self, _input):
+        decl_type = ['struct']
+        if len(self.setting('exportMacro')) &gt; 0:
+            decl_type.append(self.setting('exportMacro'))
+
+        template_arguments = {
+            'structOrClass': &quot; &quot;.join(decl_type),
+            'queueType': _input.queue.setting('enumValue'),
+            'qualifiedInputName': self.qualified_input_name(_input),
+        }
+
+        return wrap_with_guard(Template(Templates.InputTraitsDeclaration).substitute(template_arguments), _input.guard)
+
+    def generate_enum_trait_declaration(self, _type):
+        should_qualify_type = _type.framework != self.traits_framework
+        template = Templates.EnumTraitDeclaration if _type.is_enum() else Templates.EnumClassTraitDeclaration
+        template_arguments = {
+            'enumName': _type.type_name(qualified=should_qualify_type),
+        }
+        return Template(template).substitute(template_arguments)
+
+    def generate_for_each_macro(self):
+        macro_name = &quot;%s_REPLAY_INPUT_NAMES_FOR_EACH&quot; % self.setting('prefix').upper()
+        lines = []
+        lines.append(&quot;#define %s(macro) \\&quot; % macro_name)
+        lines.extend([&quot;    macro(%s) \\&quot; % _input.name for _input in self._model.inputs])
+        lines.append(&quot;    \\&quot;)
+        lines.append(&quot;// end of %s&quot; % macro_name)
+        return &quot;\n&quot;.join(lines)
+
+    def generate_class_implementation(self, _input):
+        template_arguments = {
+            'inputName': _input.name,
+            'inputsNamespace': self.target_framework.setting('namespace'),
+            'initializerList': self.generate_constructor_initializer_list(_input),
+            'constructorFormalsList': self.generate_constructor_formals_list(_input),
+        }
+
+        return wrap_with_guard(Template(Templates.InputClassImplementation).substitute(template_arguments), _input.guard)
+
+    def generate_enum_trait_implementation(self, _type):
+        should_qualify_type = _type.framework != self.traits_framework
+        prefix_components = []
+        if should_qualify_type:
+            prefix_components.append(_type.framework.setting('namespace'))
+        if _type.is_enum_class():
+            prefix_components.append(_type.type_name())
+        if _type.enclosing_class is not None:
+            prefix_components.append(_type.enclosing_class)
+        prefix_components.append(&quot;&quot;)
+        enum_prefix = &quot;::&quot;.join(prefix_components)
+        encodeLines = []
+
+        if _type.is_enum():
+            encode_template = Templates.EnumEncodeCase
+            decode_template = Templates.EnumDecodeCase
+            enum_trait_template = Templates.EnumTraitImplementation
+        else:
+            encode_template = Templates.EnumClassEncodeCase
+            decode_template = Templates.EnumClassDecodeCase
+            enum_trait_template = Templates.EnumClassTraitImplementation
+
+        # Generate body for encode.
+        for _value in _type.values:
+            template_arguments = {
+                'enumStringValue': _value,
+                'qualifiedEnumValue': &quot;%s%s&quot; % (enum_prefix, _value),
+            }
+            encodeLines.append(Template(encode_template).substitute(template_arguments))
+
+        for guard, guard_values in _type.guard_values_map.iteritems():
+            guardedLines = []
+            for guard_value in guard_values:
+                template_arguments = {
+                    'enumStringValue': guard_value,
+                    'qualifiedEnumValue': &quot;%s%s&quot; % (enum_prefix, guard_value),
+                }
+                guardedLines.append(Template(encode_template).substitute(template_arguments))
+            encodeLines.append(wrap_with_guard(&quot;\n&quot;.join(guardedLines), guard))
+
+        # Generate body for decode.
+        decodeLines = []
+        for _value in _type.values:
+            template_arguments = {
+                'enumStringValue': _value,
+                'qualifiedEnumValue': &quot;%s%s&quot; % (enum_prefix, _value),
+                'qualifiedEnumName': _type.type_name(qualified=should_qualify_type)
+            }
+            decodeLines.append(Template(decode_template).substitute(template_arguments))
+
+        for guard, guard_values in _type.guard_values_map.iteritems():
+            guardedLines = []
+            for guard_value in guard_values:
+                template_arguments = {
+                    'enumStringValue': guard_value,
+                    'qualifiedEnumValue': &quot;%s%s&quot; % (enum_prefix, guard_value),
+                    'qualifiedEnumName': _type.type_name(qualified=should_qualify_type)
+                }
+                guardedLines.append(Template(decode_template).substitute(template_arguments))
+            decodeLines.append(wrap_with_guard(&quot;\n&quot;.join(guardedLines), guard))
+
+        template_arguments = {
+            'enumName': _type.type_name(qualified=should_qualify_type),
+            'encodeCases': &quot;\n&quot;.join(encodeLines),
+            'decodeCases': &quot;\n&quot;.join(decodeLines)
+        }
+
+        return Template(enum_trait_template).substitute(template_arguments)
+
+    def generate_input_trait_implementation(self, _input):
+        template_arguments = {
+            'inputsNamespace': self.target_framework.setting('namespace'),
+            'inputTypeImplementation': Template(self.setting('inputTypeTemplate')).substitute(None, inputName=_input.name),
+            'qualifiedInputName': self.qualified_input_name(_input),
+            'constructorArguments': self.generate_constructor_arguments_list(_input),
+            'constructorFormalsList': self.generate_constructor_formals_list(_input),
+            'encodeSteps': self.generate_input_encode_implementation(_input),
+            'decodeSteps': self.generate_input_decode_implementation(_input),
+        }
+        return wrap_with_guard(Template(Templates.InputTraitsImplementation).substitute(template_arguments), _input.guard)
+
+    def generate_input_encode_implementation(self, _input):
+        steps = []
+        for (_member, _type) in self.generate_input_member_tuples(_input):
+            should_qualify_type = _type.framework != self.traits_framework
+            put_method = &quot;put&lt;%s&gt;&quot; % _type.type_name(qualified=should_qualify_type)
+
+            steps.extend([
+                &quot;    encodedValue.%s(ASCIILiteral(\&quot;%s\&quot;), input.%s());&quot; % (put_method, _member.memberName, _member.memberName)
+            ])
+
+        if len(steps) == 0:
+            steps.extend([
+                &quot;    UNUSED_PARAM(encodedValue);&quot;,
+                &quot;    UNUSED_PARAM(input);&quot;,
+            ])
+
+        return &quot;\n&quot;.join(steps)
+
+    def generate_input_decode_implementation(self, _input):
+        steps = []
+        for (_member, _type) in self.generate_input_member_tuples(_input):
+            should_qualify_type = _type.framework != self.traits_framework
+            get_method = &quot;get&lt;%s&gt;&quot; % _type.type_name(qualified=should_qualify_type)
+
+            lines = [
+                &quot;    %s %s;&quot; % (_type.storage_type(qualified=should_qualify_type), _member.memberName),
+                &quot;    if (!encodedValue.%s(ASCIILiteral(\&quot;%s\&quot;), %s))&quot; % (get_method, _member.memberName, _member.memberName),
+                &quot;        return false;&quot;,
+                &quot;&quot;
+            ]
+
+            steps.append(&quot;\n&quot;.join(lines))
+
+        if len(steps) == 0:
+            steps.extend([
+                &quot;    UNUSED_PARAM(encodedValue);&quot;,
+            ])
+
+        return &quot;\n&quot;.join(steps)
+
+    def generate_constructor_initializer_list(self, _input):
+        initializers = []
+        initializers.append(&quot;    : %s()&quot; % (_input.setting('baseClass') % _input.name))
+        for _member in _input.members:
+            initializers.append(&quot;    , m_%s(%s)&quot; % (_member.memberName, self.generate_member_move_expression(_member)))
+
+        return &quot;\n&quot;.join(initializers)
+
+    def generate_constructor_formals_list(self, _input):
+        member_tuples = self.generate_input_member_tuples(_input)
+        return &quot;, &quot;.join([&quot;%s %s&quot; % (_type.argument_type(), _member.memberName) for (_member, _type) in member_tuples])
+
+    def generate_member_borrow_expression(self, _member):
+        _type = self._model.get_type_for_member(_member)
+        expression = &quot;m_%s&quot; % _member.memberName
+        if _type.mode == TypeModes.OWNED:
+            expression = &quot;*&quot; + expression
+
+        return expression
+
+    def generate_member_move_expression(self, _member):
+        _type = self._model.get_type_for_member(_member)
+        if _type.mode == TypeModes.OWNED:
+            return &quot;std::move(%s)&quot; % _member.memberName
+        else:
+            return _member.memberName
+
+    def generate_constructor_arguments_list(self, _input):
+        return &quot;, &quot;.join([self.generate_member_move_expression(_member) for _member in _input.members])
+
+
+def generate_from_specification(input_filepath=None, output_prefix=&quot;&quot;, output_dirpath=None, framework_name=None, force_output=False):
+    try:
+        with open(input_filepath, &quot;r&quot;) as input_file:
+            parsed_json = json.load(input_file)
+    except ValueError as e:
+        raise Exception(&quot;Error parsing valid JSON in file: &quot; + input_filepath)
+
+    if not framework_name in FRAMEWORK_CONFIG_MAP:
+        raise ParseException(&quot;Unknown or unsupported framework name supplied: &quot; + framework_name)
+
+    model = InputsModel(parsed_json)
+    model.resolve_types()
+    generator = Generator(model, framework_name, input_filepath, output_prefix)
+
+    generator.write_output_files(output_dirpath, force_output)
+
+
+if __name__ == '__main__':
+    allowed_framework_names = FRAMEWORK_CONFIG_MAP.keys()
+
+    cli_parser = optparse.OptionParser(usage=&quot;usage: %prog [options] &lt;Inputs.json&gt;&quot;)
+    cli_parser.add_option(&quot;-o&quot;, &quot;--outputDir&quot;, help=&quot;Directory where generated files should be written.&quot;)
+    cli_parser.add_option(&quot;--framework&quot;, type=&quot;choice&quot;, choices=allowed_framework_names, help=&quot;The framework these inputs belong to.&quot;)  # JavaScriptCore, WebCore
+    cli_parser.add_option(&quot;--force&quot;, action=&quot;store_true&quot;, help=&quot;Force output of generated scripts, even if nothing changed.&quot;)
+    cli_parser.add_option(&quot;-v&quot;, &quot;--debug&quot;, action=&quot;store_true&quot;, help=&quot;Log extra output for debugging the generator itself.&quot;)
+    cli_parser.add_option(&quot;-t&quot;, &quot;--test&quot;, action=&quot;store_true&quot;, help=&quot;Enable test mode. Use unique output filenames created by prepending the input filename.&quot;)
+
+    options = None
+
+    arg_options, arg_values = cli_parser.parse_args()
+    if (len(arg_values) &lt; 1):
+        raise ParseException(&quot;At least one plain argument expected&quot;)
+
+    if not arg_options.outputDir:
+        raise ParseException(&quot;Missing output directory&quot;)
+
+    if arg_options.debug:
+        log.setLevel(logging.DEBUG)
+
+    options = {
+        'input_filepath': arg_values[0],
+        'output_dirpath': arg_options.outputDir,
+        'output_prefix': os.path.basename(arg_values[0]) if arg_options.test else &quot;&quot;,
+        'framework_name': arg_options.framework,
+        'force_output': arg_options.force
+    }
+
+    try:
+        generate_from_specification(**options)
+    except (ParseException, TypecheckException) as e:
+        if arg_options.test:
+            log.error(e.message)
+        else:
+            raise e  # Force the build to fail.
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptsCodeGeneratorReplayInputsTemplatespy"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,243 @@
</span><ins>+#!/usr/bin/env python
+# Copyright (c) 2011 Google Inc. All rights reserved.
+# Copyright (c) 2012 Intel Corporation. All rights reserved.
+# Copyright (c) 2013, 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Generator templates, which can be filled with string.Template.
+# Following are classes that fill the templates from the typechecked model.
+
+class Templates:
+    CopyrightBlock = (
+    &quot;&quot;&quot;/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from ${inputFilename}
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py&quot;&quot;&quot;)
+
+    HeaderSkeleton = (
+    &quot;&quot;&quot;${licenseBlock}
+
+#ifndef ${headerGuard}
+#define ${headerGuard}
+
+#if ${guardCondition}
+${includes}
+
+${typeForwardDeclarations}
+
+namespace ${inputsNamespace} {
+${inputForwardDeclarations}
+} // namespace ${inputsNamespace}
+
+namespace ${traitsNamespace} {
+${inputTraitDeclarations}
+${enumTraitDeclarations}
+} // namespace ${traitsNamespace}
+
+namespace ${inputsNamespace} {
+${inputClassDeclarations}
+} // namespace ${inputsNamespace}
+
+${forEachMacro}
+
+#endif // ${guardCondition}
+
+#endif // ${filename}_h
+&quot;&quot;&quot;)
+
+    InputTraitsDeclaration = (
+    &quot;&quot;&quot;template&lt;&gt; ${structOrClass} InputTraits&lt;${qualifiedInputName}&gt; {
+    static InputQueue queue() { return InputQueue::${queueType}; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const ${qualifiedInputName}&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;${qualifiedInputName}&gt;&amp;);
+};&quot;&quot;&quot;)
+
+    EnumTraitDeclaration = (
+    &quot;&quot;&quot;template&lt;&gt; struct EncodingTraits&lt;${enumName}&gt; {
+    typedef ${enumName} DecodedType;
+
+    static EncodedValue encodeValue(const ${enumName}&amp; value);
+    static bool decodeValue(EncodedValue&amp;, ${enumName}&amp; value);
+};&quot;&quot;&quot;)
+
+    EnumClassTraitDeclaration = (
+    &quot;&quot;&quot;template&lt;&gt; struct EncodingTraits&lt;${enumName}&gt; {
+    typedef ${enumName} DecodedType;
+
+    static EncodedValue encodeValue(const ${enumName}&amp; value);
+    static bool decodeValue(EncodedValue&amp;, ${enumName}&amp; value);
+};&quot;&quot;&quot;)
+
+    InputClassDeclaration = (
+    &quot;&quot;&quot;class ${inputName} : public ${baseClass} {
+public:
+${inputConstructor}
+${inputDestructor}
+${extraDeclarations}
+${memberGetters}
+${memberDeclarations}
+};&quot;&quot;&quot;)
+
+    ImplementationSkeleton = (
+    &quot;&quot;&quot;${licenseBlock}
+
+#include &quot;config.h&quot;
+#include &quot;${filename}.h&quot;
+
+#if ${guardCondition}
+${includes}
+
+namespace ${inputsNamespace} {
+${inputClassImplementations}
+} // namespace ${inputsNamespace}
+
+namespace ${traitsNamespace} {
+${inputTraitImplementations}
+${enumTraitImplementations}
+} // namespace ${traitsNamespace}
+
+#endif // ${guardCondition}
+&quot;&quot;&quot;)
+
+    InputTraitsImplementation = (
+    &quot;&quot;&quot;const AtomicString&amp; InputTraits&lt;${qualifiedInputName}&gt;::type()
+{
+$inputTypeImplementation
+}
+
+void InputTraits&lt;${qualifiedInputName}&gt;::encode(EncodedValue&amp; encodedValue, const ${qualifiedInputName}&amp; input)
+{
+${encodeSteps}
+}
+
+bool InputTraits&lt;${qualifiedInputName}&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;${qualifiedInputName}&gt;&amp; input)
+{
+${decodeSteps}
+    input = std::make_unique&lt;${qualifiedInputName}&gt;(${constructorArguments});
+    return true;
+}&quot;&quot;&quot;)
+
+    EnumClassTraitImplementation = (
+    &quot;&quot;&quot;EncodedValue EncodingTraits&lt;${enumName}&gt;::encodeValue(const ${enumName}&amp; enumValue)
+{
+    switch (enumValue) {
+${encodeCases}
+    default: ASSERT_NOT_REACHED(); return EncodedValue::createString(&quot;Error!&quot;);
+    }
+}
+
+bool EncodingTraits&lt;${enumName}&gt;::decodeValue(EncodedValue&amp; encodedValue, ${enumName}&amp; enumValue)
+{
+    String enumString = encodedValue.convertTo&lt;String&gt;();
+${decodeCases}
+    return false;
+}&quot;&quot;&quot;)
+
+    EnumClassEncodeCase = (
+    &quot;&quot;&quot;    case ${qualifiedEnumValue}: return EncodedValue::createString(&quot;${enumStringValue}&quot;);&quot;&quot;&quot;)
+
+    EnumClassDecodeCase = (
+    &quot;&quot;&quot;    if (enumString == &quot;${enumStringValue}&quot;) {
+        enumValue = ${qualifiedEnumValue};
+        return true;
+    }&quot;&quot;&quot;)
+
+    EnumTraitImplementation = (
+    &quot;&quot;&quot;EncodedValue EncodingTraits&lt;${enumName}&gt;::encodeValue(const ${enumName}&amp; enumValue)
+{
+    EncodedValue encodedValue = EncodedValue::createArray();
+${encodeCases}
+    return encodedValue;
+}
+
+bool EncodingTraits&lt;${enumName}&gt;::decodeValue(EncodedValue&amp; encodedValue, ${enumName}&amp; enumValue)
+{
+    Vector&lt;String&gt; enumStrings;
+    if (!EncodingTraits&lt;Vector&lt;String&gt;&gt;::decodeValue(encodedValue, enumStrings))
+        return false;
+
+    for (String enumString : enumStrings) {
+${decodeCases}
+    }
+
+    return true;
+}&quot;&quot;&quot;)
+
+    EnumEncodeCase = (
+    &quot;&quot;&quot;    if (enumValue &amp; ${qualifiedEnumValue}) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;${enumStringValue}&quot;));
+        if (enumValue == ${qualifiedEnumValue})
+            return encodedValue;
+    }&quot;&quot;&quot;)
+
+    EnumDecodeCase = (
+    &quot;&quot;&quot;        if (enumString == &quot;${enumStringValue}&quot;)
+            enumValue = static_cast&lt;${qualifiedEnumName}&gt;(enumValue | ${qualifiedEnumValue});&quot;&quot;&quot;)
+
+    InputTypeFromStaticLocal = (
+    &quot;&quot;&quot;    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;${inputName}&quot;, AtomicString::ConstructFromLiteral);
+    return type;&quot;&quot;&quot;)
+
+    InputTypeFromThreadLocal = &quot;    return WebCore::inputTypes().${inputName};&quot;
+
+    InputClassImplementation = (
+    &quot;&quot;&quot;${inputName}::${inputName}(${constructorFormalsList})
+${initializerList}
+{
+}
+
+${inputName}::~${inputName}()
+{
+}&quot;&quot;&quot;)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailoncstyleenumnostoragejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Could not parse enum MouseButton: C-style enums must also specify their storage type so they can be forward declared.
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonduplicateinputnamesjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Duplicate input with name: GetCurrentTime
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonduplicatetypenamesjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Duplicate type with name: uint64_t
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonenumtypemissingvaluesjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing enum, required property missing: values
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputmembernamejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing member, required property missing: name
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputnamejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-name.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-name.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-name.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing input, required property missing: name
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissinginputqueuejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-queue.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-queue.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-input-queue.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing input, required property missing: queue
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissingtypemodejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-mode.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-mode.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-mode.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing type, required property missing: mode
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonmissingtypenamejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-name.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-name.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-missing-type-name.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing type, required property missing: name
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonnoinputsjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-inputs.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-inputs.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-inputs.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing toplevel, required property missing: inputs
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonnotypesjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-types.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-types.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-no-types.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: When parsing toplevel, required property missing: types
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknowninputqueuejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Unknown input queue: SCRIPT_MEOIZED
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknownmembertypejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-member-type.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-member-type.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-member-type.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Unknown type 'double' referenced by member 'randomSeed' of input 'SetRandomSeed'
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedfailonunknowntypemodejsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Unknown type mode: BONKERS
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelperswithguardedvaluesjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,147 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-enum-encoding-helpers-with-guarded-values.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+#include &lt;platform/PlatformMouseEvent.h&gt;
+
+namespace Test {
+SavedMouseButton::SavedMouseButton(MouseButton button)
+    : NondeterministicInput&lt;SavedMouseButton&gt;()
+    , m_button(button)
+{
+}
+
+SavedMouseButton::~SavedMouseButton()
+{
+}
+} // namespace Test
+
+namespace JSC {
+const AtomicString&amp; InputTraits&lt;Test::SavedMouseButton&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;SavedMouseButton&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::SavedMouseButton&gt;::encode(EncodedValue&amp; encodedValue, const Test::SavedMouseButton&amp; input)
+{
+    encodedValue.put&lt;WebCore::MouseButton&gt;(ASCIILiteral(&quot;button&quot;), input.button());
+}
+
+bool InputTraits&lt;Test::SavedMouseButton&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::SavedMouseButton&gt;&amp; input)
+{
+    WebCore::MouseButton button;
+    if (!encodedValue.get&lt;WebCore::MouseButton&gt;(ASCIILiteral(&quot;button&quot;), button))
+        return false;
+
+    input = std::make_unique&lt;Test::SavedMouseButton&gt;(button);
+    return true;
+}
+EncodedValue EncodingTraits&lt;WebCore::MouseButton&gt;::encodeValue(const WebCore::MouseButton&amp; enumValue)
+{
+    EncodedValue encodedValue = EncodedValue::createArray();
+    if (enumValue &amp; WebCore::NoButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;NoButton&quot;));
+        if (enumValue == WebCore::NoButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::LeftButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;LeftButton&quot;));
+        if (enumValue == WebCore::LeftButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::MiddleButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;MiddleButton&quot;));
+        if (enumValue == WebCore::MiddleButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::RightButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;RightButton&quot;));
+        if (enumValue == WebCore::RightButton)
+            return encodedValue;
+    }
+#if ENABLE(SIDE_BUTTONS)
+    if (enumValue &amp; WebCore::LeftSideButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;LeftSideButton&quot;));
+        if (enumValue == WebCore::LeftSideButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::RightSideButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;RightSideButton&quot;));
+        if (enumValue == WebCore::RightSideButton)
+            return encodedValue;
+    }
+#endif // ENABLE(SIDE_BUTTONS)
+#if PLATFORM(WINDOWS)
+    if (enumValue &amp; WebCore::WindowsButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;WindowsButton&quot;));
+        if (enumValue == WebCore::WindowsButton)
+            return encodedValue;
+    }
+#endif // PLATFORM(WINDOWS)
+    return encodedValue;
+}
+
+bool EncodingTraits&lt;WebCore::MouseButton&gt;::decodeValue(EncodedValue&amp; encodedValue, WebCore::MouseButton&amp; enumValue)
+{
+    Vector&lt;String&gt; enumStrings;
+    if (!EncodingTraits&lt;Vector&lt;String&gt;&gt;::decodeValue(encodedValue, enumStrings))
+        return false;
+
+    for (String enumString : enumStrings) {
+        if (enumString == &quot;NoButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::NoButton);
+        if (enumString == &quot;LeftButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::LeftButton);
+        if (enumString == &quot;MiddleButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::MiddleButton);
+        if (enumString == &quot;RightButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::RightButton);
+#if ENABLE(SIDE_BUTTONS)
+        if (enumString == &quot;LeftSideButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::LeftSideButton);
+        if (enumString == &quot;RightSideButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::RightSideButton);
+#endif // ENABLE(SIDE_BUTTONS)
+#if PLATFORM(WINDOWS)
+        if (enumString == &quot;WindowsButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::WindowsButton);
+#endif // PLATFORM(WINDOWS)
+    }
+
+    return true;
+}
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelperswithguardedvaluesjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-enum-encoding-helpers-with-guarded-values.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_enum_encoding_helpers_with_guarded_values_json_TestReplayInputs_h
+#define generate_enum_encoding_helpers_with_guarded_values_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+namespace WebCore {
+enum MouseButton : unsigned;
+}
+
+
+namespace Test {
+class SavedMouseButton;
+} // namespace Test
+
+namespace JSC {
+template&lt;&gt; struct InputTraits&lt;Test::SavedMouseButton&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::SavedMouseButton&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::SavedMouseButton&gt;&amp;);
+};
+template&lt;&gt; struct EncodingTraits&lt;WebCore::MouseButton&gt; {
+    typedef WebCore::MouseButton DecodedType;
+
+    static EncodedValue encodeValue(const WebCore::MouseButton&amp; value);
+    static bool decodeValue(EncodedValue&amp;, WebCore::MouseButton&amp; value);
+};
+} // namespace JSC
+
+namespace Test {
+class SavedMouseButton : public NondeterministicInput&lt;SavedMouseButton&gt; {
+public:
+    SavedMouseButton(MouseButton button);
+    virtual ~SavedMouseButton();
+
+    MouseButton button() const { return m_button; }
+private:
+    MouseButton m_button;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(SavedMouseButton) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelpersjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,147 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-enum-encoding-helpers.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-enum-encoding-helpers.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+#include &lt;platform/PlatformMouseEvent.h&gt;
+#include &lt;replay/NondeterministicInput.h&gt;
+
+namespace Test {
+SavedMouseButton::SavedMouseButton(MouseButton button)
+    : NondeterministicInput&lt;SavedMouseButton&gt;()
+    , m_button(button)
+{
+}
+
+SavedMouseButton::~SavedMouseButton()
+{
+}
+} // namespace Test
+
+namespace JSC {
+const AtomicString&amp; InputTraits&lt;Test::SavedMouseButton&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;SavedMouseButton&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::SavedMouseButton&gt;::encode(EncodedValue&amp; encodedValue, const Test::SavedMouseButton&amp; input)
+{
+    encodedValue.put&lt;WebCore::MouseButton&gt;(ASCIILiteral(&quot;button&quot;), input.button());
+}
+
+bool InputTraits&lt;Test::SavedMouseButton&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::SavedMouseButton&gt;&amp; input)
+{
+    WebCore::MouseButton button;
+    if (!encodedValue.get&lt;WebCore::MouseButton&gt;(ASCIILiteral(&quot;button&quot;), button))
+        return false;
+
+    input = std::make_unique&lt;Test::SavedMouseButton&gt;(button);
+    return true;
+}
+EncodedValue EncodingTraits&lt;InputQueue&gt;::encodeValue(const InputQueue&amp; enumValue)
+{
+    switch (enumValue) {
+    case InputQueue::EventLoopInput: return EncodedValue::createString(&quot;EventLoopInput&quot;);
+    case InputQueue::LoaderMemoizedData: return EncodedValue::createString(&quot;LoaderMemoizedData&quot;);
+    case InputQueue::ScriptMemoizedData: return EncodedValue::createString(&quot;ScriptMemoizedData&quot;);
+    default: ASSERT_NOT_REACHED(); return EncodedValue::createString(&quot;Error!&quot;);
+    }
+}
+
+bool EncodingTraits&lt;InputQueue&gt;::decodeValue(EncodedValue&amp; encodedValue, InputQueue&amp; enumValue)
+{
+    String enumString = encodedValue.convertTo&lt;String&gt;();
+    if (enumString == &quot;EventLoopInput&quot;) {
+        enumValue = InputQueue::EventLoopInput;
+        return true;
+    }
+    if (enumString == &quot;LoaderMemoizedData&quot;) {
+        enumValue = InputQueue::LoaderMemoizedData;
+        return true;
+    }
+    if (enumString == &quot;ScriptMemoizedData&quot;) {
+        enumValue = InputQueue::ScriptMemoizedData;
+        return true;
+    }
+    return false;
+}
+
+EncodedValue EncodingTraits&lt;WebCore::MouseButton&gt;::encodeValue(const WebCore::MouseButton&amp; enumValue)
+{
+    EncodedValue encodedValue = EncodedValue::createArray();
+    if (enumValue &amp; WebCore::NoButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;NoButton&quot;));
+        if (enumValue == WebCore::NoButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::LeftButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;LeftButton&quot;));
+        if (enumValue == WebCore::LeftButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::MiddleButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;MiddleButton&quot;));
+        if (enumValue == WebCore::MiddleButton)
+            return encodedValue;
+    }
+    if (enumValue &amp; WebCore::RightButton) {
+        encodedValue.append&lt;String&gt;(ASCIILiteral(&quot;RightButton&quot;));
+        if (enumValue == WebCore::RightButton)
+            return encodedValue;
+    }
+    return encodedValue;
+}
+
+bool EncodingTraits&lt;WebCore::MouseButton&gt;::decodeValue(EncodedValue&amp; encodedValue, WebCore::MouseButton&amp; enumValue)
+{
+    Vector&lt;String&gt; enumStrings;
+    if (!EncodingTraits&lt;Vector&lt;String&gt;&gt;::decodeValue(encodedValue, enumStrings))
+        return false;
+
+    for (String enumString : enumStrings) {
+        if (enumString == &quot;NoButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::NoButton);
+        if (enumString == &quot;LeftButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::LeftButton);
+        if (enumString == &quot;MiddleButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::MiddleButton);
+        if (enumString == &quot;RightButton&quot;)
+            enumValue = static_cast&lt;WebCore::MouseButton&gt;(enumValue | WebCore::RightButton);
+    }
+
+    return true;
+}
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateenumencodinghelpersjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,92 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-enum-encoding-helpers.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_enum_encoding_helpers_json_TestReplayInputs_h
+#define generate_enum_encoding_helpers_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+namespace WebCore {
+enum MouseButton : unsigned;
+}
+
+namespace JSC {
+enum class InputQueue;
+}
+
+
+namespace Test {
+class SavedMouseButton;
+} // namespace Test
+
+namespace JSC {
+template&lt;&gt; struct InputTraits&lt;Test::SavedMouseButton&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::SavedMouseButton&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::SavedMouseButton&gt;&amp;);
+};
+template&lt;&gt; struct EncodingTraits&lt;InputQueue&gt; {
+    typedef InputQueue DecodedType;
+
+    static EncodedValue encodeValue(const InputQueue&amp; value);
+    static bool decodeValue(EncodedValue&amp;, InputQueue&amp; value);
+};
+
+template&lt;&gt; struct EncodingTraits&lt;WebCore::MouseButton&gt; {
+    typedef WebCore::MouseButton DecodedType;
+
+    static EncodedValue encodeValue(const WebCore::MouseButton&amp; value);
+    static bool decodeValue(EncodedValue&amp;, WebCore::MouseButton&amp; value);
+};
+} // namespace JSC
+
+namespace Test {
+class SavedMouseButton : public NondeterministicInput&lt;SavedMouseButton&gt; {
+public:
+    SavedMouseButton(MouseButton button);
+    virtual ~SavedMouseButton();
+
+    MouseButton button() const { return m_button; }
+private:
+    MouseButton m_button;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(SavedMouseButton) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-enum-encoding-helpers.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateeventloopshapetypesjsonerror"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-event-loop-shape-types.json-error (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-event-loop-shape-types.json-error                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-event-loop-shape-types.json-error        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+ERROR: Unknown type mode: MAP
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithguardjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,108 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-input-with-guard.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-input-with-guard.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+
+namespace Test {
+#if ENABLE(DUMMY_FEATURE)
+GetCurrentTime::GetCurrentTime(double currentTime)
+    : NondeterministicInput&lt;GetCurrentTime&gt;()
+    , m_currentTime(currentTime)
+{
+}
+
+GetCurrentTime::~GetCurrentTime()
+{
+}
+#endif // ENABLE(DUMMY_FEATURE)
+
+SetRandomSeed::SetRandomSeed(uint64_t randomSeed)
+    : NondeterministicInput&lt;SetRandomSeed&gt;()
+    , m_randomSeed(randomSeed)
+{
+}
+
+SetRandomSeed::~SetRandomSeed()
+{
+}
+} // namespace Test
+
+namespace JSC {
+#if ENABLE(DUMMY_FEATURE)
+const AtomicString&amp; InputTraits&lt;Test::GetCurrentTime&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;GetCurrentTime&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::GetCurrentTime&gt;::encode(EncodedValue&amp; encodedValue, const Test::GetCurrentTime&amp; input)
+{
+    encodedValue.put&lt;double&gt;(ASCIILiteral(&quot;currentTime&quot;), input.currentTime());
+}
+
+bool InputTraits&lt;Test::GetCurrentTime&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::GetCurrentTime&gt;&amp; input)
+{
+    double currentTime;
+    if (!encodedValue.get&lt;double&gt;(ASCIILiteral(&quot;currentTime&quot;), currentTime))
+        return false;
+
+    input = std::make_unique&lt;Test::GetCurrentTime&gt;(currentTime);
+    return true;
+}
+#endif // ENABLE(DUMMY_FEATURE)
+
+const AtomicString&amp; InputTraits&lt;Test::SetRandomSeed&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;SetRandomSeed&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::SetRandomSeed&gt;::encode(EncodedValue&amp; encodedValue, const Test::SetRandomSeed&amp; input)
+{
+    encodedValue.put&lt;uint64_t&gt;(ASCIILiteral(&quot;randomSeed&quot;), input.randomSeed());
+}
+
+bool InputTraits&lt;Test::SetRandomSeed&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::SetRandomSeed&gt;&amp; input)
+{
+    uint64_t randomSeed;
+    if (!encodedValue.get&lt;uint64_t&gt;(ASCIILiteral(&quot;randomSeed&quot;), randomSeed))
+        return false;
+
+    input = std::make_unique&lt;Test::SetRandomSeed&gt;(randomSeed);
+    return true;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithguardjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-input-with-guard.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_input_with_guard_json_TestReplayInputs_h
+#define generate_input_with_guard_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+
+
+namespace Test {
+#if ENABLE(DUMMY_FEATURE)
+class GetCurrentTime;
+#endif // ENABLE(DUMMY_FEATURE)
+class SetRandomSeed;
+} // namespace Test
+
+namespace JSC {
+#if ENABLE(DUMMY_FEATURE)
+template&lt;&gt; struct InputTraits&lt;Test::GetCurrentTime&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::GetCurrentTime&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::GetCurrentTime&gt;&amp;);
+};
+#endif // ENABLE(DUMMY_FEATURE)
+
+template&lt;&gt; struct InputTraits&lt;Test::SetRandomSeed&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::SetRandomSeed&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::SetRandomSeed&gt;&amp;);
+};
+
+} // namespace JSC
+
+namespace Test {
+#if ENABLE(DUMMY_FEATURE)
+class GetCurrentTime : public NondeterministicInput&lt;GetCurrentTime&gt; {
+public:
+    GetCurrentTime(double currentTime);
+    virtual ~GetCurrentTime();
+
+    double currentTime() const { return m_currentTime; }
+private:
+    double m_currentTime;
+};
+#endif // ENABLE(DUMMY_FEATURE)
+
+class SetRandomSeed : public NondeterministicInput&lt;SetRandomSeed&gt; {
+public:
+    SetRandomSeed(uint64_t randomSeed);
+    virtual ~SetRandomSeed();
+
+    uint64_t randomSeed() const { return m_randomSeed; }
+private:
+    uint64_t m_randomSeed;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(GetCurrentTime) \
+    macro(SetRandomSeed) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-input-with-guard.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithvectormembersjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-input-with-vector-members.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-input-with-vector-members.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+#include &lt;things/JSThing.h&gt;
+#include &lt;things/WebThing.h&gt;
+
+namespace Test {
+ArrayOfThings::ArrayOfThings(Vector&lt;double&gt;&amp; doubles, Vector&lt;JSThing&gt;&amp; jsthings, Vector&lt;WebThing&gt;&amp; webthings)
+    : NondeterministicInput&lt;ArrayOfThings&gt;()
+    , m_doubles(doubles)
+    , m_jsthings(jsthings)
+    , m_webthings(webthings)
+{
+}
+
+ArrayOfThings::~ArrayOfThings()
+{
+}
+} // namespace Test
+
+namespace JSC {
+const AtomicString&amp; InputTraits&lt;Test::ArrayOfThings&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;ArrayOfThings&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::ArrayOfThings&gt;::encode(EncodedValue&amp; encodedValue, const Test::ArrayOfThings&amp; input)
+{
+    encodedValue.put&lt;Vector&lt;double&gt;&gt;(ASCIILiteral(&quot;doubles&quot;), input.doubles());
+    encodedValue.put&lt;Vector&lt;JSThing&gt;&gt;(ASCIILiteral(&quot;jsthings&quot;), input.jsthings());
+    encodedValue.put&lt;Vector&lt;WebCore::WebThing&gt;&gt;(ASCIILiteral(&quot;webthings&quot;), input.webthings());
+}
+
+bool InputTraits&lt;Test::ArrayOfThings&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::ArrayOfThings&gt;&amp; input)
+{
+    Vector&lt;double&gt; doubles;
+    if (!encodedValue.get&lt;Vector&lt;double&gt;&gt;(ASCIILiteral(&quot;doubles&quot;), doubles))
+        return false;
+
+    Vector&lt;JSThing&gt; jsthings;
+    if (!encodedValue.get&lt;Vector&lt;JSThing&gt;&gt;(ASCIILiteral(&quot;jsthings&quot;), jsthings))
+        return false;
+
+    Vector&lt;WebCore::WebThing&gt; webthings;
+    if (!encodedValue.get&lt;Vector&lt;WebCore::WebThing&gt;&gt;(ASCIILiteral(&quot;webthings&quot;), webthings))
+        return false;
+
+    input = std::make_unique&lt;Test::ArrayOfThings&gt;(doubles, jsthings, webthings);
+    return true;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputwithvectormembersjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,84 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-input-with-vector-members.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_input_with_vector_members_json_TestReplayInputs_h
+#define generate_input_with_vector_members_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+namespace WebCore {
+class WebThing;
+}
+
+namespace JSC {
+class JSThing;
+}
+
+
+namespace Test {
+class ArrayOfThings;
+} // namespace Test
+
+namespace JSC {
+template&lt;&gt; struct InputTraits&lt;Test::ArrayOfThings&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::ArrayOfThings&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::ArrayOfThings&gt;&amp;);
+};
+
+} // namespace JSC
+
+namespace Test {
+class ArrayOfThings : public NondeterministicInput&lt;ArrayOfThings&gt; {
+public:
+    ArrayOfThings(Vector&lt;double&gt;&amp; doubles, Vector&lt;JSThing&gt;&amp; jsthings, Vector&lt;WebThing&gt;&amp; webthings);
+    virtual ~ArrayOfThings();
+
+    const Vector&lt;double&gt;&amp; doubles() const { return m_doubles; }
+    const Vector&lt;JSThing&gt;&amp; jsthings() const { return m_jsthings; }
+    const Vector&lt;WebThing&gt;&amp; webthings() const { return m_webthings; }
+private:
+    Vector&lt;double&gt; m_doubles;
+    Vector&lt;JSThing&gt; m_jsthings;
+    Vector&lt;WebThing&gt; m_webthings;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(ArrayOfThings) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-input-with-vector-members.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputswithflagsjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-inputs-with-flags.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-inputs-with-flags.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+
+namespace Test {
+ScalarInput1::ScalarInput1(ScalarType data)
+    : NondeterministicInput&lt;ScalarInput1&gt;()
+    , m_data(data)
+{
+}
+
+ScalarInput1::~ScalarInput1()
+{
+}
+
+ScalarInput2::ScalarInput2(ScalarType data)
+    : NondeterministicInput&lt;ScalarInput2&gt;()
+    , m_data(data)
+{
+}
+
+ScalarInput2::~ScalarInput2()
+{
+}
+} // namespace Test
+
+namespace JSC {
+const AtomicString&amp; InputTraits&lt;Test::ScalarInput1&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;ScalarInput1&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::ScalarInput1&gt;::encode(EncodedValue&amp; encodedValue, const Test::ScalarInput1&amp; input)
+{
+    encodedValue.put&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), input.data());
+}
+
+bool InputTraits&lt;Test::ScalarInput1&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::ScalarInput1&gt;&amp; input)
+{
+    ScalarType data;
+    if (!encodedValue.get&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), data))
+        return false;
+
+    input = std::make_unique&lt;Test::ScalarInput1&gt;(data);
+    return true;
+}
+
+const AtomicString&amp; InputTraits&lt;Test::ScalarInput2&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;ScalarInput2&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::ScalarInput2&gt;::encode(EncodedValue&amp; encodedValue, const Test::ScalarInput2&amp; input)
+{
+    encodedValue.put&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), input.data());
+}
+
+bool InputTraits&lt;Test::ScalarInput2&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::ScalarInput2&gt;&amp; input)
+{
+    ScalarType data;
+    if (!encodedValue.get&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), data))
+        return false;
+
+    input = std::make_unique&lt;Test::ScalarInput2&gt;(data);
+    return true;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgenerateinputswithflagsjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,93 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-inputs-with-flags.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_inputs_with_flags_json_TestReplayInputs_h
+#define generate_inputs_with_flags_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+
+
+namespace Test {
+class ScalarInput1;
+class ScalarInput2;
+} // namespace Test
+
+namespace JSC {
+template&lt;&gt; struct InputTraits&lt;Test::ScalarInput1&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::ScalarInput1&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::ScalarInput1&gt;&amp;);
+};
+
+template&lt;&gt; struct InputTraits&lt;Test::ScalarInput2&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::ScalarInput2&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::ScalarInput2&gt;&amp;);
+};
+
+} // namespace JSC
+
+namespace Test {
+class ScalarInput1 : public NondeterministicInput&lt;ScalarInput1&gt; {
+public:
+    ScalarInput1(ScalarType data);
+    virtual ~ScalarInput1();
+
+    ScalarType data() const { return m_data; }
+private:
+    ScalarType m_data;
+};
+
+class ScalarInput2 : public NondeterministicInput&lt;ScalarInput2&gt; {
+public:
+    ScalarInput2(ScalarType data);
+    virtual ~ScalarInput2();
+
+    ScalarType data() const { return m_data; }
+private:
+    ScalarType m_data;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(ScalarInput1) \
+    macro(ScalarInput2) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-inputs-with-flags.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgeneratememoizedtypemodesjsonTestReplayInputscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-memoized-type-modes.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#include &quot;config.h&quot;
+#include &quot;generate-memoized-type-modes.json-TestReplayInputs.h&quot;
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceImplIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceImplIncludeDummy.h&gt;
+
+namespace Test {
+ScalarInput::ScalarInput(ScalarType data)
+    : NondeterministicInput&lt;ScalarInput&gt;()
+    , m_data(data)
+{
+}
+
+ScalarInput::~ScalarInput()
+{
+}
+
+MapInput::MapInput(std::unique_ptr&lt;MapType&gt; data)
+    : NondeterministicInput&lt;MapInput&gt;()
+    , m_data(std::move(data))
+{
+}
+
+MapInput::~MapInput()
+{
+}
+} // namespace Test
+
+namespace JSC {
+const AtomicString&amp; InputTraits&lt;Test::ScalarInput&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;ScalarInput&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::ScalarInput&gt;::encode(EncodedValue&amp; encodedValue, const Test::ScalarInput&amp; input)
+{
+    encodedValue.put&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), input.data());
+}
+
+bool InputTraits&lt;Test::ScalarInput&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::ScalarInput&gt;&amp; input)
+{
+    ScalarType data;
+    if (!encodedValue.get&lt;ScalarType&gt;(ASCIILiteral(&quot;data&quot;), data))
+        return false;
+
+    input = std::make_unique&lt;Test::ScalarInput&gt;(data);
+    return true;
+}
+
+const AtomicString&amp; InputTraits&lt;Test::MapInput&gt;::type()
+{
+    static NeverDestroyed&lt;const AtomicString&gt; type(&quot;MapInput&quot;, AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits&lt;Test::MapInput&gt;::encode(EncodedValue&amp; encodedValue, const Test::MapInput&amp; input)
+{
+    encodedValue.put&lt;MapType&gt;(ASCIILiteral(&quot;data&quot;), input.data());
+}
+
+bool InputTraits&lt;Test::MapInput&gt;::decode(EncodedValue&amp; encodedValue, std::unique_ptr&lt;Test::MapInput&gt;&amp; input)
+{
+    std::unique_ptr&lt;MapType&gt; data;
+    if (!encodedValue.get&lt;MapType&gt;(ASCIILiteral(&quot;data&quot;), data))
+        return false;
+
+    input = std::make_unique&lt;Test::MapInput&gt;(std::move(data));
+    return true;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(WEB_REPLAY)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsexpectedgeneratememoizedtypemodesjsonTestReplayInputsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,93 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+ * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// DO NOT EDIT THIS FILE. It is automatically generated from generate-memoized-type-modes.json
+// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py
+
+#ifndef generate_memoized_type_modes_json_TestReplayInputs_h
+#define generate_memoized_type_modes_json_TestReplayInputs_h
+
+#if ENABLE(WEB_REPLAY)
+#include &quot;InternalNamespaceHeaderIncludeDummy.h&quot;
+#include &lt;platform/ExternalNamespaceHeaderIncludeDummy.h&gt;
+
+
+
+namespace Test {
+class ScalarInput;
+class MapInput;
+} // namespace Test
+
+namespace JSC {
+template&lt;&gt; struct InputTraits&lt;Test::ScalarInput&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::ScalarInput&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::ScalarInput&gt;&amp;);
+};
+
+template&lt;&gt; struct InputTraits&lt;Test::MapInput&gt; {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString&amp; type();
+
+    static void encode(JSC::EncodedValue&amp;, const Test::MapInput&amp;);
+    static bool decode(JSC::EncodedValue&amp;, std::unique_ptr&lt;Test::MapInput&gt;&amp;);
+};
+
+} // namespace JSC
+
+namespace Test {
+class ScalarInput : public NondeterministicInput&lt;ScalarInput&gt; {
+public:
+    ScalarInput(ScalarType data);
+    virtual ~ScalarInput();
+
+    ScalarType data() const { return m_data; }
+private:
+    ScalarType m_data;
+};
+
+class MapInput : public NondeterministicInput&lt;MapInput&gt; {
+public:
+    MapInput(std::unique_ptr&lt;MapType&gt; data);
+    virtual ~MapInput();
+
+    const MapType&amp; data() const { return *m_data; }
+private:
+    std::unique_ptr&lt;MapType&gt; m_data;
+};
+} // namespace Test
+
+#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
+    macro(ScalarInput) \
+    macro(MapInput) \
+    \
+// end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
+
+#endif // ENABLE(WEB_REPLAY)
+
+#endif // generate-memoized-type-modes.json-TestReplayInputs_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailoncstyleenumnostoragejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-c-style-enum-no-storage.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-c-style-enum-no-storage.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-c-style-enum-no-storage.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;WebCore&quot;: [
+            {
+                &quot;name&quot;: &quot;MouseButton&quot;, &quot;mode&quot;: &quot;SCALAR&quot;,
+                &quot;flags&quot;: [&quot;ENUM&quot;],
+                &quot;values&quot;: [&quot;NoButton&quot;, &quot;LeftButton&quot;, &quot;MiddleButton&quot;, &quot;RightButton&quot;],
+                &quot;header&quot;: &quot;path/to/MouseButton.h&quot;
+            }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SavedMouseButton&quot;,
+            &quot;description&quot;: &quot;Supplies a mouse button enum value.&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;button&quot;, &quot;type&quot;: &quot;MouseButton&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonduplicateinputnamesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-input-names.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-input-names.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-input-names.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; },
+            { &quot;name&quot;: &quot;uint64_t&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;currentTime&quot;, &quot;type&quot;: &quot;double&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Sets the PRNG seed used by Math.random().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;randomSeed&quot;, &quot;type&quot;: &quot;uint64_t&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonduplicatetypenamesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-type-names.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-type-names.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-duplicate-type-names.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;uint64_t&quot;, &quot;mode&quot;: &quot;SCALAR&quot; },
+            { &quot;name&quot;: &quot;uint64_t&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SetRandomSeed&quot;,
+            &quot;description&quot;: &quot;Sets the PRNG seed used by Math.random().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;randomSeed&quot;,
+                    &quot;type&quot;: &quot;uint64_t&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonenumtypemissingvaluesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-enum-type-missing-values.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-enum-type-missing-values.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-enum-type-missing-values.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            {
+                &quot;name&quot;: &quot;MouseButton&quot;, &quot;mode&quot;: &quot;SCALAR&quot;,
+                &quot;flags&quot;: [&quot;ENUM&quot;]
+            }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SavedMouseButton&quot;,
+            &quot;description&quot;: &quot;Supplies a mouse button enum value.&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;currentTime&quot;, &quot;type&quot;: &quot;MouseButton&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputmembernamejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-member-name.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-member-name.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-member-name.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputnamejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-name.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-name.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-name.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonmissinginputqueuejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-queue.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-queue.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-input-queue.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonmissingtypemodejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-mode.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-mode.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-mode.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonmissingtypenamejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-name.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-name.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-missing-type-name.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonnoinputsjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-inputs.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-inputs.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-inputs.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    }
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonnotypesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-types.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-types.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-no-types.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+{
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+ }
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonunknowninputqueuejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-input-queue.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-input-queue.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-input-queue.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonunknownmembertypejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-member-type.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-member-type.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-member-type.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;uint64_t&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SetRandomSeed&quot;,
+            &quot;description&quot;: &quot;Sets the PRNG seed used by Math.random().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;randomSeed&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsfailonunknowntypemodejson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-type-mode.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-type-mode.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/fail-on-unknown-type-mode.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;BONKERS&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {
+                    &quot;name&quot;: &quot;currentTime&quot;,
+                    &quot;type&quot;: &quot;double&quot;
+                }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateenumencodinghelperswithguardedvaluesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;WebCore&quot;: [
+            {
+                &quot;name&quot;: &quot;MouseButton&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;storage&quot;: &quot;unsigned&quot;,
+                &quot;flags&quot;: [&quot;ENUM&quot;],
+                &quot;values&quot;: [&quot;NoButton&quot;, &quot;LeftButton&quot;, &quot;MiddleButton&quot;, &quot;RightButton&quot;],
+                &quot;guarded_values&quot;: {
+                    &quot;ENABLE(SIDE_BUTTONS)&quot;: [&quot;LeftSideButton&quot;, &quot;RightSideButton&quot;],
+                    &quot;PLATFORM(WINDOWS)&quot;: [&quot;WindowsButton&quot;]
+                },
+                &quot;header&quot;: &quot;platform/PlatformMouseEvent.h&quot;
+            }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SavedMouseButton&quot;,
+            &quot;description&quot;: &quot;Supplies a mouse button enum value.&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;button&quot;, &quot;type&quot;: &quot;MouseButton&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateenumencodinghelpersjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-enum-encoding-helpers.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;JavaScriptCore&quot;: [
+            {
+                &quot;name&quot;: &quot;InputQueue&quot;, &quot;mode&quot;: &quot;SCALAR&quot;,
+                &quot;flags&quot;: [&quot;ENUM_CLASS&quot;],
+                &quot;values&quot;: [&quot;EventLoopInput&quot;, &quot;LoaderMemoizedData&quot;, &quot;ScriptMemoizedData&quot;],
+                &quot;header&quot;: &quot;replay/NondeterministicInput.h&quot;
+            }
+        ],
+        &quot;WebCore&quot;: [
+            {
+                &quot;name&quot;: &quot;MouseButton&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;storage&quot;: &quot;unsigned&quot;,
+                &quot;flags&quot;: [&quot;ENUM&quot;],
+                &quot;values&quot;: [&quot;NoButton&quot;, &quot;LeftButton&quot;, &quot;MiddleButton&quot;, &quot;RightButton&quot;],
+                &quot;header&quot;: &quot;platform/PlatformMouseEvent.h&quot;
+            }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;SavedMouseButton&quot;,
+            &quot;description&quot;: &quot;Supplies a mouse button enum value.&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;button&quot;, &quot;type&quot;: &quot;MouseButton&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateeventloopshapetypesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-event-loop-shape-types.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-event-loop-shape-types.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-event-loop-shape-types.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;ScalarType&quot;, &quot;mode&quot;: &quot;SCALAR&quot; },
+            { &quot;name&quot;: &quot;MapType&quot;, &quot;mode&quot;: &quot;MAP&quot; },
+            { &quot;name&quot;: &quot;SharedMapType&quot;, &quot;mode&quot;: &quot;SHARED_MAP&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;ScalarInput&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;EVENT_LOOP&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;ScalarType&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;MapInput&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;EVENT_LOOP&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;MapType&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;SharedMapInput&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;EVENT_LOOP&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;SharedMapType&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateinputwithguardjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-guard.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-guard.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-guard.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; },
+            { &quot;name&quot;: &quot;uint64_t&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;GetCurrentTime&quot;,
+            &quot;description&quot;: &quot;Supplies the system time to Date.now() and new Date().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;guard&quot;: &quot;ENABLE(DUMMY_FEATURE)&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;currentTime&quot;, &quot;type&quot;: &quot;double&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;SetRandomSeed&quot;,
+            &quot;description&quot;: &quot;Sets the PRNG seed used by Math.random().&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                {&quot;name&quot;: &quot;randomSeed&quot;, &quot;type&quot;: &quot;uint64_t&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateinputwithvectormembersjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-vector-members.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-vector-members.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-input-with-vector-members.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;double&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ],
+
+        &quot;JavaScriptCore&quot;: [
+            { &quot;name&quot;: &quot;JSThing&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;header&quot;: &quot;things/JSThing.h&quot; }
+        ],
+
+        &quot;WebCore&quot;: [
+            { &quot;name&quot;: &quot;WebThing&quot;, &quot;mode&quot;: &quot;SCALAR&quot;, &quot;header&quot;: &quot;things/WebThing.h&quot;  }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;ArrayOfThings&quot;,
+            &quot;description&quot;: &quot;Supplies arrays of things.&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;doubles&quot;, &quot;type&quot;: &quot;double&quot;, &quot;flags&quot;: [&quot;VECTOR&quot;] },
+                { &quot;name&quot;: &quot;jsthings&quot;, &quot;type&quot;: &quot;JSThing&quot;, &quot;flags&quot;: [&quot;VECTOR&quot;] },
+                { &quot;name&quot;: &quot;webthings&quot;, &quot;type&quot;: &quot;WebThing&quot;, &quot;flags&quot;: [&quot;VECTOR&quot;] }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgenerateinputswithflagsjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-inputs-with-flags.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-inputs-with-flags.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-inputs-with-flags.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;ScalarType&quot;, &quot;mode&quot;: &quot;SCALAR&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;ScalarInput1&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;ScalarType&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;ScalarInput2&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;flags&quot;: [&quot;CREATE_FROM_PAGE&quot;],
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;ScalarType&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorereplayscriptstestsgeneratememoizedtypemodesjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/replay/scripts/tests/generate-memoized-type-modes.json (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/replay/scripts/tests/generate-memoized-type-modes.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/replay/scripts/tests/generate-memoized-type-modes.json        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+{
+    &quot;types&quot;: {
+        &quot;Global&quot;: [
+            { &quot;name&quot;: &quot;ScalarType&quot;, &quot;mode&quot;: &quot;SCALAR&quot; },
+            { &quot;name&quot;: &quot;MapType&quot;, &quot;mode&quot;: &quot;OWNED&quot; }
+        ]
+    },
+
+    &quot;inputs&quot;: [
+        {
+            &quot;name&quot;: &quot;ScalarInput&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;ScalarType&quot; }
+            ]
+        },
+        {
+            &quot;name&quot;: &quot;MapInput&quot;,
+            &quot;description&quot;: &quot;&quot;,
+            &quot;queue&quot;: &quot;SCRIPT_MEMOIZED&quot;,
+            &quot;members&quot;: [
+                { &quot;name&quot;: &quot;data&quot;, &quot;type&quot;: &quot;MapType&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (163917 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-02-12 00:08:16 UTC (rev 163917)
+++ trunk/Tools/ChangeLog        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-02-11  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Replay: upstream replay input code generator and EncodedValue class
+        https://bugs.webkit.org/show_bug.cgi?id=128215
+
+        Reviewed by Joseph Pecoraro.
+
+        Add an executable script to launch the replay input generator tests.
+        Add a test harness for running the code generator tests, mostly taken
+        from the bindings test harness (but simplified).
+
+        * Scripts/run-input-generator-tests: Added.
+        (main):
+        * Scripts/webkitpy/replay/__init__.py: Added.
+        * Scripts/webkitpy/replay/main.py: Added.
+        (InputGeneratorTests):
+        (InputGeneratorTests.__init__):
+        (InputGeneratorTests.generate_from_json):
+        (InputGeneratorTests.write_error_file):
+        (InputGeneratorTests.detect_changes):
+        (InputGeneratorTests.run_tests):
+        (InputGeneratorTests.main):
+
</ins><span class="cx"> 2014-02-11  James Craig  &lt;jcraig@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: AX: Accessibility Node Inspection
</span></span></pre></div>
<a id="trunkToolsScriptsruninputgeneratortests"></a>
<div class="addfile"><h4>Added: trunk/Tools/Scripts/run-input-generator-tests (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/run-input-generator-tests                                (rev 0)
+++ trunk/Tools/Scripts/run-input-generator-tests        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+#!/usr/bin/env python
+# Copyright (C) 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+# IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import sys
+from webkitpy.common.system import executive
+
+def main(argv):
+    &quot;&quot;&quot;Runs replay input code generator on test specification files and compares
+    the results with reference files.
+
+    Options:
+       --reset-results: Overwrites the reference files with the generated results.
+
+    &quot;&quot;&quot;
+    reset_results = &quot;--reset-results&quot; in argv
+
+    from webkitpy.replay.main import InputGeneratorTests
+    return InputGeneratorTests(reset_results, executive.Executive()).main()
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
</ins><span class="cx">Property changes on: trunk/Tools/Scripts/run-input-generator-tests
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
<a id="trunkToolsScriptswebkitpyreplay__init__py"></a>
<div class="addfile"><h4>Added: trunk/Tools/Scripts/webkitpy/replay/__init__.py (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/replay/__init__.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/replay/__init__.py        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+# Required for Python to search this directory for module files
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpyreplaymainpy"></a>
<div class="addfile"><h4>Added: trunk/Tools/Scripts/webkitpy/replay/main.py (0 => 163918)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/replay/main.py                                (rev 0)
+++ trunk/Tools/Scripts/webkitpy/replay/main.py        2014-02-12 00:22:01 UTC (rev 163918)
</span><span class="lines">@@ -0,0 +1,134 @@
</span><ins>+# Copyright (C) 2011 Google Inc. All rights reserved.
+# Copyright (C) 2014 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
+# IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os
+import os.path
+import shutil
+import sys
+import tempfile
+from webkitpy.common.checkout.scm.detection import detect_scm_system
+from webkitpy.common.system.executive import ScriptError
+
+
+class InputGeneratorTests:
+
+    def __init__(self, reset_results, executive):
+        self.reset_results = reset_results
+        self.executive = executive
+
+    def generate_from_json(self, json_file, output_directory):
+        cmd = ['python',
+               'JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py',
+               '--outputDir', output_directory,
+               '--force',
+               '--framework', 'Test',
+               '--test',
+               json_file]
+
+        exit_code = 0
+        try:
+            stderr_output = self.executive.run_command(cmd)
+            if stderr_output:
+                self.write_error_file(json_file, output_directory, stderr_output)
+        except ScriptError, e:
+            print e.output
+            exit_code = e.exit_code
+        return exit_code
+
+    def write_error_file(self, input_filepath, output_directory, error_output):
+        output_filepath = os.path.join(output_directory, os.path.basename(input_filepath) + '-error')
+
+        with open(output_filepath, &quot;w&quot;) as output_file:
+            output_file.write(error_output)
+
+    def detect_changes(self, work_directory, reference_directory):
+        changes_found = False
+        for output_file in os.listdir(work_directory):
+            cmd = ['diff',
+                   '-u',
+                   '-N',
+                   os.path.join(reference_directory, output_file),
+                   os.path.join(work_directory, output_file)]
+
+            exit_code = 0
+            try:
+                output = self.executive.run_command(cmd)
+            except ScriptError, e:
+                output = e.output
+                exit_code = e.exit_code
+
+            if exit_code or output:
+                print 'FAIL: %s' % output_file
+                print output
+                changes_found = True
+            else:
+                print 'PASS: %s' % output_file
+        return changes_found
+
+    def run_tests(self, input_directory, reference_directory):
+        work_directory = reference_directory
+
+        passed = True
+        for input_file in os.listdir(input_directory):
+            (name, extension) = os.path.splitext(input_file)
+            if extension != '.json':
+                continue
+            # Generate output into the work directory (either the given one or a
+            # temp one if not reset_results is performed)
+            if not self.reset_results:
+                work_directory = tempfile.mkdtemp()
+
+            if self.generate_from_json(os.path.join(input_directory, input_file), work_directory):
+                passed = False
+
+            if self.reset_results:
+                print &quot;Reset results for test: %s&quot; % (input_file)
+                continue
+
+            # Detect changes
+            if self.detect_changes(work_directory, reference_directory):
+                passed = False
+            shutil.rmtree(work_directory)
+
+        return passed
+
+    def main(self):
+        current_scm = detect_scm_system(os.curdir)
+        os.chdir(os.path.join(current_scm.checkout_root, 'Source'))
+
+        all_tests_passed = True
+
+        input_directory = os.path.join('JavaScriptCore', 'replay', 'scripts', 'tests')
+        reference_directory = os.path.join('JavaScriptCore', 'replay', 'scripts', 'tests', 'expected')
+        if not self.run_tests(input_directory, reference_directory):
+            all_tests_passed = False
+
+        print ''
+        if all_tests_passed:
+            print 'All tests PASS!'
+            return 0
+        else:
+            print 'Some tests FAIL! (To update the reference files, execute &quot;run-input-generator-tests --reset-results&quot;)'
+            return -1
</ins></span></pre>
</div>
</div>

</body>
</html>