1. re-implement arguments binding, CallBoundFunction logic for reduce interpreter loop size

2. optimize FunctionObject::call
3. remove ResetExecutionResult opcode
4. give stack limit of scriptParser correctly

Signed-off-by: seonghyun kim <sh8281.kim@samsung.com>
This commit is contained in:
seonghyun kim 2017-03-13 15:33:14 +09:00
commit 013f0e5d16
25 changed files with 225 additions and 345 deletions

View file

@ -106,21 +106,6 @@ CodeBlock* ScriptParser::generateCodeBlockTreeFromASTWalker(Context* ctx, String
}
}
}
for (size_t i = 0; i < b->functionParameters().size(); i++) {
if (UNLIKELY(b->functionParameters()[i] == arguments)) {
b->m_hasArgumentsBindingInParameterOrChildFD = true;
break;
}
}
for (size_t i = 0; i < b->childBlocks().size(); i++) {
CodeBlock* cb = b->childBlocks()[i];
if (cb->isFunctionDeclaration() && cb->functionName() == arguments) {
b->m_hasArgumentsBindingInParameterOrChildFD = true;
break;
}
}
}
} else if (!codeBlock->hasName(uname)) {
CodeBlock* c = codeBlock->parentCodeBlock();
@ -176,12 +161,12 @@ void ScriptParser::generateCodeBlockTreeFromASTWalkerPostProcess(CodeBlock* cb)
}
}
ScriptParser::ScriptParserResult ScriptParser::parse(StringView scriptSource, String* fileName, CodeBlock* parentCodeBlock, bool strictFromOutside)
ScriptParser::ScriptParserResult ScriptParser::parse(StringView scriptSource, String* fileName, CodeBlock* parentCodeBlock, bool strictFromOutside, bool isEvalCodeInFunction, size_t stackSizeRemain)
{
Script* script = nullptr;
ScriptParseError* error = nullptr;
try {
ProgramNode* program = esprima::parseProgram(m_context, scriptSource, nullptr, strictFromOutside);
ProgramNode* program = esprima::parseProgram(m_context, scriptSource, nullptr, strictFromOutside, stackSizeRemain);
script = new Script(fileName, new StringView(scriptSource));
CodeBlock* topCodeBlock;
@ -191,10 +176,13 @@ ScriptParser::ScriptParserResult ScriptParser::parse(StringView scriptSource, St
program->scopeContext()->m_hasCatch = parentCodeBlock->hasCatch();
program->scopeContext()->m_hasYield = parentCodeBlock->hasYield();
topCodeBlock = generateCodeBlockTreeFromASTWalker(m_context, scriptSource, script, program->scopeContext(), parentCodeBlock);
topCodeBlock->m_isEvalCodeInFunction = true;
} else {
topCodeBlock = generateCodeBlockTreeFromAST(m_context, scriptSource, script, program);
}
topCodeBlock->m_isEvalCodeInFunction = isEvalCodeInFunction;
generateCodeBlockTreeFromASTWalkerPostProcess(topCodeBlock);
topCodeBlock->m_cachedASTNode = program;
@ -261,10 +249,10 @@ ScriptParser::ScriptParserResult ScriptParser::parse(StringView scriptSource, St
return result;
}
std::pair<Node*, ASTScopeContext*> ScriptParser::parseFunction(CodeBlock* codeBlock)
std::pair<Node*, ASTScopeContext*> ScriptParser::parseFunction(CodeBlock* codeBlock, size_t stackSizeRemain)
{
try {
std::pair<Node*, ASTScopeContext*> body = esprima::parseSingleFunction(m_context, codeBlock);
std::pair<Node*, ASTScopeContext*> body = esprima::parseSingleFunction(m_context, codeBlock, stackSizeRemain);
return body;
} catch (esprima::Error* orgError) {
puts(orgError->message->toUTF8StringData().data());