!7982 Cherry-pick 7831 7446 7435to 4.0Release

Merge pull request !7982 from 贺存茂/7446To4
This commit is contained in:
openharmony_ci 2024-07-05 02:23:45 +00:00 committed by Gitee
commit ea5272846b
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
15 changed files with 115 additions and 40 deletions

View File

@ -733,6 +733,7 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
if (!enumCache.IsNull()) {
JSHandle<TaggedArray> cache(thread_, enumCache);
uint32_t length = cache->GetLength();
uint32_t dictStart = length;
for (uint32_t i = 0; i < length; i++) {
JSTaggedValue key = cache->Get(i);
if (!key.IsString()) {
@ -753,11 +754,41 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
if (obj->GetProperties().IsDictionary()) {
dictStart = i;
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
break;
}
}
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
if (dictStart < length) {
propertiesArr = JSHandle<TaggedArray>(thread_, obj->GetProperties());
JSHandle<NameDictionary> nameDic(propertiesArr);
for (uint32_t i = dictStart + 1;i < length; i++) {
JSTaggedValue key = cache->Get(i);
int hashIndex = nameDic->FindEntry(key);
PropertyAttributes attr = nameDic->GetAttributes(hashIndex);
if (!key.IsString() || hashIndex < 0 || !attr.IsEnumerable()) {
continue;
}
handleKey_.Update(key);
JSTaggedValue value = nameDic->GetValue(hashIndex);
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
}
return hasContent;
}
int end = static_cast<int>(jsHclass->NumberOfProps());
@ -783,6 +814,7 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
@ -808,6 +840,7 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
jsHclass = JSHandle<JSHClass>(thread_, obj->GetJSHClass());
}
handleValue_.Update(value);
@ -845,6 +878,7 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
@ -872,10 +906,14 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
JSTaggedValue entryKey = entry.first.GetTaggedValue();
handleKey_.Update(entryKey);
int index = nameDic->FindEntry(entryKey);
if (index < 0) {
continue;
}
JSTaggedValue value = nameDic->GetValue(index);
if (UNLIKELY(value.IsAccessor())) {
value = JSObject::CallGetter(thread_, AccessorData::Cast(value.GetTaggedObject()),
JSHandle<JSTaggedValue>(obj));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread_, false);
}
handleValue_.Update(value);
hasContent = JsonStringifier::AppendJsonString(obj, replacer, hasContent);
@ -884,6 +922,7 @@ bool JsonStringifier::SerializeKeys(const JSHandle<JSObject> &obj, const JSHandl
return hasContent;
}
bool JsonStringifier::AppendJsonString(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &replacer,
bool hasContent)
{

View File

@ -1278,6 +1278,10 @@ JSTaggedValue BuiltinsArray::Join(EcmaRuntimeCallInfo *argv)
if (k > 0) {
concatStr.append(sepStr);
}
if (concatStr.size() > EcmaString::MAX_STRING_LENGTH) {
context->JoinStackPopFastPath(thisHandle);
THROW_RANGE_ERROR_AND_RETURN(thread, "Invalid string length", JSTaggedValue::Exception());
}
concatStr.append(nextStr);
}
@ -2586,12 +2590,10 @@ JSTaggedValue BuiltinsArray::ToString(EcmaRuntimeCallInfo *argv)
callbackFnHandle = JSTaggedValue::GetProperty(thread, objectPrototype, toStringKey).GetValue();
RETURN_EXCEPTION_IF_ABRUPT_COMPLETION(thread);
}
const uint32_t argsLength = argv->GetArgsNumber();
JSHandle<JSTaggedValue> undefined = thread->GlobalConstants()->GetHandledUndefined();
EcmaRuntimeCallInfo *info =
EcmaInterpreter::NewRuntimeCallInfo(thread, callbackFnHandle, thisObjVal, undefined, argsLength);
EcmaInterpreter::NewRuntimeCallInfo(thread, callbackFnHandle, thisObjVal, undefined, 0);
RETURN_EXCEPTION_IF_ABRUPT_COMPLETION(thread);
info->SetCallArg(argsLength, 0, argv, 0);
return JSFunction::Call(info);
}

View File

@ -138,7 +138,6 @@ JSTaggedValue BuiltinsReflect::ReflectGet(EcmaRuntimeCallInfo *argv)
if (!val->IsECMAObject()) {
THROW_TYPE_ERROR_AND_RETURN(thread, "Reflect.get target is not object", JSTaggedValue::Exception());
}
JSHandle<JSObject> target = JSHandle<JSObject>::Cast(val);
// 2. Let key be ? ToPropertyKey(propertyKey).
JSHandle<JSTaggedValue> key = JSTaggedValue::ToPropertyKey(thread, GetCallArg(argv, 1));
RETURN_EXCEPTION_IF_ABRUPT_COMPLETION(thread);
@ -146,10 +145,10 @@ JSTaggedValue BuiltinsReflect::ReflectGet(EcmaRuntimeCallInfo *argv)
// a. Set receiver to target.
// 4. Return ? target.[[Get]](key, receiver).
if (argv->GetArgsNumber() == 2) { // 2: 2 means that there are 2 args in total
return JSObject::GetProperty(thread, target, key).GetValue().GetTaggedValue();
return JSTaggedValue::GetProperty(thread, val, key).GetValue().GetTaggedValue();
}
JSHandle<JSTaggedValue> receiver = GetCallArg(argv, BuiltinsBase::ArgsPosition::THIRD);
return JSObject::GetProperty(thread, val, key, receiver).GetValue().GetTaggedValue();
return JSTaggedValue::GetProperty(thread, val, key, receiver).GetValue().GetTaggedValue();
}
// ecma 26.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

