• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_INTERPRETER_INTERPRETER_H
17 #define ECMASCRIPT_INTERPRETER_INTERPRETER_H
18 
19 #include "ecmascript/js_method.h"
20 #include "ecmascript/js_tagged_value.h"
21 #include "ecmascript/js_handle.h"
22 #include "ecmascript/js_thread.h"
23 #include "ecmascript/frames.h"
24 
25 namespace panda::ecmascript {
26 class ConstantPool;
27 class ECMAObject;
28 class GeneratorContext;
29 
30 // NOLINTNEXTLINE(bugprone-sizeof-expression)
31 static const uint32_t FRAME_STATE_SIZE = sizeof(InterpretedFrame) / sizeof(uint64_t);
32 
33 static constexpr uint32_t RESERVED_CALL_ARGCOUNT = 3;
34 static constexpr uint32_t RESERVED_INDEX_CALL_TARGET = 0;
35 static constexpr uint32_t RESERVED_INDEX_NEW_TARGET = 1;
36 static constexpr uint32_t RESERVED_INDEX_THIS = 2;
37 
38 struct CallParams {
39     ECMAObject *callTarget;
40     JSTaggedType newTarget;
41     JSTaggedType thisArg;
42     const JSTaggedType *argv;
43     uint32_t argc;
44 };
45 
46 class EcmaInterpreter {
47 public:
48     static const uint32_t METHOD_HOTNESS_THRESHOLD = 512;
49     enum ActualNumArgsOfCall : uint8_t { CALLARG0 = 0, CALLARG1, CALLARGS2, CALLARGS3 };
50 
51     static inline JSTaggedValue Execute(JSThread *thread, const CallParams& params);
52     static inline JSTaggedValue ExecuteNative(JSThread *thread, const CallParams& params);
53     static inline JSTaggedValue GeneratorReEnterInterpreter(JSThread *thread, JSHandle<GeneratorContext> context);
54     static inline void ChangeGenContext(JSThread *thread, JSHandle<GeneratorContext> context);
55     static inline void ResumeContext(JSThread *thread);
56     static inline void RunInternal(JSThread *thread, ConstantPool *constpool, const uint8_t *pc, JSTaggedType *sp);
57     static inline uint8_t ReadU8(const uint8_t *pc, uint32_t offset);
58     static inline void InitStackFrame(JSThread *thread);
59     static inline uint32_t FindCatchBlock(JSMethod *caller, uint32_t pc);
60     static inline size_t GetJumpSizeAfterCall(const uint8_t *prevPc);
61 
62     static inline JSTaggedValue GetRuntimeProfileTypeInfo(JSTaggedType *sp);
63     static inline bool UpdateHotnessCounter(JSThread* thread, JSTaggedType *sp, JSTaggedValue acc, int32_t offset);
64     static inline void NotifyBytecodePcChanged(JSThread *thread);
65     static inline JSTaggedValue GetThisFunction(JSTaggedType *sp);
66     static inline JSTaggedValue GetNewTarget(JSTaggedType *sp);
67     static inline uint32_t GetNumArgs(JSTaggedType *sp, uint32_t restIdx, uint32_t &startIdx);
68     static inline JSTaggedType* GetCurrentFrameState(JSTaggedType *sp);
69     static inline JSTaggedValue GetThisObjectFromFastNewFrame(JSTaggedType *sp);
70     static inline bool IsFastNewFrameEnter(JSMethod *method);
71     static inline bool IsFastNewFrameExit(JSTaggedType *sp);
72 };
73 
74 enum EcmaOpcode {
75     LDNAN_PREF,
76     LDINFINITY_PREF,
77     LDGLOBALTHIS_PREF,
78     LDUNDEFINED_PREF,
79     LDNULL_PREF,
80     LDSYMBOL_PREF,
81     LDGLOBAL_PREF,
82     LDTRUE_PREF,
83     LDFALSE_PREF,
84     THROWDYN_PREF,
85     TYPEOFDYN_PREF,
86     LDLEXENVDYN_PREF,
87     POPLEXENVDYN_PREF,
88     GETUNMAPPEDARGS_PREF,
89     GETPROPITERATOR_PREF,
90     ASYNCFUNCTIONENTER_PREF,
91     LDHOLE_PREF,
92     RETURNUNDEFINED_PREF,
93     CREATEEMPTYOBJECT_PREF,
94     CREATEEMPTYARRAY_PREF,
95     GETITERATOR_PREF,
96     THROWTHROWNOTEXISTS_PREF,
97     THROWPATTERNNONCOERCIBLE_PREF,
98     LDHOMEOBJECT_PREF,
99     THROWDELETESUPERPROPERTY_PREF,
100     DEBUGGER_PREF,
101     ADD2DYN_PREF_V8,
102     SUB2DYN_PREF_V8,
103     MUL2DYN_PREF_V8,
104     DIV2DYN_PREF_V8,
105     MOD2DYN_PREF_V8,
106     EQDYN_PREF_V8,
107     NOTEQDYN_PREF_V8,
108     LESSDYN_PREF_V8,
109     LESSEQDYN_PREF_V8,
110     GREATERDYN_PREF_V8,
111     GREATEREQDYN_PREF_V8,
112     SHL2DYN_PREF_V8,
113     SHR2DYN_PREF_V8,
114     ASHR2DYN_PREF_V8,
115     AND2DYN_PREF_V8,
116     OR2DYN_PREF_V8,
117     XOR2DYN_PREF_V8,
118     TONUMBER_PREF_V8,
119     NEGDYN_PREF_V8,
120     NOTDYN_PREF_V8,
121     INCDYN_PREF_V8,
122     DECDYN_PREF_V8,
123     EXPDYN_PREF_V8,
124     ISINDYN_PREF_V8,
125     INSTANCEOFDYN_PREF_V8,
126     STRICTNOTEQDYN_PREF_V8,
127     STRICTEQDYN_PREF_V8,
128     RESUMEGENERATOR_PREF_V8,
129     GETRESUMEMODE_PREF_V8,
130     CREATEGENERATOROBJ_PREF_V8,
131     THROWCONSTASSIGNMENT_PREF_V8,
132     GETTEMPLATEOBJECT_PREF_V8,
133     GETNEXTPROPNAME_PREF_V8,
134     CALLARG0DYN_PREF_V8,
135     THROWIFNOTOBJECT_PREF_V8,
136     ITERNEXT_PREF_V8,
137     CLOSEITERATOR_PREF_V8,
138     COPYMODULE_PREF_V8,
139     SUPERCALLSPREAD_PREF_V8,
140     DELOBJPROP_PREF_V8_V8,
141     NEWOBJSPREADDYN_PREF_V8_V8,
142     CREATEITERRESULTOBJ_PREF_V8_V8,
143     SUSPENDGENERATOR_PREF_V8_V8,
144     ASYNCFUNCTIONAWAITUNCAUGHT_PREF_V8_V8,
145     THROWUNDEFINEDIFHOLE_PREF_V8_V8,
146     CALLARG1DYN_PREF_V8_V8,
147     COPYDATAPROPERTIES_PREF_V8_V8,
148     STARRAYSPREAD_PREF_V8_V8,
149     GETITERATORNEXT_PREF_V8_V8,
150     SETOBJECTWITHPROTO_PREF_V8_V8,
151     LDOBJBYVALUE_PREF_V8_V8,
152     STOBJBYVALUE_PREF_V8_V8,
153     STOWNBYVALUE_PREF_V8_V8,
154     LDSUPERBYVALUE_PREF_V8_V8,
155     STSUPERBYVALUE_PREF_V8_V8,
156     LDOBJBYINDEX_PREF_V8_IMM32,
157     STOBJBYINDEX_PREF_V8_IMM32,
158     STOWNBYINDEX_PREF_V8_IMM32,
159     CALLSPREADDYN_PREF_V8_V8_V8,
160     ASYNCFUNCTIONRESOLVE_PREF_V8_V8_V8,
161     ASYNCFUNCTIONREJECT_PREF_V8_V8_V8,
162     CALLARGS2DYN_PREF_V8_V8_V8,
163     CALLARGS3DYN_PREF_V8_V8_V8_V8,
164     DEFINEGETTERSETTERBYVALUE_PREF_V8_V8_V8_V8,
165     NEWOBJDYNRANGE_PREF_IMM16_V8,
166     CALLIRANGEDYN_PREF_IMM16_V8,
167     CALLITHISRANGEDYN_PREF_IMM16_V8,
168     SUPERCALL_PREF_IMM16_V8,
169     CREATEOBJECTWITHEXCLUDEDKEYS_PREF_IMM16_V8_V8,
170     DEFINEFUNCDYN_PREF_ID16_IMM16_V8,
171     DEFINENCFUNCDYN_PREF_ID16_IMM16_V8,
172     DEFINEGENERATORFUNC_PREF_ID16_IMM16_V8,
173     DEFINEASYNCFUNC_PREF_ID16_IMM16_V8,
174     DEFINEMETHOD_PREF_ID16_IMM16_V8,
175     NEWLEXENVDYN_PREF_IMM16,
176     COPYRESTARGS_PREF_IMM16,
177     CREATEARRAYWITHBUFFER_PREF_IMM16,
178     CREATEOBJECTHAVINGMETHOD_PREF_IMM16,
179     THROWIFSUPERNOTCORRECTCALL_PREF_IMM16,
180     CREATEOBJECTWITHBUFFER_PREF_IMM16,
181     LDLEXVARDYN_PREF_IMM4_IMM4,
182     LDLEXVARDYN_PREF_IMM8_IMM8,
183     LDLEXVARDYN_PREF_IMM16_IMM16,
184     STLEXVARDYN_PREF_IMM4_IMM4_V8,
185     STLEXVARDYN_PREF_IMM8_IMM8_V8,
186     STLEXVARDYN_PREF_IMM16_IMM16_V8,
187     DEFINECLASSWITHBUFFER_PREF_ID16_IMM16_IMM16_V8_V8,
188     IMPORTMODULE_PREF_ID32,
189     STMODULEVAR_PREF_ID32,
190     TRYLDGLOBALBYNAME_PREF_ID32,
191     TRYSTGLOBALBYNAME_PREF_ID32,
192     LDGLOBALVAR_PREF_ID32,
193     STGLOBALVAR_PREF_ID32,
194     LDOBJBYNAME_PREF_ID32_V8,
195     STOBJBYNAME_PREF_ID32_V8,
196     STOWNBYNAME_PREF_ID32_V8,
197     LDSUPERBYNAME_PREF_ID32_V8,
198     STSUPERBYNAME_PREF_ID32_V8,
199     LDMODVARBYNAME_PREF_ID32_V8,
200     CREATEREGEXPWITHLITERAL_PREF_ID32_IMM8,
201     ISTRUE_PREF,
202     ISFALSE_PREF,
203     STCONSTTOGLOBALRECORD_PREF_ID32,
204     STLETTOGLOBALRECORD_PREF_ID32,
205     STCLASSTOGLOBALRECORD_PREF_ID32,
206     STOWNBYVALUEWITHNAMESET_PREF_V8_V8,
207     STOWNBYNAMEWITHNAMESET_PREF_ID32_V8,
208     LDFUNCTION_PREF,
209     NEWLEXENVWITHNAMEDYN_PREF_IMM16_IMM16,
210     LDBIGINT_PREF_ID32,
211     MOV_DYN_V8_V8,
212     MOV_DYN_V16_V16,
213     LDA_STR_ID32,
214     LDAI_DYN_IMM32,
215     FLDAI_DYN_IMM64,
216     JMP_IMM8,
217     JMP_IMM16,
218     JMP_IMM32,
219     JEQZ_IMM8,
220     JEQZ_IMM16,
221     LDA_DYN_V8,
222     STA_DYN_V8,
223     RETURN_DYN,
224     MOV_V4_V4,
225     JNEZ_IMM8,
226     JNEZ_IMM16,
227     LAST_OPCODE,
228 };
229 
230 // if modify EcmaOpcode, please update GetEcmaOpcodeStr()
231 inline std::string GetEcmaOpcodeStr(EcmaOpcode opcode);
232 }  // namespace panda::ecmascript
233 #endif  // ECMASCRIPT_INTERPRETER_INTERPRETER_H
234