forked from Samsung/escargot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScriptParser.h
More file actions
101 lines (82 loc) · 3.93 KB
/
ScriptParser.h
File metadata and controls
101 lines (82 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Copyright (c) 2016-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef __EscargotScriptParser__
#define __EscargotScriptParser__
#include "parser/Script.h"
#include "runtime/String.h"
#include "runtime/ErrorObject.h"
namespace Escargot {
struct ASTScopeContext;
class CodeBlock;
class InterpretedCodeBlock;
class Context;
class ProgramNode;
class Node;
#if defined(ENABLE_CODE_CACHE)
struct CodeBlockCacheInfo;
#endif
class ScriptParser : public gc {
public:
explicit ScriptParser(Context* c);
struct InitializeScriptResult {
Optional<Script*> script;
ErrorObject::Code parseErrorCode;
String* parseErrorMessage;
InitializeScriptResult()
: parseErrorCode(ErrorObject::Code::None)
, parseErrorMessage(String::emptyString)
{
}
Script* scriptThrowsExceptionIfParseError(ExecutionState& state)
{
if (!script) {
ErrorObject::throwBuiltinError(state, parseErrorCode, parseErrorMessage->toUTF8StringData().data());
}
return script.value();
}
};
InitializeScriptResult initializeScript(String* originSource, size_t originLineOffset, String* source, String* srcName, InterpretedCodeBlock* parentCodeBlock, bool isModule, bool isEvalMode = false, bool isEvalCodeInFunction = false, bool inWithOperation = false, bool strictFromOutside = false, bool allowSuperCall = false, bool allowSuperProperty = false, bool allowNewTarget = false, bool needByteCodeGeneration = true, size_t stackSizeRemain = SIZE_MAX);
InitializeScriptResult initializeScript(String* source, String* srcName, bool isModule)
{
return initializeScript(nullptr, 0, source, srcName, nullptr, isModule);
}
Context* context() const { return m_context; }
void generateFunctionByteCode(ExecutionState& state, InterpretedCodeBlock* codeBlock, size_t stackSizeRemain);
#if defined(ENABLE_CODE_CACHE)
void setCodeBlockCacheInfo(CodeBlockCacheInfo* info);
void deleteCodeBlockCacheInfo();
#endif
private:
InterpretedCodeBlock* generateCodeBlockTreeFromAST(Context* ctx, StringView source, Script* script, ProgramNode* program, bool isEvalCode, bool isEvalCodeInFunction);
InterpretedCodeBlock* generateCodeBlockTreeFromASTWalker(Context* ctx, StringView source, Script* script, ASTScopeContext* scopeCtx, InterpretedCodeBlock* parentCodeBlock, bool isEvalCode, bool isEvalCodeInFunction);
void generateCodeBlockTreeFromASTWalkerPostProcess(InterpretedCodeBlock* cb);
#ifndef NDEBUG
void dumpCodeBlockTree(InterpretedCodeBlock* topCodeBlock);
#endif
#ifdef ESCARGOT_DEBUGGER
void recursivelyGenerateChildrenByteCode(InterpretedCodeBlock* topCodeBlock);
InitializeScriptResult initializeScriptWithDebugger(String* originSource, size_t originLineOffset, String* source, String* srcName, InterpretedCodeBlock* parentCodeBlock, bool isModule, bool isEvalMode, bool isEvalCodeInFunction, bool inWithOperation, bool strictFromOutside, bool allowSuperCall, bool allowSuperProperty, bool allowNewTarget);
#endif /* ESCARGOT_DEBUGGER */
Context* m_context;
#if defined(ENABLE_CODE_CACHE)
CodeBlockCacheInfo* m_codeBlockCacheInfo;
#endif
};
} // namespace Escargot
#endif