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