void-packages/srcpkgs/webkit2gtk/patches/be-typedarray.patch
2021-07-31 23:59:46 +02:00

261 lines
9.6 KiB
Diff

Source: Jacek Piszczek <jacek.piszczek@runbox.com>
https://tenfourfox.tenderapp.com/discussions/problems/7505-problems-uploading-to-facebook
Updated by @q66.
diff --git Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h
index dbe211d..4da5fbd 100644
--- a/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h
+++ b/Source/JavaScriptCore/runtime/JSGenericTypedArrayView.h
@@ -28,6 +28,7 @@
#include "JSArrayBufferView.h"
#include "ThrowScope.h"
#include "ToNativeFromValue.h"
+#include <wtf/FlipBytes.h>
namespace JSC {
@@ -146,7 +147,18 @@ public:
JSValue getIndexQuickly(unsigned i) const
{
+#if CPU(BIG_ENDIAN)
+ switch (Adaptor::typeValue) {
+ case TypeFloat32:
+ case TypeFloat64:
+ return Adaptor::toJSValue(nullptr, getIndexQuicklyAsNativeValue(i));
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ return Adaptor::toJSValue(nullptr, flipBytes(getIndexQuicklyAsNativeValue(i)));
+ }
+#else
return Adaptor::toJSValue(nullptr, getIndexQuicklyAsNativeValue(i));
+#endif
}
void setIndexQuicklyToNativeValue(unsigned i, typename Adaptor::Type value)
@@ -158,7 +170,20 @@ public:
void setIndexQuickly(unsigned i, JSValue value)
{
ASSERT(!value.isObject());
+#if CPU(BIG_ENDIAN)
+ switch (Adaptor::typeValue) {
+ case TypeFloat32:
+ case TypeFloat64:
+ setIndexQuicklyToNativeValue(i, toNativeFromValue<Adaptor>(value));
+ break;
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ setIndexQuicklyToNativeValue(i, flipBytes(toNativeFromValue<Adaptor>(value)));
+ break;
+ }
+#else
setIndexQuicklyToNativeValue(i, toNativeFromValue<Adaptor>(value));
+#endif
}
bool setIndex(JSGlobalObject* globalObject, unsigned i, JSValue jsValue)
@@ -172,13 +197,54 @@ public:
if (isDetached() || i >= m_length)
return false;
+#if CPU(BIG_ENDIAN)
+ switch (Adaptor::typeValue) {
+ case TypeFloat32:
+ case TypeFloat64:
+ setIndexQuicklyToNativeValue(i, value);
+ break;
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ setIndexQuicklyToNativeValue(i, flipBytes(value));
+ break;
+ }
+#else
setIndexQuicklyToNativeValue(i, value);
+#endif
return true;
}
- static ElementType toAdaptorNativeFromValue(JSGlobalObject* globalObject, JSValue jsValue) { return toNativeFromValue<Adaptor>(globalObject, jsValue); }
+ static ElementType toAdaptorNativeFromValue(JSGlobalObject* globalObject, JSValue jsValue)
+ {
+#if CPU(BIG_ENDIAN)
+ switch (Adaptor::typeValue) {
+ case TypeFloat32:
+ case TypeFloat64:
+ return toNativeFromValue<Adaptor>(globalObject, jsValue);
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ return flipBytes(toNativeFromValue<Adaptor>(globalObject, jsValue));
+ }
+#else
+ return toNativeFromValue<Adaptor>(globalObject, jsValue);
+#endif
+ }
- static Optional<ElementType> toAdaptorNativeFromValueWithoutCoercion(JSValue jsValue) { return toNativeFromValueWithoutCoercion<Adaptor>(jsValue); }
+ static Optional<ElementType> toAdaptorNativeFromValueWithoutCoercion(JSValue jsValue)
+ {
+#if CPU(BIG_ENDIAN)
+ switch (Adaptor::typeValue) {
+ case TypeFloat32:
+ case TypeFloat64:
+ return toNativeFromValueWithoutCoercion<Adaptor>(jsValue);
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ return flipBytes(toNativeFromValueWithoutCoercion<Adaptor>(jsValue));
+ }
+#else
+ return toNativeFromValueWithoutCoercion<Adaptor>(jsValue);
+#endif
+ }
void sort()
{
diff --git Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h
index 126f33c..0913af5 100644
--- a/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h
+++ b/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h
@@ -208,9 +208,36 @@ ALWAYS_INLINE EncodedJSValue genericTypedArrayViewProtoFuncIncludes(VM& vm, JSGl
scope.assertNoException();
RELEASE_ASSERT(!thisObject->isDetached());
- if (std::isnan(static_cast<double>(*targetOption))) {
+ double targetOptionLittleEndianAsDouble;
+#if CPU(BIG_ENDIAN)
+ switch (ViewClass::TypedArrayStorageType) {
+ case TypeFloat32:
+ case TypeFloat64:
+ targetOptionLittleEndianAsDouble = static_cast<double>(*targetOption);
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ targetOptionLittleEndianAsDouble = static_cast<double>(flipBytes(*targetOption));
+ }
+#else
+ targetOptionLittleEndianAsDouble = static_cast<double>(*targetOption);
+#endif
+
+ if (std::isnan(targetOptionLittleEndianAsDouble)) {
for (; index < length; ++index) {
- if (std::isnan(static_cast<double>(array[index])))
+ double arrayElementLittleEndianAsDouble;
+#if CPU(BIG_ENDIAN)
+ switch (ViewClass::TypedArrayStorageType) {
+ case TypeFloat32:
+ case TypeFloat64:
+ arrayElementLittleEndianAsDouble = static_cast<double>(array[index]);
+ default:
+ // typed array views are commonly expected to be little endian views of the underlying data
+ arrayElementLittleEndianAsDouble = static_cast<double>(flipBytes(array[index]));
+ }
+#else
+ arrayElementLittleEndianAsDouble = static_cast<double>(array[index]);
+#endif
+ if (std::isnan(arrayElementLittleEndianAsDouble))
return JSValue::encode(jsBoolean(true));
}
} else {
diff --git Source/WTF/wtf/FlipBytes.h Source/WTF/wtf/FlipBytes.h
index 6cd7126..24708f7 100644
--- a/Source/WTF/wtf/FlipBytes.h
+++ b/Source/WTF/wtf/FlipBytes.h
@@ -24,6 +24,7 @@
*/
#pragma once
+#include "Optional.h"
namespace WTF {
@@ -98,6 +99,42 @@ inline T flipBytes(T value)
return T();
}
+template<typename T>
+inline T flipBytes(WTF::Optional<T> value)
+{
+ if (sizeof(*value) == 1)
+ return *value;
+ if (sizeof(*value) == 2) {
+ union {
+ T original;
+ uint16_t word;
+ } u;
+ u.original = *value;
+ u.word = flipBytes(u.word);
+ return u.original;
+ }
+ if (sizeof(*value) == 4) {
+ union {
+ T original;
+ uint32_t word;
+ } u;
+ u.original = *value;
+ u.word = flipBytes(u.word);
+ return u.original;
+ }
+ if (sizeof(*value) == 8) {
+ union {
+ T original;
+ uint64_t word;
+ } u;
+ u.original = *value;
+ u.word = flipBytes(u.word);
+ return u.original;
+ }
+ RELEASE_ASSERT_NOT_REACHED();
+ return T();
+}
+
template<typename T>
inline T flipBytesIfLittleEndian(T value, bool littleEndian)
{
diff --git a/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h b/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
index 33be4058..1a6d69fd 100644
--- a/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
+++ b/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
@@ -179,3 +179,9 @@
#else
#define OFFLINE_ASM_HAVE_FAST_TLS 0
#endif
+
+#if CPU(BIG_ENDIAN)
+#define OFFLINE_ASM_BIG_ENDIAN 1
+#else
+#define OFFLINE_ASM_BIG_ENDIAN 0
+#endif
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
index 20c0c40b..10c58846 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
@@ -1667,7 +1667,11 @@ llintOpWithMetadata(op_get_by_val, OpGetByVal, macro (size, get, dispatch, metad
.opGetByValNotDouble:
subi ArrayStorageShape, t2
- bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValNotIndexedStorage
+ if BIG_ENDIAN
+ bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValSlow
+ else
+ bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValNotIndexedStorage
+ end
biaeq t1, -sizeof IndexingHeader + IndexingHeader::u.lengths.vectorLength[t3], .opGetByValSlow
loadi ArrayStorage::m_vector + TagOffset[t3, t1, 8], t2
loadi ArrayStorage::m_vector + PayloadOffset[t3, t1, 8], t1
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
index 27e76d2f..bfb2a46e 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
@@ -1721,7 +1721,11 @@ llintOpWithMetadata(op_get_by_val, OpGetByVal, macro (size, get, dispatch, metad
.opGetByValNotDouble:
subi ArrayStorageShape, t2
- bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValNotIndexedStorage
+ if BIG_ENDIAN
+ bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValSlow
+ else
+ bia t2, SlowPutArrayStorageShape - ArrayStorageShape, .opGetByValNotIndexedStorage
+ end
biaeq t1, -sizeof IndexingHeader + IndexingHeader::u.lengths.vectorLength[t3], .opGetByValSlow
get(m_dst, t0)
loadq ArrayStorage::m_vector[t3, t1, 8], t2