Fix [[Prototype]] initialization process for each object creation

* remove duplicated initialization for [[Prototype]] internal slot
* initialize prototype value directly when each Object created
* each prototype candidate object should be first marked as prototype object
* setGlobalIntrinsicObject marks fixed structure and prototype for global object's intrinsic object initialization

Signed-off-by: HyukWoo Park <hyukwoo.park@samsung.com>
This commit is contained in:
HyukWoo Park 2020-03-18 17:18:00 +09:00 committed by Patrick Kim
commit 39a5922437
93 changed files with 464 additions and 566 deletions

View file

@ -24,18 +24,11 @@
namespace Escargot {
// function for derived classes. derived class MUST initlize member variable of FunctionObject.
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, size_t defaultSpace)
: FunctionObject(state, defaultSpace)
{
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* codeBlock)
: FunctionObject(state, codeBlock->isNativeFunctionConstructor() ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
: FunctionObject(state, state.context()->globalObject()->functionPrototype(), codeBlock->isNativeFunctionConstructor() ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
{
m_codeBlock = codeBlock;
initStructureAndValues(state, m_codeBlock->isNativeFunctionConstructor(), false, false);
Object::setPrototypeForIntrinsicObjectCreation(state, state.context()->globalObject()->functionPrototype());
if (NativeFunctionObject::isConstructor())
m_structure = state.context()->defaultStructureForBuiltinFunctionObject();
@ -43,15 +36,14 @@ NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* cod
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, NativeFunctionInfo info)
: FunctionObject(state, info.m_isConstructor ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
: FunctionObject(state, state.context()->globalObject()->functionPrototype(), info.m_isConstructor ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
{
m_codeBlock = new CodeBlock(state.context(), info);
initStructureAndValues(state, m_codeBlock->isNativeFunctionConstructor(), false, false);
Object::setPrototypeForIntrinsicObjectCreation(state, state.context()->globalObject()->functionPrototype());
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* codeBlock, ForGlobalBuiltin)
: FunctionObject(state, ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2)
: FunctionObject(state, state.context()->globalObject()->objectPrototype(), ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2)
{
m_codeBlock = codeBlock;
ASSERT(!NativeFunctionObject::isConstructor());
@ -59,12 +51,11 @@ NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* cod
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* codeBlock, ForBuiltinConstructor)
: FunctionObject(state, codeBlock->isNativeFunctionConstructor() ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
: FunctionObject(state, state.context()->globalObject()->functionPrototype(), codeBlock->isNativeFunctionConstructor() ? (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3) : (ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2))
{
m_codeBlock = codeBlock;
initStructureAndValues(state, codeBlock->isNativeFunctionConstructor(), false, false);
Object::setPrototypeForIntrinsicObjectCreation(state, state.context()->globalObject()->functionPrototype());
if (NativeFunctionObject::isConstructor())
m_structure = state.context()->defaultStructureForBuiltinFunctionObject();
@ -72,12 +63,11 @@ NativeFunctionObject::NativeFunctionObject(ExecutionState& state, CodeBlock* cod
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, NativeFunctionInfo info, ForBuiltinConstructor)
: FunctionObject(state, ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3)
: FunctionObject(state, state.context()->globalObject()->functionPrototype(), ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 3)
{
m_codeBlock = new CodeBlock(state.context(), info);
initStructureAndValues(state, m_codeBlock->isNativeFunctionConstructor(), false, false);
Object::setPrototypeForIntrinsicObjectCreation(state, state.context()->globalObject()->functionPrototype());
m_structure = state.context()->defaultStructureForBuiltinFunctionObject();
ASSERT(NativeFunctionObject::isConstructor());
@ -85,7 +75,7 @@ NativeFunctionObject::NativeFunctionObject(ExecutionState& state, NativeFunction
}
NativeFunctionObject::NativeFunctionObject(ExecutionState& state, NativeFunctionInfo info, ForBuiltinProxyConstructor)
: FunctionObject(state, ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2)
: FunctionObject(state, state.context()->globalObject()->functionPrototype(), ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 2)
{
m_codeBlock = new CodeBlock(state.context(), info);
@ -93,7 +83,6 @@ NativeFunctionObject::NativeFunctionObject(ExecutionState& state, NativeFunction
m_structure = state.context()->defaultStructureForNotConstructorFunctionObject();
m_values[ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 0] = (Value(m_codeBlock->functionName().string()));
m_values[ESCARGOT_OBJECT_BUILTIN_PROPERTY_NUMBER + 1] = (Value(m_codeBlock->functionLength()));
Object::setPrototypeForIntrinsicObjectCreation(state, state.context()->globalObject()->functionPrototype());
ASSERT(NativeFunctionObject::isConstructor());
ASSERT(codeBlock()->hasCallNativeFunctionCode());