Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (178667 => 178668)
--- trunk/Source/_javascript_Core/ChangeLog 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-01-19 20:49:31 UTC (rev 178668)
@@ -1,3 +1,29 @@
+2015-01-19 Brian J. Burg <b...@cs.washington.edu>
+
+ Web Replay: convert to is<T> and downcast<T> for decoding replay inputs
+ https://bugs.webkit.org/show_bug.cgi?id=140512
+
+ Reviewed by Chris Dumez.
+
+ Generate a SPECIALIZE_TYPE_TRAITS_* chunk of code for each input. This cannot
+ be done using REPLAY_INPUT_NAMES_FOR_EACH macro since that doesn't fully qualify
+ input types, and the type traits macro is defined in namespace WTF.
+
+ * replay/NondeterministicInput.h: Make overridden methods public.
+ * replay/scripts/CodeGeneratorReplayInputs.py:
+ (Generator.generate_header):
+ (Generator.qualified_input_name): Allow forcing qualification. WTF is never a target framework.
+ (Generator.generate_input_type_trait_declaration): Added.
+ * replay/scripts/CodeGeneratorReplayInputsTemplates.py: Add a template.
+ * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h:
+ * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h:
+
2015-01-19 Commit Queue <commit-qu...@webkit.org>
Unreviewed, rolling out r178653.
Modified: trunk/Source/_javascript_Core/replay/NondeterministicInput.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/NondeterministicInput.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/NondeterministicInput.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -65,6 +65,7 @@
template<typename InputType>
class NondeterministicInput : public NondeterministicInputBase {
+public:
virtual const String& type() const override
{
return InputTraits<InputType>::type();
Modified: trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py 2015-01-19 20:49:31 UTC (rev 178668)
@@ -57,6 +57,9 @@
(["_javascript_Core"],
("_javascript_Core", "replay/NondeterministicInput.h")
),
+ (["_javascript_Core", "WebCore"],
+ ("WTF", "wtf/TypeCasts.h")
+ ),
(["WebCore"],
("WTF", "wtf/text/WTFString.h")
),
@@ -596,6 +599,7 @@
'inputForwardDeclarations': "\n".join([wrap_with_guard("class %s;", _input.guard) % _input.name for _input in self._model.inputs]),
'inputClassDeclarations': "\n\n".join([self.generate_class_declaration(_input) for _input in self._model.inputs]),
'inputTraitDeclarations': "\n\n".join([self.generate_input_trait_declaration(_input) for _input in self._model.inputs]),
+ 'inputTypeTraitDeclarations': "\n\n".join([self.generate_input_type_trait_declaration(_input) for _input in self._model.inputs]),
'enumTraitDeclarations': "\n\n".join([wrap_with_guard(self.generate_enum_trait_declaration(_type), _type.guard) for _type in self._model.enum_types()]),
'forEachMacro': self.generate_for_each_macro(),
}
@@ -747,11 +751,11 @@
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:
+ def qualified_input_name(self, _input, forceQualified=False):
+ if forceQualified or self.target_framework != self.traits_framework:
+ return "%s::%s" % (self.target_framework.setting('namespace'), _input.name)
+ else:
return _input.name
- else:
- return "%s::%s" % (self.target_framework.setting('namespace'), _input.name)
def generate_input_trait_declaration(self, _input):
decl_type = ['struct']
@@ -766,6 +770,13 @@
return wrap_with_guard(Template(Templates.InputTraitsDeclaration).substitute(template_arguments), _input.guard)
+ def generate_input_type_trait_declaration(self, _input):
+ template_arguments = {
+ 'qualifiedInputName': self.qualified_input_name(_input, forceQualified=True),
+ }
+
+ return wrap_with_guard(Template(Templates.InputTypeTraitsDeclaration).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
Modified: trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputsTemplates.py (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputsTemplates.py 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputsTemplates.py 2015-01-19 20:49:31 UTC (rev 178668)
@@ -88,6 +88,8 @@
${inputClassDeclarations}
} // namespace ${inputsNamespace}
+${inputTypeTraitDeclarations}
+
${forEachMacro}
#endif // ${guardCondition}
@@ -104,6 +106,11 @@
static bool decode(JSC::EncodedValue&, std::unique_ptr<${qualifiedInputName}>&);
};""")
+ InputTypeTraitsDeclaration = (
+ """SPECIALIZE_TYPE_TRAITS_BEGIN(${qualifiedInputName})
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<${qualifiedInputName}>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()""")
+
EnumTraitDeclaration = (
"""template<> struct EncodingTraits<${enumName}> {
typedef ${enumName} DecodedType;
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -71,6 +71,10 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedMouseButton)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedMouseButton>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(SavedMouseButton) \
\
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -90,6 +90,10 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedMouseButton)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedMouseButton>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(SavedMouseButton) \
\
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -76,6 +76,10 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::HandleWheelEvent)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::HandleWheelEvent>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(HandleWheelEvent) \
\
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -98,6 +98,10 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::FormCombo)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::FormCombo>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(FormCombo) \
\
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -88,6 +88,16 @@
};
} // namespace Test
+#if ENABLE(DUMMY_FEATURE)
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::GetCurrentTime)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::GetCurrentTime>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+#endif // ENABLE(DUMMY_FEATURE)
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SetRandomSeed)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SetRandomSeed>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(GetCurrentTime) \
macro(SetRandomSeed) \
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -90,6 +90,14 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ArrayOfThings)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ArrayOfThings>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedHistory)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedHistory>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(ArrayOfThings) \
macro(SavedHistory) \
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -82,6 +82,14 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput1)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput1>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput2)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput2>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(ScalarInput1) \
macro(ScalarInput2) \
Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h (178667 => 178668)
--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -82,6 +82,14 @@
};
} // namespace Test
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(Test::MapInput)
+ static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::MapInput>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
macro(ScalarInput) \
macro(MapInput) \
Modified: trunk/Source/WebCore/ChangeLog (178667 => 178668)
--- trunk/Source/WebCore/ChangeLog 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/WebCore/ChangeLog 2015-01-19 20:49:31 UTC (rev 178668)
@@ -1,3 +1,19 @@
+2015-01-19 Brian J. Burg <b...@cs.washington.edu>
+
+ Web Replay: convert to is<T> and downcast<T> for decoding replay inputs
+ https://bugs.webkit.org/show_bug.cgi?id=140512
+
+ Reviewed by Chris Dumez.
+
+ No new tests, no behavior changed.
+
+ * replay/EventLoopInput.h: Make overridden methods public.
+ * replay/MemoizedDOMResult.h: Add type trait specialization here. It is
+ special-cased because the input type parameter doesn't work with macros.
+ * replay/SerializationMethods.cpp:
+ (JSC::EncodingTraits<NondeterministicInputBase>::encodeValue):
+ Use is() and downcast() when dispatching to encoders based on type.
+
2015-01-19 Zan Dobersek <zdober...@igalia.com>
Replace use of WTF::bind() in MemoryPressureHandlerLinux.cpp with a C++ lambda
Modified: trunk/Source/WebCore/replay/EventLoopInput.h (178667 => 178668)
--- trunk/Source/WebCore/replay/EventLoopInput.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/WebCore/replay/EventLoopInput.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -64,6 +64,7 @@
template <typename InputType>
class EventLoopInput : public EventLoopInputBase {
+public:
virtual const String& type() const override final
{
return InputTraits<InputType>::type();
Modified: trunk/Source/WebCore/replay/MemoizedDOMResult.h (178667 => 178668)
--- trunk/Source/WebCore/replay/MemoizedDOMResult.h 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/WebCore/replay/MemoizedDOMResult.h 2015-01-19 20:49:31 UTC (rev 178668)
@@ -32,6 +32,7 @@
#include <replay/EncodedValue.h>
#include <replay/NondeterministicInput.h>
+#include <wtf/TypeCasts.h>
namespace WebCore {
@@ -154,6 +155,10 @@
} // namespace JSC
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::MemoizedDOMResultBase)
+static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<WebCore::MemoizedDOMResultBase>::type(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
#endif // ENABLE(WEB_REPLAY)
#endif // MemoizedDOMResult_h
Modified: trunk/Source/WebCore/replay/SerializationMethods.cpp (178667 => 178668)
--- trunk/Source/WebCore/replay/SerializationMethods.cpp 2015-01-19 20:34:02 UTC (rev 178667)
+++ trunk/Source/WebCore/replay/SerializationMethods.cpp 2015-01-19 20:49:31 UTC (rev 178668)
@@ -166,8 +166,8 @@
ENCODE_TYPE_WITH_KEY(encodedValue, String, type, input.type());
#define ENCODE_IF_TYPE_TAG_MATCHES(name) \
- if (input.type() == InputTraits<name>::type()) { \
- InputTraits<name>::encode(encodedValue, static_cast<const name&>(input)); \
+ if (is<name>(input)) { \
+ InputTraits<name>::encode(encodedValue, downcast<name>(input)); \
return encodedValue; \
} \
@@ -176,8 +176,8 @@
#undef ENCODE_IF_TYPE_TAG_MATCHES
// The macro won't work here because of the class template argument.
- if (input.type() == InputTraits<MemoizedDOMResultBase>::type()) {
- InputTraits<MemoizedDOMResultBase>::encode(encodedValue, static_cast<const MemoizedDOMResultBase&>(input));
+ if (is<MemoizedDOMResultBase>(input)) {
+ InputTraits<MemoizedDOMResultBase>::encode(encodedValue, downcast<MemoizedDOMResultBase>(input));
return encodedValue;
}