Remove JSArgument's unused accessor

-------------------------------------
Remove JSArgument's unused accessor:set [[ParameterMap]] as undefined
issue:https://gitee.com/openharmony/ark_js_runtime/issues/I5C71F?from=project-issue

Signed-off-by: DaiHN <daihuina1@huawei.com>
Change-Id: Ic96b8ff2797b76fb63c20d70461680afea992483
This commit is contained in:
DaiHN 2022-06-14 19:08:28 +08:00
parent ca95915302
commit 74287cd45a
5 changed files with 10 additions and 128 deletions

View File

@ -30,22 +30,6 @@ bool JSArguments::GetOwnProperty(JSThread *thread, const JSHandle<JSArguments> &
return true;
}
// 4.Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
JSHandle<JSTaggedValue> map(thread, args->GetParameterMap());
// 5.Let isMapped be HasOwnProperty(map, P).
bool isMapped = JSTaggedValue::HasOwnProperty(thread, map, key);
// 6.Assert: isMapped is never an abrupt completion.
ASSERT(!thread->HasPendingException());
// 7.If the value of isMapped is true, then
// a.Set desc.[[Value]] to Get(map, P).
if (isMapped) {
auto prop = JSObject::GetProperty(thread, map, key).GetValue();
desc.SetValue(prop);
}
// 8.If IsDataDescriptor(desc) is true and P is "caller" and desc.[[Value]] is a strict mode Function object,
// throw a TypeError exception.
JSHandle<EcmaString> caller = thread->GetEcmaVM()->GetFactory()->NewFromASCII("caller");
@ -60,46 +44,12 @@ bool JSArguments::GetOwnProperty(JSThread *thread, const JSHandle<JSArguments> &
bool JSArguments::DefineOwnProperty(JSThread *thread, const JSHandle<JSArguments> &args,
const JSHandle<JSTaggedValue> &key, const PropertyDescriptor &desc)
{
// 1 ~ 2 Let args be the arguments object and get map.
JSHandle<JSTaggedValue> map(thread, args->GetParameterMap());
// 3.Let isMapped be HasOwnProperty(map, P).
bool isMapped = JSTaggedValue::HasOwnProperty(thread, map, key);
// 4.Let allowed be OrdinaryDefineOwnProperty(args, P, Desc).
bool allowed = JSObject::OrdinaryDefineOwnProperty(thread, JSHandle<JSObject>(args), key, desc);
// 5.ReturnIfAbrupt(allowed).
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, allowed);
// 6.If allowed is false, return false.
if (!allowed) {
return false;
}
// 7.If the value of isMapped is true, then
// a.If IsAccessorDescriptor(Desc) is true, then
// i.Call map.[[Delete]](P).
// b.Else
// i.If Desc.[[Value]] is present, then
// 1.Let setStatus be Set(map, P, Desc.[[Value]], false).
// 2.Assert: setStatus is true because formal parameters mapped by argument objects are always writable.
// ii.If Desc.[[Writable]] is present and its value is false, then
// 1.Call map.[[Delete]](P).
if (isMapped) {
if (desc.IsAccessorDescriptor()) {
JSTaggedValue::DeleteProperty(thread, map, key);
} else {
if (desc.HasValue()) {
[[maybe_unused]] bool setStatus = JSTaggedValue::SetProperty(thread, map, key, desc.GetValue(), false);
ASSERT(setStatus == true);
}
if (desc.HasWritable() && !desc.IsWritable()) {
JSTaggedValue::DeleteProperty(thread, map, key);
}
}
}
// 8.Return true.
return true;
}
@ -107,53 +57,15 @@ bool JSArguments::DefineOwnProperty(JSThread *thread, const JSHandle<JSArguments
OperationResult JSArguments::GetProperty(JSThread *thread, const JSHandle<JSArguments> &args,
const JSHandle<JSTaggedValue> &key, const JSHandle<JSTaggedValue> &receiver)
{
// 1 ~ 2 Let args be the arguments object and get map.
JSHandle<JSTaggedValue> map(thread, args->GetParameterMap());
// 3.Let isMapped be HasOwnProperty(map, P).
bool isMapped = JSTaggedValue::HasOwnProperty(thread, map, key);
// 4.Assert: isMapped is not an abrupt completion.
ASSERT(!thread->HasPendingException());
// 5.If the value of isMapped is false, then
// a.Return the result of calling the default ordinary object [[Get]] internal method (9.1.8)
// on args passing P and Receiver as the arguments.
if (!isMapped) {
return JSTaggedValue::GetProperty(thread, JSHandle<JSTaggedValue>::Cast(args), key, receiver);
}
// 6.Else map contains a formal parameter mapping for P,
// a.Return Get(map, P).
return JSTaggedValue::GetProperty(thread, map, key);
return JSTaggedValue::GetProperty(thread, JSHandle<JSTaggedValue>::Cast(args), key, receiver);
}
bool JSArguments::SetProperty(JSThread *thread, const JSHandle<JSArguments> &args, const JSHandle<JSTaggedValue> &key,
const JSHandle<JSTaggedValue> &value, const JSHandle<JSTaggedValue> &receiver)
{
// 1.Let args be the arguments object.
JSHandle<JSTaggedValue> map(thread, args->GetParameterMap());
// 2.If SameValue(args, Receiver) is false, then
// a.Let isMapped be false.
bool isMapped = false;
if (JSTaggedValue::SameValue(args.GetTaggedValue(), receiver.GetTaggedValue())) {
// 3.Else,
// a.Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
// b.Let isMapped be HasOwnProperty(map, P).
// c.Assert: isMapped is not an abrupt completion.
isMapped = JSTaggedValue::HasOwnProperty(thread, map, key);
ASSERT(!thread->HasPendingException());
}
// 4.If isMapped is true, then
// a.Let setStatus be Set(map, P, V, false).
// b.Assert: setStatus is true because formal parameters mapped by argument objects are always writable.
if (isMapped) {
[[maybe_unused]] bool setStatus = JSTaggedValue::SetProperty(thread, map, key, value);
ASSERT(setStatus == true);
}
// 5.Return the result of calling the default ordinary object [[Set]] internal method (9.1.9)
// on args passing P, V and Receiver as the arguments.
return JSTaggedValue::SetProperty(thread, JSHandle<JSTaggedValue>::Cast(args), key, value, receiver);
@ -162,15 +74,6 @@ bool JSArguments::SetProperty(JSThread *thread, const JSHandle<JSArguments> &arg
bool JSArguments::DeleteProperty(JSThread *thread, const JSHandle<JSArguments> &args,
const JSHandle<JSTaggedValue> &key)
{
// 1.Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
JSHandle<JSTaggedValue> map(thread, args->GetParameterMap());
// 2.Let isMapped be HasOwnProperty(map, P).
bool isMapped = JSTaggedValue::HasOwnProperty(thread, map, key);
// 3.Assert: isMapped is not an abrupt completion.
ASSERT(!thread->HasPendingException());
// 4.Let result be the result of calling the default [[Delete]] internal method for ordinary objects (9.1.10)
// on the arguments object passing P as the argument.
bool result = JSTaggedValue::DeleteProperty(thread, JSHandle<JSTaggedValue>(args), key);
@ -178,12 +81,6 @@ bool JSArguments::DeleteProperty(JSThread *thread, const JSHandle<JSArguments> &
// 5.ReturnIfAbrupt(result).
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, result);
// 6.If result is true and the value of isMapped is true, then
// a.Call map.[[Delete]](P).
if (result && isMapped) {
JSTaggedValue::DeleteProperty(thread, map, key);
}
// 7.Return result.
return result;
}

View File

@ -58,11 +58,6 @@ public:
static bool DeleteProperty(JSThread *thread, const JSHandle<JSArguments> &args, const JSHandle<JSTaggedValue> &key);
// 9.4.4.6 CreateUnmappedArgumentsObject(argumentsList)
// 9.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )
static constexpr size_t PARAMETER_MAP_OFFSET = JSObject::SIZE;
ACCESSORS(ParameterMap, PARAMETER_MAP_OFFSET, SIZE)
DECL_VISIT_OBJECT_FOR_JS_OBJECT(JSObject, PARAMETER_MAP_OFFSET, SIZE)
};
} // namespace panda::ecmascript

View File

@ -781,7 +781,6 @@ JSHandle<JSArguments> ObjectFactory::NewJSArguments()
JSHandle<GlobalEnv> env = vm_->GetGlobalEnv();
JSHandle<JSHClass> dynclass = JSHandle<JSHClass>::Cast(env->GetArgumentsClass());
JSHandle<JSArguments> obj = JSHandle<JSArguments>::Cast(NewJSObject(dynclass));
obj->SetParameterMap(thread_, JSTaggedValue::Undefined());
return obj;
}
@ -1163,7 +1162,6 @@ void ObjectFactory::InitializeJSObject(const JSHandle<JSObject> &obj, const JSHa
JSBoundFunction::Cast(*obj)->SetBoundArguments(JSTaggedValue::Undefined());
break;
case JSType::JS_ARGUMENTS:
JSArguments::Cast(*obj)->SetParameterMap(JSTaggedValue::Undefined());
break;
case JSType::JS_FORIN_ITERATOR:
case JSType::JS_MAP_ITERATOR:

View File

@ -1215,6 +1215,7 @@ JSTaggedValue RuntimeStubs::RuntimeGetUnmapedArgs(JSThread *thread, JSTaggedType
uint32_t len = argumentsList->GetLength();
// 2. Let obj be ObjectCreate(%ObjectPrototype%, «[[ParameterMap]]»).
// 3. Set objs [[ParameterMap]] internal slot to undefined.
// [[ParameterMap]] setted as undifined.
JSHandle<JSArguments> obj = factory->NewJSArguments();
// 4. Perform DefinePropertyOrThrow(obj, "length", PropertyDescriptor{[[Value]]: len, [[Writable]]: true,
// [[Enumerable]]: false, [[Configurable]]: true}).

View File

@ -336,6 +336,7 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
case JSType::JS_TYPE_ERROR:
case JSType::JS_REFERENCE_ERROR:
case JSType::JS_URI_ERROR:
case JSType::JS_ARGUMENTS:
case JSType::JS_SYNTAX_ERROR:
case JSType::JS_OBJECT: {
CHECK_DUMP_FIELDS(ECMAObject::SIZE, JSObject::SIZE, 2U)
@ -491,9 +492,6 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
DUMP_FOR_HANDLE(date)
break;
}
case JSType::JS_ITERATOR:
// JS Iterate is a tool class, so we don't need to check it.
break;
case JSType::JS_FORIN_ITERATOR: {
CHECK_DUMP_FIELDS(JSObject::SIZE, JSForInIterator::SIZE, 4U)
JSHandle<JSTaggedValue> array(thread, factory->NewJSArray().GetTaggedValue());
@ -598,11 +596,6 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
NEW_OBJECT_AND_DUMP(JSDataView, JS_DATA_VIEW)
break;
}
case JSType::JS_ARGUMENTS: {
CHECK_DUMP_FIELDS(JSObject::SIZE, JSArguments::SIZE, 1U)
NEW_OBJECT_AND_DUMP(JSArguments, JS_ARGUMENTS)
break;
}
case JSType::JS_GENERATOR_OBJECT: {
CHECK_DUMP_FIELDS(JSObject::SIZE, JSGeneratorObject::SIZE, 3U)
NEW_OBJECT_AND_DUMP(JSGeneratorObject, JS_GENERATOR_OBJECT)
@ -678,15 +671,6 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
DUMP_FOR_HANDLE(dict)
break;
}
case JSType::FREE_OBJECT_WITH_ONE_FIELD:
case JSType::FREE_OBJECT_WITH_NONE_FIELD:
case JSType::FREE_OBJECT_WITH_TWO_FIELD:
{
break;
}
case JSType::JS_NATIVE_POINTER: {
break;
}
case JSType::GLOBAL_ENV: {
DUMP_FOR_HANDLE(globalEnv)
break;
@ -1068,6 +1052,13 @@ HWTEST_F_L0(EcmaDumpTest, HeapProfileDump)
DUMP_FOR_HANDLE(cjsRequire);
break;
}
case JSType::JS_ITERATOR:
case JSType::FREE_OBJECT_WITH_ONE_FIELD:
case JSType::FREE_OBJECT_WITH_NONE_FIELD:
case JSType::FREE_OBJECT_WITH_TWO_FIELD:
case JSType::JS_NATIVE_POINTER: {
break;
}
default:
LOG_ECMA_MEM(ERROR) << "JSType " << static_cast<int>(type) << " cannot be dumped.";
UNREACHABLE();