View File

@ -781,7 +781,7 @@ JSTaggedValue BuiltinsTypedArray::Join(EcmaRuntimeCallInfo *argv)
const GlobalEnvConstants *globalConst = thread->GlobalConstants();
return globalConst->GetEmptyString();
}
size_t allocateLength = 0;
uint64_t allocateLength = 0;
bool isOneByte = (sep != BuiltinsTypedArray::SeparatorFlag::MINUS_ONE) ||
EcmaStringAccessor(sepStringHandle).IsUtf8();
CVector<JSHandle<EcmaString>> vec;
@ -806,7 +806,10 @@ JSTaggedValue BuiltinsTypedArray::Join(EcmaRuntimeCallInfo *argv)
vec.push_back(JSHandle<EcmaString>(globalConst->GetHandledEmptyString()));
}
}
allocateLength += sepLength * (length - 1);
allocateLength += static_cast<uint64_t>(sepLength) * (length - 1);
if (allocateLength > EcmaString::MAX_STRING_LENGTH) {
THROW_RANGE_ERROR_AND_RETURN(thread, "Invalid string length", JSTaggedValue::Exception());
}
if (allocateLength <= 1) {
// sep unused, set isOneByte to default(true)
isOneByte = true;

View File

@ -86,7 +86,6 @@ HWTEST_F_L0(BuiltinsNumberFormatTest, NumberFormatConstructor)
static JSTaggedValue BuiltinsFormatTest(JSThread *thread, JSHandle<JSObject> &options,
JSHandle<JSTaggedValue> &number, JSHandle<JSTaggedValue> &locale)
{
ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
JSHandle<JSFunction> newTarget(env->GetNumberFormatFunction());
@ -109,20 +108,13 @@ static JSTaggedValue BuiltinsFormatTest(JSThread *thread, JSHandle<JSObject> &op
JSTaggedValue resultFunc = BuiltinsNumberFormat::Format(ecmaRuntimeCallInfo2);
JSHandle<JSFunction> jsFunction(thread, resultFunc);
TestHelper::TearDownFrame(thread, prev);
JSArray *jsArray =
JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject());
JSHandle<JSObject> jsObject(thread, jsArray);
PropertyDescriptor desc(thread, JSHandle<JSTaggedValue>(jsFunction), true, true, true);
JSHandle<JSTaggedValue> joinKey(factory->NewFromASCII("join"));
JSArray::DefineOwnProperty(thread, jsObject, joinKey, desc);
auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
ecmaRuntimeCallInfo3->SetThis(jsObject.GetTaggedValue());
ecmaRuntimeCallInfo3->SetFunction(jsFunction.GetTaggedValue());
ecmaRuntimeCallInfo3->SetThis(jsFunction.GetTaggedValue());
ecmaRuntimeCallInfo3->SetCallArg(0, number.GetTaggedValue());
prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
JSTaggedValue result = BuiltinsArray::ToString(ecmaRuntimeCallInfo3);
JSTaggedValue result = JSFunction::Call(ecmaRuntimeCallInfo3);
TestHelper::TearDownFrame(thread, prev);
return result;
}

View File

@ -1425,6 +1425,13 @@ inline GateRef StubBuilder::IsInvalidPropertyBox(GateRef obj)
return TaggedIsHole(value);
}
inline GateRef StubBuilder::IsAccessorPropertyBox(GateRef obj)
{
GateRef valueOffset = IntPtr(PropertyBox::VALUE_OFFSET);
GateRef value = Load(VariableType::JS_ANY(), obj, valueOffset);
return TaggedIsAccessor(value);
}
inline GateRef StubBuilder::GetValueFromPropertyBox(GateRef obj)
{
GateRef valueOffset = IntPtr(PropertyBox::VALUE_OFFSET);

View File

@ -1504,18 +1504,18 @@ GateRef StubBuilder::LoadGlobal(GateRef cell)
Label entry(env);
env->SubCfgEntry(&entry);
Label exit(env);
Label cellIsInvalid(env);
Label cellNotInvalid(env);
Label cellNotAccessor(env);
DEFVARIABLE(result, VariableType::JS_ANY(), Hole());
Branch(IsInvalidPropertyBox(cell), &cellIsInvalid, &cellNotInvalid);
Bind(&cellIsInvalid);
{
Jump(&exit);
}
Branch(IsInvalidPropertyBox(cell), &exit, &cellNotInvalid);
Bind(&cellNotInvalid);
{
result = GetValueFromPropertyBox(cell);
Jump(&exit);
Branch(IsAccessorPropertyBox(cell), &exit, &cellNotAccessor);
Bind(&cellNotAccessor);
{
result = GetValueFromPropertyBox(cell);
Jump(&exit);
}
}
Bind(&exit);
auto ret = *result;
@ -2078,19 +2078,19 @@ GateRef StubBuilder::StoreGlobal(GateRef glue, GateRef value, GateRef cell)
Label entry(env);
env->SubCfgEntry(&entry);
Label exit(env);
Label cellIsInvalid(env);
Label cellNotInvalid(env);
Label cellIsNotAccessorData(env);
DEFVARIABLE(result, VariableType::JS_ANY(), Hole());
Branch(IsInvalidPropertyBox(cell), &cellIsInvalid, &cellNotInvalid);
Bind(&cellIsInvalid);
{
Jump(&exit);
}
Branch(IsInvalidPropertyBox(cell), &exit, &cellNotInvalid);
Bind(&cellNotInvalid);
{
Store(VariableType::JS_ANY(), glue, cell, IntPtr(PropertyBox::VALUE_OFFSET), value);
result = Undefined();
Jump(&exit);
Branch(IsAccessorPropertyBox(cell), &exit, &cellIsNotAccessorData);
Bind(&cellIsNotAccessorData);
{
Store(VariableType::JS_ANY(), glue, cell, IntPtr(PropertyBox::VALUE_OFFSET), value);
result = Undefined();
Jump(&exit);
}
}
Bind(&exit);
auto ret = *result;

View File

@ -343,6 +343,7 @@ public:
GateRef HandlerBaseGetAttrIndex(GateRef attr);
GateRef HandlerBaseGetRep(GateRef attr);
GateRef IsInvalidPropertyBox(GateRef obj);
GateRef IsAccessorPropertyBox(GateRef obj);
GateRef GetValueFromPropertyBox(GateRef obj);
void SetValueToPropertyBox(GateRef glue, GateRef obj, GateRef value);
GateRef GetTransitionHClass(GateRef obj);

View File

@ -245,7 +245,7 @@ JSTaggedValue JSStableArray::Join(JSHandle<JSArray> receiver, EcmaRuntimeCallInf
return globalConst->GetEmptyString();
}
TaggedArray *elements = TaggedArray::Cast(receiver->GetElements().GetTaggedObject());
size_t allocateLength = 0;
uint64_t allocateLength = 0;
bool isOneByte = (sep != JSStableArray::SeparatorFlag::MINUS_ONE) || EcmaStringAccessor(sepStringHandle).IsUtf8();
CVector<JSHandle<EcmaString>> vec;
JSMutableHandle<JSTaggedValue> elementHandle(thread, JSTaggedValue::Undefined());
@ -282,9 +282,14 @@ JSTaggedValue JSStableArray::Join(JSHandle<JSArray> receiver, EcmaRuntimeCallInf
}
}
if (len > 0) {
allocateLength += sepLength * (len - 1);
allocateLength += static_cast<uint64_t>(sepLength) * (len - 1);
}
auto newString = EcmaStringAccessor::CreateLineString(thread->GetEcmaVM(), allocateLength, isOneByte);
if (allocateLength > EcmaString::MAX_STRING_LENGTH) {
context->JoinStackPopFastPath(receiverValue);
THROW_RANGE_ERROR_AND_RETURN(thread, "Invalid string length", JSTaggedValue::Exception());
}
auto newString =
EcmaStringAccessor::CreateLineString(thread->GetEcmaVM(), static_cast<size_t>(allocateLength), isOneByte);
int current = 0;
DISALLOW_GARBAGE_COLLECTION;
for (uint32_t k = 0; k < len; k++) {

View File

@ -30,4 +30,7 @@ Reflect.set(v56, "length", v0)
Reflect.set(v55, "length", v0, v56)
print("v56.length",v56.length)
let obj = {name:"tom"};
let pxobj = new Proxy(obj,{});
print(Reflect.get(pxobj,"name"))
print("builtins reflect end");

View File

@ -57,4 +57,5 @@ false
false
builtins reflect start
v56.length 102630708
tom
builtins reflect end

View File

@ -19,3 +19,4 @@ test successful
{"a":{}}
{"3":3}
end JSON.stringify(globalThis)
{"a":"a","b":"b"}

View File

@ -95,3 +95,13 @@ Reflect.defineProperty(globalThis,"c",{
Reflect.set(globalThis,"d","d");
JSON.stringify(globalThis);
print("end JSON.stringify(globalThis)")
let obj1 = {
get a(){
this[102400] = 1;
return "a";
},
b:"b",
}
Object.keys(obj1);
print(JSON.stringify(obj1));

View File

@ -12,3 +12,6 @@
# limitations under the License.
false
1
1
load global ic with accessor success!

View File

@ -45,4 +45,13 @@ try {
} catch (e) {
flag1 = true;
}
print(flag1);
print(flag1);
function f(){return 1};
Object.defineProperty(this,"g",{
get:f,
set:f,
})
for(let i=0;i<2;i++){
print(g)
}
print("load global ic with accessor success!");