diff --git a/ecmascript/builtins/builtins_arraybuffer.cpp b/ecmascript/builtins/builtins_arraybuffer.cpp index 16eba24f57607aa8f1dfefd92b84d3b32099edb0..1e99a5f7998de52a67e3ff585f3d7cd6062dec18 100644 --- a/ecmascript/builtins/builtins_arraybuffer.cpp +++ b/ecmascript/builtins/builtins_arraybuffer.cpp @@ -709,6 +709,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 020c7af72a3ba19f3e2a270aeb8d2add710a56bc..5e5f563beb6158f2f09720fbe2902dae87cca420 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/compiler/builtins/builtins_typedarray_stub_builder.cpp b/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp index 0e2bd3e32c4b58108b313751e8f7597a490287db..f543202187702175f7b510f95086225a101f897c 100644 --- a/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp +++ b/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp @@ -437,6 +437,8 @@ void BuiltinsTypedArrayStubBuilder::Reverse(GateRef glue, GateRef thisValue, [[m Label typedArray(env); Label isFastTypedArray(env); Label defaultConstr(env); + Label notDetached(env); + BRANCH(IsEcmaObject(thisValue), &ecmaObj, slowPath); Bind(&ecmaObj); BRANCH(IsTypedArray(thisValue), &typedArray, slowPath); @@ -446,6 +448,9 @@ void BuiltinsTypedArrayStubBuilder::Reverse(GateRef glue, GateRef thisValue, [[m Bind(&isFastTypedArray); BRANCH(HasConstructor(thisValue), slowPath, &defaultConstr); Bind(&defaultConstr); + GateRef buffer = GetViewedArrayBuffer(thisValue); + BRANCH(IsDetachedBuffer(buffer), slowPath, ¬Detached); + Bind(¬Detached); DEFVARIABLE(thisArrLen, VariableType::INT64(), ZExtInt32ToInt64(GetArrayLength(thisValue))); GateRef middle = Int64Div(*thisArrLen, Int64(2)); @@ -502,6 +507,7 @@ void BuiltinsTypedArrayStubBuilder::LastIndexOf(GateRef glue, GateRef thisValue, Label thisExists(env); Label isHeapObject(env); Label typedArray(env); + Label notDetached(env); BRANCH(TaggedIsUndefinedOrNull(thisValue), slowPath, &thisExists); Bind(&thisExists); @@ -509,6 +515,9 @@ void BuiltinsTypedArrayStubBuilder::LastIndexOf(GateRef glue, GateRef thisValue, Bind(&isHeapObject); BRANCH(IsTypedArray(thisValue), &typedArray, slowPath); Bind(&typedArray); + GateRef buffer = GetViewedArrayBuffer(thisValue); + BRANCH(IsDetachedBuffer(buffer), slowPath, ¬Detached); + Bind(¬Detached); GateRef len = ZExtInt32ToInt64(GetArrayLength(thisValue)); Label isEmptyArray(env); @@ -607,12 +616,16 @@ void BuiltinsTypedArrayStubBuilder::IndexOf(GateRef glue, GateRef thisValue, Gat Label ecmaObj(env); Label typedArray(env); Label defaultConstr(env); + Label notDetached(env); BRANCH(IsEcmaObject(thisValue), &ecmaObj, slowPath); Bind(&ecmaObj); BRANCH(IsTypedArray(thisValue), &typedArray, slowPath); Bind(&typedArray); BRANCH(HasConstructor(thisValue), slowPath, &defaultConstr); Bind(&defaultConstr); + GateRef buffer = GetViewedArrayBuffer(thisValue); + BRANCH(IsDetachedBuffer(buffer), slowPath, ¬Detached); + Bind(¬Detached); DEFVARIABLE(fromIndex, VariableType::INT64(), Int64(0)); DEFVARIABLE(thisArrLen, VariableType::INT64(), ZExtInt32ToInt64(GetArrayLength(thisValue))); @@ -1202,12 +1215,18 @@ void BuiltinsTypedArrayStubBuilder::Every(GateRef glue, GateRef thisValue, Gate Label isHeapObject(env); Label typedArray(env); Label defaultConstr(env); + Label notDetached(env); + BRANCH(TaggedIsHeapObject(thisValue), &isHeapObject, slowPath); Bind(&isHeapObject); BRANCH(IsTypedArray(thisValue), &typedArray, slowPath); Bind(&typedArray); BRANCH(HasConstructor(thisValue), slowPath, &defaultConstr); Bind(&defaultConstr); + GateRef buffer = GetViewedArrayBuffer(thisValue); + BRANCH(IsDetachedBuffer(buffer), slowPath, ¬Detached); + Bind(¬Detached); + Label arg0HeapObject(env); Label callable(env); GateRef callbackFnHandle = GetCallArg0(numArgs); diff --git a/ecmascript/js_typed_array.cpp b/ecmascript/js_typed_array.cpp index 2744c04273b265439f4d0c4727116b1fde4dac9b..b476876347a92e2a53ca61cf4022a02093543fea 100644 --- a/ecmascript/js_typed_array.cpp +++ b/ecmascript/js_typed_array.cpp @@ -392,6 +392,9 @@ OperationResult JSTypedArray::IntegerIndexedElementGet(JSThread *thread, const J JSTaggedValue buffer = typedarrayObj->GetViewedArrayBufferOrByteArray(); // 4. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. if (!buffer.IsSendableArrayBuffer() && 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))); } diff --git a/test/regresstest/regresstest_skip_tests.json b/test/regresstest/regresstest_skip_tests.json index 0983e1afc517f52415096b1b18446ee21dc11fbd..2e31ba706cd0e5bef481f712a222181d5cf8e358 100644 --- a/test/regresstest/regresstest_skip_tests.json +++ b/test/regresstest/regresstest_skip_tests.json @@ -2997,11 +2997,9 @@ "mjsunit/es6/unicode-regexp-ignore-case.js", "mjsunit/es6/proxies-bind.js", "mjsunit/es6/map-iterator-6.js", - "mjsunit/es6/typedarray-every.js", "mjsunit/es6/block-conflicts-sloppy.js", "mjsunit/es6/proxies.js", "mjsunit/es6/iterator-call-lazy-deopt.js", - "mjsunit/es6/typedarray-foreach.js", "mjsunit/es6/array-copywithin.js", "mjsunit/es6/set-iterator-7.js", "mjsunit/es6/map-iterator-1.js",