Title: [171684] trunk/Source/_javascript_Core
Revision
171684
Author
[email protected]
Date
2014-07-28 12:31:03 -0700 (Mon, 28 Jul 2014)

Log Message

Web Replay: auto-decoding of parameterized vector's elements is incorrect
https://bugs.webkit.org/show_bug.cgi?id=135343

Reviewed by Timothy Hatcher.

Fix an incorrect type argument in EncodingTraits<Vector<T>>::encodeValue
that was using the element's decoded type as the type parameter to
EncodedValue::append<T>. It should instead be the raw type T. This
causes problems when encoding Vector<RefPtr<T>>, as it later tries to
use encoding traits for RefPtr<T> rather than for T.

Fix incorrect generated encoding traits argument for vectors of
RefCounted objects. Updated test to cover this scenario.

* replay/scripts/CodeGeneratorReplayInputs.py:
(Type.encoding_type_argument):
(VectorType.type_name):
(VectorType):
(VectorType.encoding_type_argument):
(Generator.generate_input_encode_implementation):
(Generator.generate_input_decode_implementation):
* replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp:
* replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h:
* replay/scripts/tests/generate-input-with-vector-members.json: Updated.

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (171683 => 171684)


--- trunk/Source/_javascript_Core/ChangeLog	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/ChangeLog	2014-07-28 19:31:03 UTC (rev 171684)
@@ -1,5 +1,32 @@
 2014-07-28  Brian J. Burg  <[email protected]>
 
+        Web Replay: auto-decoding of parameterized vector's elements is incorrect
+        https://bugs.webkit.org/show_bug.cgi?id=135343
+
+        Reviewed by Timothy Hatcher.
+
+        Fix an incorrect type argument in EncodingTraits<Vector<T>>::encodeValue
+        that was using the element's decoded type as the type parameter to
+        EncodedValue::append<T>. It should instead be the raw type T. This
+        causes problems when encoding Vector<RefPtr<T>>, as it later tries to
+        use encoding traits for RefPtr<T> rather than for T.
+
+        Fix incorrect generated encoding traits argument for vectors of
+        RefCounted objects. Updated test to cover this scenario.
+
+        * replay/scripts/CodeGeneratorReplayInputs.py:
+        (Type.encoding_type_argument):
+        (VectorType.type_name):
+        (VectorType):
+        (VectorType.encoding_type_argument):
+        (Generator.generate_input_encode_implementation):
+        (Generator.generate_input_decode_implementation):
+        * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp:
+        * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h:
+        * replay/scripts/tests/generate-input-with-vector-members.json: Updated.
+
+2014-07-28  Brian J. Burg  <[email protected]>
+
         Web Replay: incorrect serialization code generated for enum classes inside class scope
         https://bugs.webkit.org/show_bug.cgi?id=135342
 

Modified: trunk/Source/_javascript_Core/replay/EncodedValue.h (171683 => 171684)


--- trunk/Source/_javascript_Core/replay/EncodedValue.h	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/replay/EncodedValue.h	2014-07-28 19:31:03 UTC (rev 171684)
@@ -112,7 +112,7 @@
     {
         EncodedValue encodedVector = EncodedValue::createArray();
         for (const typename EncodingTraits<T>::DecodedType& value : vectorOfValues)
-            encodedVector.append<typename EncodingTraits<T>::DecodedType>(value);
+            encodedVector.append<T>(value);
 
         return WTF::move(encodedVector);
     }

Modified: trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py (171683 => 171684)


--- trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/replay/scripts/CodeGeneratorReplayInputs.py	2014-07-28 19:31:03 UTC (rev 171684)
@@ -360,7 +360,10 @@
         else:
             return self.storage_type()
 
+    def encoding_type_argument(self, qualified=False):
+        return self.type_name(qualified=qualified)
 
+
 def check_for_required_properties(props, obj, what):
     for prop in props:
         if prop not in obj:
@@ -390,6 +393,9 @@
         return ""
 
     def type_name(self, qualified=False):
+        return "Vector<%s>" % self._element_type.storage_type(qualified=qualified)
+
+    def encoding_type_argument(self, qualified=False):
         return "Vector<%s>" % self._element_type.type_name(qualified=qualified)
 
     def argument_type(self, qualified=False):
@@ -881,7 +887,7 @@
         steps = []
         for (_member, _type) in self.generate_input_member_tuples(_input):
             should_qualify_type = _type.framework != self.traits_framework
