diff --git a/ecmascript/builtins/builtins_typedarray.cpp b/ecmascript/builtins/builtins_typedarray.cpp index 05b6e20918cf00f41ee1c7d11127bd802a0a0bc8..58eed9d0accd681ff8156702e23bd006c0ac2001 100644 --- a/ecmascript/builtins/builtins_typedarray.cpp +++ b/ecmascript/builtins/builtins_typedarray.cpp @@ -731,6 +731,13 @@ JSTaggedValue BuiltinsTypedArray::IndexOf(EcmaRuntimeCallInfo *argv) if (!GetThis(argv)->IsTypedArray()) { THROW_TYPE_ERROR_AND_RETURN(argv->GetThread(), "This is not a TypedArray.", JSTaggedValue::Exception()); } + + JSHandle typedArray(GetThis(argv)); + JSTaggedValue srcBuffer = typedArray->GetViewedArrayBufferOrByteArray(); + if (BuiltinsArrayBuffer::IsDetachedBuffer(srcBuffer)) { + THROW_TYPE_ERROR_AND_RETURN(argv->GetThread(), "The ArrayBuffer of typedArray is detached buffer.", + JSTaggedValue::Exception()); + } return BuiltinsArray::IndexOf(argv); } @@ -858,6 +865,13 @@ JSTaggedValue BuiltinsTypedArray::LastIndexOf(EcmaRuntimeCallInfo *argv) if (!GetThis(argv)->IsTypedArray()) { THROW_TYPE_ERROR_AND_RETURN(argv->GetThread(), "This is not a TypedArray.", JSTaggedValue::Exception()); } + + JSHandle typedArray(GetThis(argv)); + JSTaggedValue srcBuffer = typedArray->GetViewedArrayBufferOrByteArray(); + if (BuiltinsArrayBuffer::IsDetachedBuffer(srcBuffer)) { + THROW_TYPE_ERROR_AND_RETURN(argv->GetThread(), "The ArrayBuffer of typedArray is detached buffer.", + JSTaggedValue::Exception()); + } return BuiltinsArray::LastIndexOf(argv); } diff --git a/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp b/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp index 217a2fdcfda2c0743baccda05863e7f5f0b77e4b..8ce1a96530d2bdd9d7db8ce3997b7c328eeee427 100644 --- a/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp +++ b/ecmascript/compiler/builtins/builtins_typedarray_stub_builder.cpp @@ -503,6 +503,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); @@ -510,6 +511,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); @@ -608,12 +612,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))); diff --git a/test/regresstest/regresstest_skip_tests.json b/test/regresstest/regresstest_skip_tests.json index e072538f5182b3244876130f97e47dc14a4a8677..0a7d7d9bd63c36e8b1368112b48b9f1d452c8757 100644 --- a/test/regresstest/regresstest_skip_tests.json +++ b/test/regresstest/regresstest_skip_tests.json @@ -3132,7 +3132,6 @@ "mjsunit/es6/block-scope-class.js", "mjsunit/es6/regexp-flags.js", "mjsunit/es6/proxies-revocable.js", - "mjsunit/es6/typedarray-indexing.js", "mjsunit/es6/typedarray-filter.js", "mjsunit/es6/string-includes.js", "mjsunit/async-hooks/api-methods.js",