diff options
Diffstat (limited to 'Source/WebCore/bindings/js/SerializedScriptValue.cpp')
-rw-r--r-- | Source/WebCore/bindings/js/SerializedScriptValue.cpp | 92 |
1 files changed, 42 insertions, 50 deletions
diff --git a/Source/WebCore/bindings/js/SerializedScriptValue.cpp b/Source/WebCore/bindings/js/SerializedScriptValue.cpp index b3d07ca..a9c1b24 100644 --- a/Source/WebCore/bindings/js/SerializedScriptValue.cpp +++ b/Source/WebCore/bindings/js/SerializedScriptValue.cpp @@ -206,6 +206,45 @@ protected: MarkedArgumentBuffer m_gcBuffer; }; +#if ASSUME_LITTLE_ENDIAN +template <typename T> static void writeLittleEndian(Vector<uint8_t>& buffer, T value) +{ + buffer.append(reinterpret_cast<uint8_t*>(&value), sizeof(value)); +} +#else +template <typename T> static void writeLittleEndian(Vector<uint8_t>& buffer, T value) +{ + for (unsigned i = 0; i < sizeof(T); i++) { + buffer.append(value & 0xFF); + value >>= 8; + } +} +#endif + +template <> void writeLittleEndian<uint8_t>(Vector<uint8_t>& buffer, uint8_t value) +{ + buffer.append(value); +} + +template <typename T> static bool writeLittleEndian(Vector<uint8_t>& buffer, const T* values, uint32_t length) +{ + if (length > numeric_limits<uint32_t>::max() / sizeof(T)) + return false; + +#if ASSUME_LITTLE_ENDIAN + buffer.append(reinterpret_cast<const uint8_t*>(values), length * sizeof(T)); +#else + for (unsigned i = 0; i < length; i++) { + T value = values[i]; + for (unsigned j = 0; j < sizeof(T); j++) { + buffer.append(static_cast<uint8_t>(value & 0xFF)); + value >>= 8; + } + } +#endif + return true; +} + class CloneSerializer : CloneBase { public: static bool serialize(ExecState* exec, JSValue value, Vector<uint8_t>& out) @@ -444,43 +483,6 @@ private: writeLittleEndian(m_buffer, c); } -#if ASSUME_LITTLE_ENDIAN - template <typename T> static void writeLittleEndian(Vector<uint8_t>& buffer, T value) - { - if (sizeof(T) == 1) - buffer.append(value); - else - buffer.append(reinterpret_cast<uint8_t*>(&value), sizeof(value)); - } -#else - template <typename T> static void writeLittleEndian(Vector<uint8_t>& buffer, T value) - { - for (unsigned i = 0; i < sizeof(T); i++) { - buffer.append(value & 0xFF); - value >>= 8; - } - } -#endif - - template <typename T> static bool writeLittleEndian(Vector<uint8_t>& buffer, const T* values, uint32_t length) - { - if (length > numeric_limits<uint32_t>::max() / sizeof(T)) - return false; - -#if ASSUME_LITTLE_ENDIAN - buffer.append(reinterpret_cast<const uint8_t*>(values), length * sizeof(T)); -#else - for (unsigned i = 0; i < length; i++) { - T value = values[i]; - for (unsigned j = 0; j < sizeof(T); j++) { - buffer.append(static_cast<uint8_t>(value & 0xFF)); - value >>= 8; - } - } -#endif - return true; - } - void write(uint32_t i) { writeLittleEndian(m_buffer, i); @@ -870,12 +872,7 @@ private: if (sizeof(T) == 1) value = *ptr++; else { -#if CPU(ARMV5_OR_LOWER) - // To protect misaligned memory access. - memcpy(&value, ptr, sizeof(T)); -#else value = *reinterpret_cast<const T*>(ptr); -#endif ptr += sizeof(T); } return true; @@ -968,14 +965,7 @@ private: return false; #if ASSUME_LITTLE_ENDIAN -#if CPU(ARMV5_OR_LOWER) - // To protect misaligned memory access. - Vector<UChar> alignedBuffer(length); - memcpy(alignedBuffer.data(), ptr, length * sizeof(UChar)); - str = UString::adopt(alignedBuffer); -#else str = UString(reinterpret_cast<const UChar*>(ptr), length); -#endif ptr += length * sizeof(UChar); #else Vector<UChar> buffer; @@ -1176,7 +1166,9 @@ private: CachedStringRef flags; if (!readStringData(flags)) return JSValue(); - RefPtr<RegExp> regExp = RegExp::create(&m_exec->globalData(), pattern->ustring(), flags->ustring()); + RegExpFlags reFlags = regExpFlags(flags->ustring()); + ASSERT(reFlags != InvalidFlags); + RefPtr<RegExp> regExp = RegExp::create(&m_exec->globalData(), pattern->ustring(), reFlags); return new (m_exec) RegExpObject(m_exec->lexicalGlobalObject(), m_globalObject->regExpStructure(), regExp); } case ObjectReferenceTag: { |