-            put_method = "put<%s>" % _type.type_name(qualified=should_qualify_type)
+            put_method = "put<%s>" % _type.encoding_type_argument(qualified=should_qualify_type)
 
             steps.extend([
                 "    encodedValue.%s(ASCIILiteral(\"%s\"), input.%s());" % (put_method, _member.memberName, _member.memberName)
@@ -899,7 +905,7 @@
         steps = []
         for (_member, _type) in self.generate_input_member_tuples(_input):
             should_qualify_type = _type.framework != self.traits_framework
-            get_method = "get<%s>" % _type.type_name(qualified=should_qualify_type)
+            get_method = "get<%s>" % _type.encoding_type_argument(qualified=should_qualify_type)
 
             lines = [
                 "    %s %s;" % (_type.storage_type(qualified=should_qualify_type), _member.memberName),

Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp (171683 => 171684)


--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp	2014-07-28 19:31:03 UTC (rev 171684)
@@ -48,6 +48,16 @@
 ArrayOfThings::~ArrayOfThings()
 {
 }
+
+SavedHistory::SavedHistory(Vector<RefPtr<HistoryItem>>& entries)
+    : NondeterministicInput<SavedHistory>()
+    , m_entries(entries)
+{
+}
+
+SavedHistory::~SavedHistory()
+{
+}
 } // namespace Test
 
 namespace JSC {
@@ -82,6 +92,27 @@
     return true;
 }
 
+const AtomicString& InputTraits<Test::SavedHistory>::type()
+{
+    static NeverDestroyed<const AtomicString> type("SavedHistory", AtomicString::ConstructFromLiteral);
+    return type;
+}
+
+void InputTraits<Test::SavedHistory>::encode(EncodedValue& encodedValue, const Test::SavedHistory& input)
+{
+    encodedValue.put<Vector<WebCore::HistoryItem>>(ASCIILiteral("entries"), input.entries());
+}
+
+bool InputTraits<Test::SavedHistory>::decode(EncodedValue& encodedValue, std::unique_ptr<Test::SavedHistory>& input)
+{
+    Vector<RefPtr<WebCore::HistoryItem>> entries;
+    if (!encodedValue.get<Vector<WebCore::HistoryItem>>(ASCIILiteral("entries"), entries))
+        return false;
+
+    input = std::make_unique<Test::SavedHistory>(entries);
+    return true;
+}
+
 } // namespace JSC
 
 #endif // ENABLE(WEB_REPLAY)

Modified: trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h (171683 => 171684)


--- trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h	2014-07-28 19:31:03 UTC (rev 171684)
@@ -32,12 +32,17 @@
 
 #if ENABLE(WEB_REPLAY)
 #include "InternalNamespaceHeaderIncludeDummy.h"
+#include <history/HistoryItem.h>
 #include <platform/ExternalNamespaceHeaderIncludeDummy.h>
 
+namespace WebCore {
+class HistoryItem;
+}
 
 
 namespace Test {
 class ArrayOfThings;
+class SavedHistory;
 } // namespace Test
 
 namespace JSC {
@@ -49,6 +54,14 @@
     static bool decode(JSC::EncodedValue&, std::unique_ptr<Test::ArrayOfThings>&);
 };
 
+template<> struct InputTraits<Test::SavedHistory> {
+    static InputQueue queue() { return InputQueue::ScriptMemoizedData; }
+    static const AtomicString& type();
+
+    static void encode(JSC::EncodedValue&, const Test::SavedHistory&);
+    static bool decode(JSC::EncodedValue&, std::unique_ptr<Test::SavedHistory>&);
+};
+
 } // namespace JSC
 
 namespace Test {
@@ -65,10 +78,21 @@
     Vector<JSThing> m_jsthings;
     Vector<WebThing> m_webthings;
 };
+
+class SavedHistory : public NondeterministicInput<SavedHistory> {
+public:
+    SavedHistory(Vector<RefPtr<HistoryItem>>& entries);
+    virtual ~SavedHistory();
+
+    const Vector<RefPtr<HistoryItem>>& entries() const { return m_entries; }
+private:
+    Vector<RefPtr<HistoryItem>> m_entries;
+};
 } // namespace Test
 
 #define TEST_REPLAY_INPUT_NAMES_FOR_EACH(macro) \
     macro(ArrayOfThings) \
+    macro(SavedHistory) \
     \
 // end of TEST_REPLAY_INPUT_NAMES_FOR_EACH
 

Modified: trunk/Source/_javascript_Core/replay/scripts/tests/generate-input-with-vector-members.json (171683 => 171684)


--- trunk/Source/_javascript_Core/replay/scripts/tests/generate-input-with-vector-members.json	2014-07-28 19:22:43 UTC (rev 171683)
+++ trunk/Source/_javascript_Core/replay/scripts/tests/generate-input-with-vector-members.json	2014-07-28 19:31:03 UTC (rev 171684)
@@ -9,7 +9,11 @@
         ],
 
         "WebCore": [
-            { "name": "WebThing", "mode": "SCALAR", "header": "things/WebThing.h"  }
+            { "name": "WebThing", "mode": "SCALAR", "header": "things/WebThing.h" },
+            {
+                "name": "HistoryItem", "mode": "SHARED",
+                "header": "history/HistoryItem.h"
+            }
         ]
     },
 
@@ -23,6 +27,14 @@
                 { "name": "jsthings", "type": "JSThing", "flags": ["VECTOR"] },
                 { "name": "webthings", "type": "WebThing", "flags": ["VECTOR"] }
             ]
+        },
+        {
+            "name": "SavedHistory",
+            "description": "Save history items.",
+            "queue": "SCRIPT_MEMOIZED",
+            "members": [
+                { "name": "entries", "type": "HistoryItem", "flags": ["VECTOR"] }
+            ]
         }
     ]
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to