2021-09-04 08:06:49 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2021 Huawei Device Co., Ltd.
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2021-09-07 14:24:16 +00:00
|
|
|
#ifndef ECMASCRIPT_INTERPRETER_INTERPRETER_H
|
|
|
|
#define ECMASCRIPT_INTERPRETER_INTERPRETER_H
|
2021-09-04 08:06:49 +00:00
|
|
|
|
|
|
|
#include "ecmascript/js_method.h"
|
|
|
|
#include "ecmascript/js_tagged_value.h"
|
|
|
|
#include "ecmascript/js_handle.h"
|
|
|
|
#include "ecmascript/js_thread.h"
|
2021-10-09 10:49:19 +00:00
|
|
|
#include "ecmascript/frames.h"
|
2021-09-04 08:06:49 +00:00
|
|
|
|
|
|
|
namespace panda::ecmascript {
|
|
|
|
class ConstantPool;
|
|
|
|
class ECMAObject;
|
|
|
|
class GeneratorContext;
|
|
|
|
|
|
|
|
// NOLINTNEXTLINE(bugprone-sizeof-expression)
|
2021-12-31 07:51:09 +00:00
|
|
|
static const uint32_t FRAME_STATE_SIZE = sizeof(InterpretedFrame) / sizeof(uint64_t);
|
2021-09-04 08:06:49 +00:00
|
|
|
|
|
|
|
static constexpr uint32_t RESERVED_CALL_ARGCOUNT = 3;
|
|
|
|
static constexpr uint32_t RESERVED_INDEX_CALL_TARGET = 0;
|
|
|
|
static constexpr uint32_t RESERVED_INDEX_NEW_TARGET = 1;
|
|
|
|
static constexpr uint32_t RESERVED_INDEX_THIS = 2;
|
|
|
|
|
|
|
|
struct CallParams {
|
|
|
|
ECMAObject *callTarget;
|
2021-12-17 09:18:10 +00:00
|
|
|
JSTaggedType newTarget;
|
|
|
|
JSTaggedType thisArg;
|
|
|
|
const JSTaggedType *argv;
|
2021-09-04 08:06:49 +00:00
|
|
|
uint32_t argc;
|
|
|
|
};
|
|
|
|
|
|
|
|
class EcmaInterpreter {
|
|
|
|
public:
|
2021-09-07 14:24:16 +00:00
|
|
|
static const uint32_t METHOD_HOTNESS_THRESHOLD = 512;
|
2021-12-17 09:18:10 +00:00
|
|
|
enum ActualNumArgsOfCall : uint8_t { CALLARG0 = 0, CALLARG1, CALLARGS2, CALLARGS3 };
|
2021-09-04 08:06:49 +00:00
|
|
|
|
|
|
|
static inline JSTaggedValue Execute(JSThread *thread, const CallParams& params);
|
|
|
|
static inline JSTaggedValue ExecuteNative(JSThread *thread, const CallParams& params);
|
|
|
|
static inline JSTaggedValue GeneratorReEnterInterpreter(JSThread *thread, JSHandle<GeneratorContext> context);
|
|
|
|
static inline void ChangeGenContext(JSThread *thread, JSHandle<GeneratorContext> context);
|
|
|
|
static inline void ResumeContext(JSThread *thread);
|
|
|
|
static inline void RunInternal(JSThread *thread, ConstantPool *constpool, const uint8_t *pc, JSTaggedType *sp);
|
|
|
|
static inline uint8_t ReadU8(const uint8_t *pc, uint32_t offset);
|
|
|
|
static inline void InitStackFrame(JSThread *thread);
|
|
|
|
static inline uint32_t FindCatchBlock(JSMethod *caller, uint32_t pc);
|
|
|
|
static inline size_t GetJumpSizeAfterCall(const uint8_t *prevPc);
|
|
|
|
|
2021-12-17 09:18:10 +00:00
|
|
|
static inline JSTaggedValue GetRuntimeProfileTypeInfo(JSTaggedType *sp);
|
|
|
|
static inline bool UpdateHotnessCounter(JSThread* thread, JSTaggedType *sp, JSTaggedValue acc, int32_t offset);
|
2021-09-04 08:06:49 +00:00
|
|
|
static inline void NotifyBytecodePcChanged(JSThread *thread);
|
|
|
|
static inline JSTaggedValue GetThisFunction(JSTaggedType *sp);
|
2021-12-17 09:18:10 +00:00
|
|
|
static inline JSTaggedValue GetNewTarget(JSTaggedType *sp);
|
|
|
|
static inline uint32_t GetNumArgs(JSTaggedType *sp, uint32_t restIdx, uint32_t &startIdx);
|
2022-03-01 02:57:53 +00:00
|
|
|
static inline JSTaggedType* GetCurrentFrameState(JSTaggedType *sp);
|
2022-03-01 11:19:40 +00:00
|
|
|
static inline JSTaggedValue GetThisObjectFromFastNewFrame(JSTaggedType *sp);
|
|
|
|
static inline bool IsFastNewFrameEnter(JSMethod *method);
|
|
|
|
static inline bool IsFastNewFrameExit(JSTaggedType *sp);
|
2021-09-04 08:06:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum EcmaOpcode {
|
2021-09-07 14:24:16 +00:00
|
|
|
LDNAN_PREF,
|
|
|
|
LDINFINITY_PREF,
|
|
|
|
LDGLOBALTHIS_PREF,
|
|
|
|
LDUNDEFINED_PREF,
|
|
|
|
LDNULL_PREF,
|
|
|
|
LDSYMBOL_PREF,
|
|
|
|
LDGLOBAL_PREF,
|
|
|
|
LDTRUE_PREF,
|
|
|
|
LDFALSE_PREF,
|
|
|
|
THROWDYN_PREF,
|
|
|
|
TYPEOFDYN_PREF,
|
|
|
|
LDLEXENVDYN_PREF,
|
|
|
|
POPLEXENVDYN_PREF,
|
|
|
|
GETUNMAPPEDARGS_PREF,
|
|
|
|
GETPROPITERATOR_PREF,
|
|
|
|
ASYNCFUNCTIONENTER_PREF,
|
|
|
|
LDHOLE_PREF,
|
|
|
|
RETURNUNDEFINED_PREF,
|
|
|
|
CREATEEMPTYOBJECT_PREF,
|
|
|
|
CREATEEMPTYARRAY_PREF,
|
|
|
|
GETITERATOR_PREF,
|
|
|
|
THROWTHROWNOTEXISTS_PREF,
|
|
|
|
THROWPATTERNNONCOERCIBLE_PREF,
|
|
|
|
LDHOMEOBJECT_PREF,
|
|
|
|
THROWDELETESUPERPROPERTY_PREF,
|
|
|
|
DEBUGGER_PREF,
|
|
|
|
ADD2DYN_PREF_V8,
|
|
|
|
SUB2DYN_PREF_V8,
|
|
|
|
MUL2DYN_PREF_V8,
|
|
|
|
DIV2DYN_PREF_V8,
|
|
|
|
MOD2DYN_PREF_V8,
|
|
|
|
EQDYN_PREF_V8,
|
|
|
|
NOTEQDYN_PREF_V8,
|
|
|
|
LESSDYN_PREF_V8,
|
|
|
|
LESSEQDYN_PREF_V8,
|
|
|
|
GREATERDYN_PREF_V8,
|
|
|
|
GREATEREQDYN_PREF_V8,
|
|
|
|
SHL2DYN_PREF_V8,
|
|
|
|
SHR2DYN_PREF_V8,
|
|
|
|
ASHR2DYN_PREF_V8,
|
|
|
|
AND2DYN_PREF_V8,
|
|
|
|
OR2DYN_PREF_V8,
|
|
|
|
XOR2DYN_PREF_V8,
|
|
|
|
TONUMBER_PREF_V8,
|
|
|
|
NEGDYN_PREF_V8,
|
|
|
|
NOTDYN_PREF_V8,
|
|
|
|
INCDYN_PREF_V8,
|
|
|
|
DECDYN_PREF_V8,
|
|
|
|
EXPDYN_PREF_V8,
|
|
|
|
ISINDYN_PREF_V8,
|
|
|
|
INSTANCEOFDYN_PREF_V8,
|
|
|
|
STRICTNOTEQDYN_PREF_V8,
|
|
|
|
STRICTEQDYN_PREF_V8,
|
|
|
|
RESUMEGENERATOR_PREF_V8,
|
|
|
|
GETRESUMEMODE_PREF_V8,
|
|
|
|
CREATEGENERATOROBJ_PREF_V8,
|
|
|
|
THROWCONSTASSIGNMENT_PREF_V8,
|
|
|
|
GETTEMPLATEOBJECT_PREF_V8,
|
|
|
|
GETNEXTPROPNAME_PREF_V8,
|
|
|
|
CALLARG0DYN_PREF_V8,
|
|
|
|
THROWIFNOTOBJECT_PREF_V8,
|
|
|
|
ITERNEXT_PREF_V8,
|
|
|
|
CLOSEITERATOR_PREF_V8,
|
|
|
|
COPYMODULE_PREF_V8,
|
|
|
|
SUPERCALLSPREAD_PREF_V8,
|
|
|
|
DELOBJPROP_PREF_V8_V8,
|
|
|
|
NEWOBJSPREADDYN_PREF_V8_V8,
|
|
|
|
CREATEITERRESULTOBJ_PREF_V8_V8,
|
|
|
|
SUSPENDGENERATOR_PREF_V8_V8,
|
|
|
|
ASYNCFUNCTIONAWAITUNCAUGHT_PREF_V8_V8,
|
|
|
|
THROWUNDEFINEDIFHOLE_PREF_V8_V8,
|
|
|
|
CALLARG1DYN_PREF_V8_V8,
|
|
|
|
COPYDATAPROPERTIES_PREF_V8_V8,
|
|
|
|
STARRAYSPREAD_PREF_V8_V8,
|
|
|
|
GETITERATORNEXT_PREF_V8_V8,
|
|
|
|
SETOBJECTWITHPROTO_PREF_V8_V8,
|
|
|
|
LDOBJBYVALUE_PREF_V8_V8,
|
|
|
|
STOBJBYVALUE_PREF_V8_V8,
|
|
|
|
STOWNBYVALUE_PREF_V8_V8,
|
|
|
|
LDSUPERBYVALUE_PREF_V8_V8,
|
|
|
|
STSUPERBYVALUE_PREF_V8_V8,
|
|
|
|
LDOBJBYINDEX_PREF_V8_IMM32,
|
|
|
|
STOBJBYINDEX_PREF_V8_IMM32,
|
|
|
|
STOWNBYINDEX_PREF_V8_IMM32,
|
|
|
|
CALLSPREADDYN_PREF_V8_V8_V8,
|
|
|
|
ASYNCFUNCTIONRESOLVE_PREF_V8_V8_V8,
|
|
|
|
ASYNCFUNCTIONREJECT_PREF_V8_V8_V8,
|
|
|
|
CALLARGS2DYN_PREF_V8_V8_V8,
|
|
|
|
CALLARGS3DYN_PREF_V8_V8_V8_V8,
|
|
|
|
DEFINEGETTERSETTERBYVALUE_PREF_V8_V8_V8_V8,
|
|
|
|
NEWOBJDYNRANGE_PREF_IMM16_V8,
|
|
|
|
CALLIRANGEDYN_PREF_IMM16_V8,
|
|
|
|
CALLITHISRANGEDYN_PREF_IMM16_V8,
|
|
|
|
SUPERCALL_PREF_IMM16_V8,
|
|
|
|
CREATEOBJECTWITHEXCLUDEDKEYS_PREF_IMM16_V8_V8,
|
|
|
|
DEFINEFUNCDYN_PREF_ID16_IMM16_V8,
|
|
|
|
DEFINENCFUNCDYN_PREF_ID16_IMM16_V8,
|
|
|
|
DEFINEGENERATORFUNC_PREF_ID16_IMM16_V8,
|
|
|
|
DEFINEASYNCFUNC_PREF_ID16_IMM16_V8,
|
|
|
|
DEFINEMETHOD_PREF_ID16_IMM16_V8,
|
|
|
|
NEWLEXENVDYN_PREF_IMM16,
|
|
|
|
COPYRESTARGS_PREF_IMM16,
|
|
|
|
CREATEARRAYWITHBUFFER_PREF_IMM16,
|
|
|
|
CREATEOBJECTHAVINGMETHOD_PREF_IMM16,
|
|
|
|
THROWIFSUPERNOTCORRECTCALL_PREF_IMM16,
|
|
|
|
CREATEOBJECTWITHBUFFER_PREF_IMM16,
|
|
|
|
LDLEXVARDYN_PREF_IMM4_IMM4,
|
|
|
|
LDLEXVARDYN_PREF_IMM8_IMM8,
|
|
|
|
LDLEXVARDYN_PREF_IMM16_IMM16,
|
|
|
|
STLEXVARDYN_PREF_IMM4_IMM4_V8,
|
|
|
|
STLEXVARDYN_PREF_IMM8_IMM8_V8,
|
|
|
|
STLEXVARDYN_PREF_IMM16_IMM16_V8,
|
|
|
|
DEFINECLASSWITHBUFFER_PREF_ID16_IMM16_IMM16_V8_V8,
|
2022-01-30 08:01:33 +00:00
|
|
|
GETMODULENAMESPACE_PREF_ID32,
|
2021-09-07 14:24:16 +00:00
|
|
|
STMODULEVAR_PREF_ID32,
|
|
|
|
TRYLDGLOBALBYNAME_PREF_ID32,
|
|
|
|
TRYSTGLOBALBYNAME_PREF_ID32,
|
|
|
|
LDGLOBALVAR_PREF_ID32,
|
|
|
|
STGLOBALVAR_PREF_ID32,
|
|
|
|
LDOBJBYNAME_PREF_ID32_V8,
|
|
|
|
STOBJBYNAME_PREF_ID32_V8,
|
|
|
|
STOWNBYNAME_PREF_ID32_V8,
|
|
|
|
LDSUPERBYNAME_PREF_ID32_V8,
|
|
|
|
STSUPERBYNAME_PREF_ID32_V8,
|
2022-01-30 08:01:33 +00:00
|
|
|
LDMODULEVAR_PREF_ID32_IMM8,
|
2021-09-07 14:24:16 +00:00
|
|
|
CREATEREGEXPWITHLITERAL_PREF_ID32_IMM8,
|
|
|
|
ISTRUE_PREF,
|
|
|
|
ISFALSE_PREF,
|
2021-09-10 08:34:37 +00:00
|
|
|
STCONSTTOGLOBALRECORD_PREF_ID32,
|
|
|
|
STLETTOGLOBALRECORD_PREF_ID32,
|
|
|
|
STCLASSTOGLOBALRECORD_PREF_ID32,
|
2021-09-15 06:54:22 +00:00
|
|
|
STOWNBYVALUEWITHNAMESET_PREF_V8_V8,
|
|
|
|
STOWNBYNAMEWITHNAMESET_PREF_ID32_V8,
|
2021-12-17 09:18:10 +00:00
|
|
|
LDFUNCTION_PREF,
|
2022-02-26 07:55:01 +00:00
|
|
|
NEWLEXENVWITHNAMEDYN_PREF_IMM16_IMM16,
|
2022-03-16 09:46:59 +00:00
|
|
|
LDBIGINT_PREF_ID32,
|
2021-09-04 08:06:49 +00:00
|
|
|
MOV_DYN_V8_V8,
|
|
|
|
MOV_DYN_V16_V16,
|
|
|
|
LDA_STR_ID32,
|
|
|
|
LDAI_DYN_IMM32,
|
|
|
|
FLDAI_DYN_IMM64,
|
|
|
|
JMP_IMM8,
|
|
|
|
JMP_IMM16,
|
|
|
|
JMP_IMM32,
|
|
|
|
JEQZ_IMM8,
|
|
|
|
JEQZ_IMM16,
|
|
|
|
LDA_DYN_V8,
|
|
|
|
STA_DYN_V8,
|
|
|
|
RETURN_DYN,
|
|
|
|
MOV_V4_V4,
|
|
|
|
JNEZ_IMM8,
|
|
|
|
JNEZ_IMM16,
|
|
|
|
LAST_OPCODE,
|
|
|
|
};
|
2022-01-19 01:11:02 +00:00
|
|
|
|
|
|
|
// if modify EcmaOpcode, please update GetEcmaOpcodeStr()
|
|
|
|
inline std::string GetEcmaOpcodeStr(EcmaOpcode opcode);
|
2021-09-04 08:06:49 +00:00
|
|
|
} // namespace panda::ecmascript
|
2021-09-07 14:24:16 +00:00
|
|
|
#endif // ECMASCRIPT_INTERPRETER_INTERPRETER_H
|