Changeset 178668 in webkit for trunk/Source/JavaScriptCore/replay


Ignore:
Timestamp:
Jan 19, 2015, 12:49:31 PM (10 years ago)
Author:
Brian Burg
Message:

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.

Source/JavaScriptCore:

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:

Source/WebCore:

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.

Location:
trunk/Source/JavaScriptCore/replay
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/replay/NondeterministicInput.h

    r174113 r178668  
    6666template<typename InputType>
    6767class NondeterministicInput : public NondeterministicInputBase {
     68public:
    6869    virtual const String& type() const override
    6970    {
  • trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py

    r178060 r178668  
    5858            ("JavaScriptCore", "replay/NondeterministicInput.h")
    5959        ),
     60        (["JavaScriptCore", "WebCore"],
     61            ("WTF", "wtf/TypeCasts.h")
     62        ),
    6063        (["WebCore"],
    6164            ("WTF", "wtf/text/WTFString.h")
     
    597600            'inputClassDeclarations': "\n\n".join([self.generate_class_declaration(_input) for _input in self._model.inputs]),
    598601            'inputTraitDeclarations': "\n\n".join([self.generate_input_trait_declaration(_input) for _input in self._model.inputs]),
     602            'inputTypeTraitDeclarations': "\n\n".join([self.generate_input_type_trait_declaration(_input) for _input in self._model.inputs]),
    599603            'enumTraitDeclarations': "\n\n".join([wrap_with_guard(self.generate_enum_trait_declaration(_type), _type.guard) for _type in self._model.enum_types()]),
    600604            'forEachMacro': self.generate_for_each_macro(),
     
    748752        return [(_member, self._model.get_type_for_member(_member)) for _member in _input.members]
    749753
    750     def qualified_input_name(self, _input):
    751         if self.target_framework == self.traits_framework:
     754    def qualified_input_name(self, _input, forceQualified=False):
     755        if forceQualified or self.target_framework != self.traits_framework:
     756            return "%s::%s" % (self.target_framework.setting('namespace'), _input.name)
     757        else:
    752758            return _input.name
    753         else:
    754             return "%s::%s" % (self.target_framework.setting('namespace'), _input.name)
    755759
    756760    def generate_input_trait_declaration(self, _input):
     
    766770
    767771        return wrap_with_guard(Template(Templates.InputTraitsDeclaration).substitute(template_arguments), _input.guard)
     772
     773    def generate_input_type_trait_declaration(self, _input):
     774        template_arguments = {
     775            'qualifiedInputName': self.qualified_input_name(_input, forceQualified=True),
     776        }
     777
     778        return wrap_with_guard(Template(Templates.InputTypeTraitsDeclaration).substitute(template_arguments), _input.guard)
    768779
    769780    def generate_enum_trait_declaration(self, _type):
  • trunk/Source/JavaScriptCore/replay/scripts/CodeGeneratorReplayInputsTemplates.py

    r174863 r178668  
    8989} // namespace ${inputsNamespace}
    9090
     91${inputTypeTraitDeclarations}
     92
    9193${forEachMacro}
    9294
     
    104106    static bool decode(JSC::EncodedValue&, std::unique_ptr<${qualifiedInputName}>&);
    105107};""")
     108
     109    InputTypeTraitsDeclaration = (
     110    """SPECIALIZE_TYPE_TRAITS_BEGIN(${qualifiedInputName})
     111    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<${qualifiedInputName}>::type(); }
     112SPECIALIZE_TYPE_TRAITS_END()""")
    106113
    107114    EnumTraitDeclaration = (
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h

    r174113 r178668  
    7272} // namespace Test
    7373
     74SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedMouseButton)
     75    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedMouseButton>::type(); }
     76SPECIALIZE_TYPE_TRAITS_END()
     77
    7478#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    7579    macro(SavedMouseButton) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h

    r174863 r178668  
    9191} // namespace Test
    9292
     93SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedMouseButton)
     94    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedMouseButton>::type(); }
     95SPECIALIZE_TYPE_TRAITS_END()
     96
    9397#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    9498    macro(SavedMouseButton) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h

    r174113 r178668  
    7777} // namespace Test
    7878
     79SPECIALIZE_TYPE_TRAITS_BEGIN(Test::HandleWheelEvent)
     80    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::HandleWheelEvent>::type(); }
     81SPECIALIZE_TYPE_TRAITS_END()
     82
    7983#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    8084    macro(HandleWheelEvent) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h

    r174113 r178668  
    9999} // namespace Test
    100100
     101SPECIALIZE_TYPE_TRAITS_BEGIN(Test::FormCombo)
     102    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::FormCombo>::type(); }
     103SPECIALIZE_TYPE_TRAITS_END()
     104
    101105#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    102106    macro(FormCombo) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h

    r174113 r178668  
    8989} // namespace Test
    9090
     91#if ENABLE(DUMMY_FEATURE)
     92SPECIALIZE_TYPE_TRAITS_BEGIN(Test::GetCurrentTime)
     93    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::GetCurrentTime>::type(); }
     94SPECIALIZE_TYPE_TRAITS_END()
     95#endif // ENABLE(DUMMY_FEATURE)
     96
     97SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SetRandomSeed)
     98    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SetRandomSeed>::type(); }
     99SPECIALIZE_TYPE_TRAITS_END()
     100
    91101#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    92102    macro(GetCurrentTime) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h

    r174113 r178668  
    9191} // namespace Test
    9292
     93SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ArrayOfThings)
     94    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ArrayOfThings>::type(); }
     95SPECIALIZE_TYPE_TRAITS_END()
     96
     97SPECIALIZE_TYPE_TRAITS_BEGIN(Test::SavedHistory)
     98    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::SavedHistory>::type(); }
     99SPECIALIZE_TYPE_TRAITS_END()
     100
    93101#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    94102    macro(ArrayOfThings) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h

    r174113 r178668  
    8383} // namespace Test
    8484
     85SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput1)
     86    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput1>::type(); }
     87SPECIALIZE_TYPE_TRAITS_END()
     88
     89SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput2)
     90    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput2>::type(); }
     91SPECIALIZE_TYPE_TRAITS_END()
     92
    8593#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    8694    macro(ScalarInput1) \
  • trunk/Source/JavaScriptCore/replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h

    r174113 r178668  
    8383} // namespace Test
    8484
     85SPECIALIZE_TYPE_TRAITS_BEGIN(Test::ScalarInput)
     86    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::ScalarInput>::type(); }
     87SPECIALIZE_TYPE_TRAITS_END()
     88
     89SPECIALIZE_TYPE_TRAITS_BEGIN(Test::MapInput)
     90    static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<Test::MapInput>::type(); }
     91SPECIALIZE_TYPE_TRAITS_END()
     92
    8593#define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
    8694    macro(ScalarInput) \
Note: See TracChangeset for help on using the changeset viewer.