From a009bba3a04b055da25801473a566e9d2b8c325d Mon Sep 17 00:00:00 2001 From: liujia178 Date: Tue, 23 Apr 2024 14:00:12 +1030 Subject: [PATCH] If IsDetachedBuffer expected TypeError --- ecmascript/builtins/builtins_typedarray.cpp | 14 ++++++++++++++ .../builtins/builtins_typedarray_stub_builder.cpp | 8 ++++++++ test/regresstest/regresstest_skip_tests.json | 1 - 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ecmascript/builtins/builtins_typedarray.cpp b/ecmascript/builtins/builtins_typedarray.cpp index 05b6e2091..58eed9d0a 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 217a2fdcf..8ce1a9653 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 e072538f5..0a7d7d9bd 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", -- Gitee