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"] }
+ ]
}
]
}