mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
!7982 Cherry-pick 7831 7446 7435to 4.0Release
Merge pull request !7982 from 贺存茂/7446To4
This commit is contained in:
commit
ea5272846b
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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++) {
|
||||
|
@ -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");
|
||||
|
@ -57,4 +57,5 @@ false
|
||||
false
|
||||
builtins reflect start
|
||||
v56.length 102630708
|
||||
tom
|
||||
builtins reflect end
|
||||
|
@ -19,3 +19,4 @@ test successful
|
||||
{"a":{}}
|
||||
{"3":3}
|
||||
end JSON.stringify(globalThis)
|
||||
{"a":"a","b":"b"}
|
||||
|
@ -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));
|
||||
|
@ -12,3 +12,6 @@
|
||||
# limitations under the License.
|
||||
|
||||
false
|
||||
1
|
||||
1
|
||||
load global ic with accessor success!
|
||||
|
@ -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!");
|
||||
|
Loading…
Reference in New Issue
Block a user