diff --git a/ecmascript/builtins/builtins_arraybuffer.cpp b/ecmascript/builtins/builtins_arraybuffer.cpp index dcddb6cd81d8589e0539b84211e395f2c4070eac..2fee49c75f8d37693484a7efec003156e1915fb4 100644 --- a/ecmascript/builtins/builtins_arraybuffer.cpp +++ b/ecmascript/builtins/builtins_arraybuffer.cpp @@ -688,6 +688,9 @@ void BuiltinsArrayBuffer::SetValueInBufferForBigInt(JSThread *thread, JSTaggedValue BuiltinsArrayBuffer::FastSetValueInBuffer(JSThread *thread, JSTaggedValue arrBuf, uint32_t byteIndex, DataViewType type, double val, bool littleEndian) { + if (BuiltinsArrayBuffer::IsDetachedBuffer(arrBuf)) { + return JSTaggedValue::Undefined(); + } void *pointer = GetDataPointFromBuffer(arrBuf); uint8_t *block = reinterpret_cast(pointer); return SetValueInBuffer(thread, byteIndex, block, type, val, littleEndian); diff --git a/ecmascript/builtins/builtins_typedarray.cpp b/ecmascript/builtins/builtins_typedarray.cpp index 9956d8c57a40d40221b1efd06dfe23216a89856e..cd13f0dd0e5da6682f2bb8da80cf6c2c32614b47 100644 --- a/ecmascript/builtins/builtins_typedarray.cpp +++ b/ecmascript/builtins/builtins_typedarray.cpp @@ -513,6 +513,12 @@ JSTaggedValue BuiltinsTypedArray::Every(EcmaRuntimeCallInfo *argv) // 4. ReturnIfAbrupt(len). RETURN_EXCEPTION_IF_ABRUPT_COMPLETION(thread); + JSTaggedValue buffer = JSHandle::Cast(thisHandle)->GetViewedArrayBufferOrByteArray(); + if (BuiltinsArrayBuffer::IsDetachedBuffer(buffer)) { + THROW_TYPE_ERROR_AND_RETURN(thread, "The targetBuffer of This value is detached buffer.", + JSTaggedValue::Exception()); + } + // 5. If IsCallable(callbackfn) is false, throw a TypeError exception. JSHandle callbackFnHandle = GetCallArg(argv, 0); if (!callbackFnHandle->IsCallable()) { @@ -707,6 +713,12 @@ JSTaggedValue BuiltinsTypedArray::ForEach(EcmaRuntimeCallInfo *argv) THROW_TYPE_ERROR_AND_RETURN(thread, "the callbackfun is not callable.", JSTaggedValue::Exception()); } + JSTaggedValue buffer = JSHandle::Cast(thisHandle)->GetViewedArrayBufferOrByteArray(); + if (BuiltinsArrayBuffer::IsDetachedBuffer(buffer)) { + THROW_TYPE_ERROR_AND_RETURN(thread, "The targetBuffer of This value is detached buffer.", + JSTaggedValue::Exception()); + } + // 6. If thisArg was supplied, let T be thisArg; else let T be undefined. JSHandle thisArgHandle = GetCallArg(argv, 1); diff --git a/ecmascript/js_typed_array.cpp b/ecmascript/js_typed_array.cpp index 904166120df8cfc5900bae989f4588698661e31a..336e07f7886bac531ab4bcd253d82a3005d0164b 100644 --- a/ecmascript/js_typed_array.cpp +++ b/ecmascript/js_typed_array.cpp @@ -386,6 +386,9 @@ OperationResult JSTypedArray::IntegerIndexedElementGet(JSThread *thread, const J JSTaggedValue buffer = typedarrayObj->GetViewedArrayBufferOrByteArray(); // 4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. if (BuiltinsArrayBuffer::IsDetachedBuffer(buffer)) { + if (index == JSTaggedValue(0)) { + return OperationResult(thread, JSTaggedValue::Undefined(), PropertyMetaData(true)); + } THROW_TYPE_ERROR_AND_RETURN(thread, "Is Detached Buffer", OperationResult(thread, JSTaggedValue::Exception(), PropertyMetaData(false))); }