mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-22 10:01:50 +00:00
Implement lazy-creation of arguments object. (#361)
* Store ArgumentsObject into Env record with functionObject * Introduce gc memory leak checker * Don't save stack pointer in ArgumentsObject Signed-off-by: seonghyun kim <sh8281.kim@samsung.com>
This commit is contained in:
parent
1d143c3871
commit
ad0cecbd0d
18 changed files with 238 additions and 53 deletions
|
|
@ -183,6 +183,13 @@ Object* ScriptFunctionObject::construct(ExecutionState& state, const size_t argc
|
|||
|
||||
void ScriptFunctionObject::generateArgumentsObject(ExecutionState& state, size_t argc, Value* argv, FunctionEnvironmentRecord* environmentRecordWillArgumentsObjectBeLocatedIn, Value* stackStorage, bool isMapped)
|
||||
{
|
||||
if (environmentRecordWillArgumentsObjectBeLocatedIn->m_argumentsObject->isArgumentsObject()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto newArgumentsObject = new ArgumentsObject(state, this, argc, argv, environmentRecordWillArgumentsObjectBeLocatedIn, isMapped);
|
||||
environmentRecordWillArgumentsObjectBeLocatedIn->m_argumentsObject = newArgumentsObject;
|
||||
|
||||
AtomicString arguments = state.context()->staticStrings().arguments;
|
||||
if (environmentRecordWillArgumentsObjectBeLocatedIn->isFunctionEnvironmentRecordNotIndexed()) {
|
||||
auto result = environmentRecordWillArgumentsObjectBeLocatedIn->hasBinding(state, arguments);
|
||||
|
|
@ -190,15 +197,15 @@ void ScriptFunctionObject::generateArgumentsObject(ExecutionState& state, size_t
|
|||
environmentRecordWillArgumentsObjectBeLocatedIn->createBinding(state, arguments, false, true);
|
||||
result = environmentRecordWillArgumentsObjectBeLocatedIn->hasBinding(state, arguments);
|
||||
}
|
||||
environmentRecordWillArgumentsObjectBeLocatedIn->initializeBinding(state, arguments, new ArgumentsObject(state, this, argc, argv, environmentRecordWillArgumentsObjectBeLocatedIn, isMapped));
|
||||
environmentRecordWillArgumentsObjectBeLocatedIn->initializeBinding(state, arguments, newArgumentsObject);
|
||||
} else {
|
||||
const InterpretedCodeBlock::IdentifierInfoVector& v = codeBlock()->asInterpretedCodeBlock()->identifierInfos();
|
||||
for (size_t i = 0; i < v.size(); i++) {
|
||||
if (v[i].m_name == arguments) {
|
||||
if (v[i].m_needToAllocateOnStack) {
|
||||
stackStorage[v[i].m_indexForIndexedStorage] = new ArgumentsObject(state, this, argc, argv, environmentRecordWillArgumentsObjectBeLocatedIn, isMapped);
|
||||
stackStorage[v[i].m_indexForIndexedStorage] = newArgumentsObject;
|
||||
} else {
|
||||
environmentRecordWillArgumentsObjectBeLocatedIn->heapStorage()[v[i].m_indexForIndexedStorage] = new ArgumentsObject(state, this, argc, argv, environmentRecordWillArgumentsObjectBeLocatedIn, isMapped);
|
||||
environmentRecordWillArgumentsObjectBeLocatedIn->heapStorage()[v[i].m_indexForIndexedStorage] = newArgumentsObject;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue