From 232830353aaf4e8b1b70379da42589eaeb41acb7 Mon Sep 17 00:00:00 2001 From: liujia178 Date: Wed, 17 Apr 2024 16:37:09 +1030 Subject: [PATCH] =?UTF-8?q?Fix=20mjsunit/es6/typedarray-every.js=E3=80=81m?= =?UTF-8?q?jsunit/es6/typedarray-foreach.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liujia178 --- ecmascript/builtins/builtins_arraybuffer.cpp | 3 +++ ecmascript/builtins/builtins_typedarray.cpp | 12 ++++++++++++ .../builtins_typedarray_stub_builder.cpp | 19 +++++++++++++++++++ ecmascript/js_typed_array.cpp | 3 +++ test/regresstest/regresstest_skip_tests.json | 2 -- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/ecmascript/builtins/builtins_arraybuffer.cpp b/ecmascript/builtins/builtins_arraybuffer.cpp index 16eba24f5..1e99a5f79 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 020c7af72..5e5f563be 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 0e2bd3e32..f54320218 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 2744c0427..b47687634 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 0983e1afc..2e31ba706 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", -- Gitee