diff options
Diffstat (limited to 'js/src/jit/VMFunctions.cpp')
-rw-r--r-- | js/src/jit/VMFunctions.cpp | 82 |
1 files changed, 44 insertions, 38 deletions
diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index 29777d08c7..ed3f63c88c 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -2557,13 +2557,14 @@ BigInt* BigIntAsUintN(JSContext* cx, HandleBigInt x, int32_t bits) { } template <typename T> -static int32_t AtomicsCompareExchange(FixedLengthTypedArrayObject* typedArray, +static int32_t AtomicsCompareExchange(TypedArrayObject* typedArray, size_t index, int32_t expected, int32_t replacement) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::compareExchangeSeqCst(addr + index, T(expected), @@ -2590,12 +2591,13 @@ AtomicsCompareExchangeFn AtomicsCompareExchange(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsExchange(FixedLengthTypedArrayObject* typedArray, - size_t index, int32_t value) { +static int32_t AtomicsExchange(TypedArrayObject* typedArray, size_t index, + int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::exchangeSeqCst(addr + index, T(value)); @@ -2621,12 +2623,13 @@ AtomicsReadWriteModifyFn AtomicsExchange(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsAdd(FixedLengthTypedArrayObject* typedArray, size_t index, +static int32_t AtomicsAdd(TypedArrayObject* typedArray, size_t index, int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::fetchAddSeqCst(addr + index, T(value)); @@ -2652,12 +2655,13 @@ AtomicsReadWriteModifyFn AtomicsAdd(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsSub(FixedLengthTypedArrayObject* typedArray, size_t index, +static int32_t AtomicsSub(TypedArrayObject* typedArray, size_t index, int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::fetchSubSeqCst(addr + index, T(value)); @@ -2683,12 +2687,13 @@ AtomicsReadWriteModifyFn AtomicsSub(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsAnd(FixedLengthTypedArrayObject* typedArray, size_t index, +static int32_t AtomicsAnd(TypedArrayObject* typedArray, size_t index, int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::fetchAndSeqCst(addr + index, T(value)); @@ -2714,12 +2719,13 @@ AtomicsReadWriteModifyFn AtomicsAnd(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsOr(FixedLengthTypedArrayObject* typedArray, size_t index, +static int32_t AtomicsOr(TypedArrayObject* typedArray, size_t index, int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::fetchOrSeqCst(addr + index, T(value)); @@ -2745,12 +2751,13 @@ AtomicsReadWriteModifyFn AtomicsOr(Scalar::Type elementType) { } template <typename T> -static int32_t AtomicsXor(FixedLengthTypedArrayObject* typedArray, size_t index, +static int32_t AtomicsXor(TypedArrayObject* typedArray, size_t index, int32_t value) { AutoUnsafeCallWithABI unsafe; MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); SharedMem<T*> addr = typedArray->dataPointerEither().cast<T*>(); return jit::AtomicOperations::fetchXorSeqCst(addr + index, T(value)); @@ -2776,12 +2783,12 @@ AtomicsReadWriteModifyFn AtomicsXor(Scalar::Type elementType) { } template <typename AtomicOp, typename... Args> -static BigInt* AtomicAccess64(JSContext* cx, - FixedLengthTypedArrayObject* typedArray, +static BigInt* AtomicAccess64(JSContext* cx, TypedArrayObject* typedArray, size_t index, AtomicOp op, Args... args) { MOZ_ASSERT(Scalar::isBigIntType(typedArray->type())); MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); if (typedArray->type() == Scalar::BigInt64) { SharedMem<int64_t*> addr = typedArray->dataPointerEither().cast<int64_t*>(); @@ -2795,11 +2802,12 @@ static BigInt* AtomicAccess64(JSContext* cx, } template <typename AtomicOp, typename... Args> -static auto AtomicAccess64(FixedLengthTypedArrayObject* typedArray, - size_t index, AtomicOp op, Args... args) { +static auto AtomicAccess64(TypedArrayObject* typedArray, size_t index, + AtomicOp op, Args... args) { MOZ_ASSERT(Scalar::isBigIntType(typedArray->type())); MOZ_ASSERT(!typedArray->hasDetachedBuffer()); - MOZ_ASSERT(index < typedArray->length()); + MOZ_ASSERT_IF(typedArray->hasResizableBuffer(), !typedArray->isOutOfBounds()); + MOZ_ASSERT(index < typedArray->length().valueOr(0)); if (typedArray->type() == Scalar::BigInt64) { SharedMem<int64_t*> addr = typedArray->dataPointerEither().cast<int64_t*>(); @@ -2810,14 +2818,14 @@ static auto AtomicAccess64(FixedLengthTypedArrayObject* typedArray, return op(addr + index, BigInt::toUint64(args)...); } -BigInt* AtomicsLoad64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, +BigInt* AtomicsLoad64(JSContext* cx, TypedArrayObject* typedArray, size_t index) { return AtomicAccess64(cx, typedArray, index, [](auto addr) { return jit::AtomicOperations::loadSeqCst(addr); }); } -void AtomicsStore64(FixedLengthTypedArrayObject* typedArray, size_t index, +void AtomicsStore64(TypedArrayObject* typedArray, size_t index, const BigInt* value) { AutoUnsafeCallWithABI unsafe; @@ -2829,8 +2837,7 @@ void AtomicsStore64(FixedLengthTypedArrayObject* typedArray, size_t index, value); } -BigInt* AtomicsCompareExchange64(JSContext* cx, - FixedLengthTypedArrayObject* typedArray, +BigInt* AtomicsCompareExchange64(JSContext* cx, TypedArrayObject* typedArray, size_t index, const BigInt* expected, const BigInt* replacement) { return AtomicAccess64( @@ -2842,9 +2849,8 @@ BigInt* AtomicsCompareExchange64(JSContext* cx, expected, replacement); } -BigInt* AtomicsExchange64(JSContext* cx, - FixedLengthTypedArrayObject* typedArray, size_t index, - const BigInt* value) { +BigInt* AtomicsExchange64(JSContext* cx, TypedArrayObject* typedArray, + size_t index, const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { @@ -2853,8 +2859,8 @@ BigInt* AtomicsExchange64(JSContext* cx, value); } -BigInt* AtomicsAdd64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, - size_t index, const BigInt* value) { +BigInt* AtomicsAdd64(JSContext* cx, TypedArrayObject* typedArray, size_t index, + const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { @@ -2863,8 +2869,8 @@ BigInt* AtomicsAdd64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, value); } -BigInt* AtomicsAnd64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, - size_t index, const BigInt* value) { +BigInt* AtomicsAnd64(JSContext* cx, TypedArrayObject* typedArray, size_t index, + const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { @@ -2873,8 +2879,8 @@ BigInt* AtomicsAnd64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, value); } -BigInt* AtomicsOr64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, - size_t index, const BigInt* value) { +BigInt* AtomicsOr64(JSContext* cx, TypedArrayObject* typedArray, size_t index, + const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { @@ -2883,8 +2889,8 @@ BigInt* AtomicsOr64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, value); } -BigInt* AtomicsSub64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, - size_t index, const BigInt* value) { +BigInt* AtomicsSub64(JSContext* cx, TypedArrayObject* typedArray, size_t index, + const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { @@ -2893,8 +2899,8 @@ BigInt* AtomicsSub64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, value); } -BigInt* AtomicsXor64(JSContext* cx, FixedLengthTypedArrayObject* typedArray, - size_t index, const BigInt* value) { +BigInt* AtomicsXor64(JSContext* cx, TypedArrayObject* typedArray, size_t index, + const BigInt* value) { return AtomicAccess64( cx, typedArray, index, [](auto addr, auto val) { |