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_SLOW_RUNTIME_STUB_H
17#define ECMASCRIPT_INTERPRETER_SLOW_RUNTIME_STUB_H
18
19#include "ecmascript/jspandafile/program_object.h"
20#include "ecmascript/js_tagged_value.h"
21#include "ecmascript/js_thread.h"
22
23namespace panda::ecmascript {
24class GlobalEnv;
25class JSArray;
26
27class SlowRuntimeStub {
28public:
29    static JSTaggedValue CallSpread(JSThread *thread, JSTaggedValue func, JSTaggedValue obj, JSTaggedValue array);
30    static JSTaggedValue Neg(JSThread *thread, JSTaggedValue value);
31    static JSTaggedValue AsyncFunctionEnter(JSThread *thread);
32    static JSTaggedValue ToNumber(JSThread *thread, JSTaggedValue value);
33    static JSTaggedValue ToNumeric(JSThread *thread, JSTaggedValue value);
34    static JSTaggedValue Not(JSThread *thread, JSTaggedValue value);
35    static JSTaggedValue Inc(JSThread *thread, JSTaggedValue value);
36    static JSTaggedValue Dec(JSThread *thread, JSTaggedValue value);
37    static void Throw(JSThread *thread, JSTaggedValue value);
38    static JSTaggedValue GetPropIterator(JSThread *thread, JSTaggedValue value);
39    static void ThrowConstAssignment(JSThread *thread, JSTaggedValue value);
40    static JSTaggedValue Add2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
41    static JSTaggedValue Sub2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
42    static JSTaggedValue Mul2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
43    static JSTaggedValue Div2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
44    static JSTaggedValue Mod2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
45    static JSTaggedValue Eq(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
46    static JSTaggedValue NotEq(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
47    static JSTaggedValue Less(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
48    static JSTaggedValue LessEq(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
49    static JSTaggedValue Greater(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
50    static JSTaggedValue GreaterEq(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
51    static JSTaggedValue Shl2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
52    static JSTaggedValue Shr2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
53    static JSTaggedValue Ashr2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
54    static JSTaggedValue And2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
55    static JSTaggedValue Or2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
56    static JSTaggedValue Xor2(JSThread *thread, JSTaggedValue left, JSTaggedValue right);
57
58    static JSTaggedValue ToJSTaggedValueWithInt32(JSThread *thread, JSTaggedValue value);
59    static JSTaggedValue ToJSTaggedValueWithUint32(JSThread *thread, JSTaggedValue value);
60
61    static JSTaggedValue DelObjProp(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop);
62    static JSTaggedValue NewObjRange(JSThread *thread, JSTaggedValue func, JSTaggedValue newTarget,
63                                        uint16_t firstArgIdx, uint16_t length);
64    static JSTaggedValue CreateObjectWithExcludedKeys(JSThread *thread, uint16_t numKeys, JSTaggedValue objVal,
65                                                      uint16_t firstArgRegIdx);
66    static JSTaggedValue Exp(JSThread *thread, JSTaggedValue base, JSTaggedValue exponent);
67    static JSTaggedValue IsIn(JSThread *thread, JSTaggedValue prop, JSTaggedValue obj);
68    static JSTaggedValue Instanceof(JSThread *thread, JSTaggedValue obj, JSTaggedValue target);
69    static JSTaggedValue InstanceofByHandler(JSThread *thread, JSTaggedValue target, JSTaggedValue object,
70                                             JSTaggedValue instOfHandler);
71
72    static JSTaggedValue NewLexicalEnv(JSThread *thread, uint16_t numVars);
73    static JSTaggedValue NewSendableEnv(JSThread *thread, uint16_t numVars);
74    static JSTaggedValue NewLexicalEnvWithName(JSThread *thread, uint16_t numVars, uint16_t scopeId);
75    static JSTaggedValue CreateIterResultObj(JSThread *thread, JSTaggedValue value, JSTaggedValue flag);
76
77    static JSTaggedValue CreateGeneratorObj(JSThread *thread, JSTaggedValue genFunc);
78    static JSTaggedValue SuspendGenerator(JSThread *thread, JSTaggedValue genObj, JSTaggedValue value);
79    static void SetGeneratorState(JSThread *thread, JSTaggedValue genObj, int32_t index);
80    static JSTaggedValue AsyncFunctionAwaitUncaught(JSThread *thread, JSTaggedValue asyncFuncObj, JSTaggedValue value);
81    static JSTaggedValue AsyncFunctionResolveOrReject(JSThread *thread, JSTaggedValue asyncFuncObj, JSTaggedValue value,
82                                                      bool is_resolve);
83
84    static JSTaggedValue NewObjApply(JSThread *thread, JSTaggedValue func, JSTaggedValue array);
85    static void ThrowUndefinedIfHole(JSThread *thread, JSTaggedValue obj);
86    static void ThrowIfNotObject(JSThread *thread);
87    static void ThrowThrowNotExists(JSThread *thread);
88    static void ThrowPatternNonCoercible(JSThread *thread);
89    static JSTaggedValue ThrowIfSuperNotCorrectCall(JSThread *thread, uint16_t index, JSTaggedValue thisValue);
90    static void ThrowDeleteSuperProperty(JSThread *thread);
91
92    static JSTaggedValue StOwnByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
93    static JSTaggedValue StOwnByNameWithNameSet(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop,
94                                                JSTaggedValue value);
95    static JSTaggedValue StOwnByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, JSTaggedValue value);
96    static JSTaggedValue StOwnByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue value);
97    static JSTaggedValue StOwnByValueWithNameSet(JSThread *thread, JSTaggedValue obj, JSTaggedValue key,
98                                                 JSTaggedValue value);
99    static JSTaggedValue CreateEmptyArray(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv);
100    static JSTaggedValue CreateEmptyObject(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv);
101    static JSTaggedValue CreateObjectWithBuffer(JSThread *thread, ObjectFactory *factory, JSObject *literal);
102    static JSTaggedValue CreateObjectHavingMethod(JSThread *thread, ObjectFactory *factory, JSObject *literal,
103                                                  JSTaggedValue env);
104    static JSTaggedValue SetObjectWithProto(JSThread *thread, JSTaggedValue proto, JSTaggedValue obj);
105    static JSTaggedValue CreateArrayWithBuffer(JSThread *thread, ObjectFactory *factory, JSArray *literal);
106
107    static JSTaggedValue GetTemplateObject(JSThread *thread, JSTaggedValue literal);
108    static JSTaggedValue GetNextPropName(JSThread *thread, JSTaggedValue iter);
109    static JSTaggedValue CopyDataProperties(JSThread *thread, JSTaggedValue dst, JSTaggedValue src);
110
111    static JSTaggedValue GetUnmapedArgs(JSThread *thread, JSTaggedType *sp, uint32_t actualNumArgs, uint32_t startIdx);
112    static JSTaggedValue CopyRestArgs(JSThread *thread, JSTaggedType *sp, uint32_t restNumArgs, uint32_t startIdx);
113    static JSTaggedValue GetIterator(JSThread *thread, JSTaggedValue obj);
114    static JSTaggedValue GetAsyncIterator(JSThread *thread, JSTaggedValue obj);
115    static JSTaggedValue IterNext(JSThread *thread, JSTaggedValue iter);
116    static JSTaggedValue CloseIterator(JSThread *thread, JSTaggedValue iter);
117    static void StModuleVar(JSThread *thread, JSTaggedValue key, JSTaggedValue value);
118    static JSTaggedValue LdModuleVar(JSThread *thread, JSTaggedValue key, bool inner);
119    static void StModuleVar(JSThread *thread, int32_t index, JSTaggedValue value);
120    static JSTaggedValue LdLocalModuleVar(JSThread *thread, int32_t index);
121    static JSTaggedValue LdExternalModuleVar(JSThread *thread, int32_t index);
122    static JSTaggedValue LdSendableExternalModuleVar(JSThread *thread, int32_t index, JSTaggedValue thisFunc);
123    static JSTaggedValue LdLazyExternalModuleVar(JSThread *thread, int32_t index, JSTaggedValue thisFunc);
124    static JSTaggedValue LdLazySendableExternalModuleVar(JSThread *thread, int32_t index, JSTaggedValue thisFunc);
125    static JSTaggedValue CreateRegExpWithLiteral(JSThread *thread, JSTaggedValue pattern, uint8_t flags);
126    static JSTaggedValue GetIteratorNext(JSThread *thread, JSTaggedValue obj, JSTaggedValue method);
127
128    static JSTaggedValue DefineGetterSetterByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop,
129                                                   JSTaggedValue getter, JSTaggedValue setter, bool flag);
130
131    static JSTaggedValue LdObjByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, bool callGetter,
132                                      JSTaggedValue receiver);
133    static JSTaggedValue StObjByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, JSTaggedValue value);
134    static JSTaggedValue LdObjByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, bool callGetter,
135                                     JSTaggedValue receiver);
136    static JSTaggedValue StObjByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
137    static JSTaggedValue LdObjByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, bool callGetter,
138                                      JSTaggedValue receiver);
139    static JSTaggedValue StObjByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
140    static JSTaggedValue TryLdGlobalByNameFromGlobalProto(JSThread *thread, JSTaggedValue global, JSTaggedValue prop);
141    static JSTaggedValue TryStGlobalByName(JSThread *thread, JSTaggedValue prop);
142    static JSTaggedValue LdGlobalVarFromGlobalProto(JSThread *thread, JSTaggedValue global, JSTaggedValue prop);
143    static JSTaggedValue StGlobalVar(JSThread *thread, JSTaggedValue prop, JSTaggedValue value);
144    static JSTaggedValue StGlobalRecord(JSThread *thread, JSTaggedValue prop, JSTaggedValue value, bool isConst);
145    static JSTaggedValue LdGlobalRecord(JSThread *thread, JSTaggedValue key);
146    static JSTaggedValue TryUpdateGlobalRecord(JSThread *thread, JSTaggedValue prop, JSTaggedValue value);
147    static JSTaggedValue StArraySpread(JSThread *thread, JSTaggedValue dst, JSTaggedValue index, JSTaggedValue src);
148
149    static JSTaggedValue DefineFunc(JSThread *thread, JSTaggedValue constPool, uint16_t methodId,
150                                    JSTaggedValue module, uint16_t length, JSTaggedValue envHandle,
151                                    JSTaggedValue homeObject);
152    static JSTaggedValue GetSuperConstructor(JSThread *thread, JSTaggedValue ctor);
153    static JSTaggedValue SuperCall(JSThread *thread, JSTaggedValue func, JSTaggedValue newTarget, uint16_t firstVRegIdx,
154                                   uint16_t length);
155    static JSTaggedValue SuperCallSpread(JSThread *thread, JSTaggedValue func, JSTaggedValue newTarget,
156                                         JSTaggedValue array);
157    static JSTaggedValue SuperCallForwardAllArgs(JSThread *thread, JSTaggedType *sp, JSTaggedValue func,
158                                                 JSTaggedValue newTarget, uint32_t restNumArgs, uint32_t startIdx);
159    static JSTaggedValue DynamicImport(JSThread *thread, JSTaggedValue specifier, JSTaggedValue func);
160    static JSTaggedValue DefineMethod(JSThread *thread, Method *method, JSTaggedValue homeObject,
161                                      uint16_t length, JSTaggedValue env, JSTaggedValue module);
162    static JSTaggedValue LdSendableClass(JSThread *thread, JSTaggedValue env, uint16_t level);
163    static JSTaggedValue LdSuperByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue thisFunc);
164    static JSTaggedValue StSuperByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue value,
165                                        JSTaggedValue thisFunc);
166    static JSTaggedValue NotifyInlineCache(JSThread *thread, JSFunction *function);
167    static JSTaggedValue ThrowReferenceError(JSThread *thread, JSTaggedValue prop, const char *desc);
168
169    static JSTaggedValue ResolveClass(JSThread *thread, JSTaggedValue ctor, TaggedArray *literal, JSTaggedValue base,
170                                      JSTaggedValue lexenv);
171    static JSTaggedValue CloneClassFromTemplate(JSThread *thread, JSTaggedValue ctor, JSTaggedValue base,
172                                                JSTaggedValue lexenv);
173    static JSTaggedValue CreateClassWithBuffer(JSThread *thread, JSTaggedValue base,
174                                               JSTaggedValue lexenv, JSTaggedValue constpool,
175                                               uint16_t methodId, uint16_t literalId, JSTaggedValue module,
176                                               JSTaggedValue length);
177    static JSTaggedValue CreateSharedClass(JSThread *thread, JSTaggedValue base,
178                                           JSTaggedValue constpool, uint16_t methodId, uint16_t literalId,
179                                           uint16_t length, JSTaggedValue module);
180    static JSTaggedValue SetClassConstructorLength(JSThread *thread, JSTaggedValue ctor, JSTaggedValue length);
181    static JSTaggedValue GetModuleNamespace(JSThread *thread, JSTaggedValue localName);
182    static JSTaggedValue GetModuleNamespace(JSThread *thread, int32_t index);
183    static JSTaggedValue LdBigInt(JSThread *thread, JSTaggedValue numberBigInt);
184    static JSTaggedValue ThrowTypeError(JSThread *thread, const char *message);
185    static JSTaggedValue SetClassInheritanceRelationship(JSThread *thread, JSTaggedValue ctor, JSTaggedValue base);
186
187    static JSTaggedValue AsyncGeneratorResolve(JSThread *thread, JSTaggedValue asyncFuncObj,
188                                               const JSTaggedValue value, JSTaggedValue flag);
189    static JSTaggedValue AsyncGeneratorReject(JSThread *thread, JSTaggedValue asyncFuncObj,
190                                              const JSTaggedValue value);
191    static JSTaggedValue CreateAsyncGeneratorObj(JSThread *thread, JSTaggedValue genFunc);
192
193    static JSTaggedValue LdPatchVar(JSThread *thread, uint32_t index);
194    static JSTaggedValue StPatchVar(JSThread *thread, uint32_t index, JSTaggedValue value);
195
196    static JSTaggedValue NotifyConcurrentResult(JSThread *thread, JSTaggedValue result, JSTaggedValue hint);
197    static JSTaggedValue DefineField(JSThread *thread, JSTaggedValue obj, JSTaggedValue propKey, JSTaggedValue value);
198    static JSTaggedValue CreatePrivateProperty(JSThread *thread, JSTaggedValue lexicalEnv,
199        uint32_t count, JSTaggedValue constpool, uint32_t literalId, JSTaggedValue module);
200    static JSTaggedValue DefinePrivateProperty(JSThread *thread, JSTaggedValue lexicalEnv,
201        uint32_t levelIndex, uint32_t slotIndex, JSTaggedValue obj, JSTaggedValue value);
202    static JSTaggedValue LdPrivateProperty(JSThread *thread, JSTaggedValue lexicalEnv,
203        uint32_t levelIndex, uint32_t slotIndex, JSTaggedValue obj);
204    static JSTaggedValue StPrivateProperty(JSThread *thread, JSTaggedValue lexicalEnv,
205        uint32_t levelIndex, uint32_t slotIndex, JSTaggedValue obj, JSTaggedValue value);
206    static JSTaggedValue TestIn(JSThread *thread, JSTaggedValue lexicalEnv,
207        uint32_t levelIndex, uint32_t slotIndex, JSTaggedValue obj);
208    static JSTaggedValue UpdateAOTHClass(JSThread *thread, JSTaggedValue jshclass,
209                                         JSTaggedValue newjshclass, JSTaggedValue key);
210
211private:
212    static JSTaggedValue ThrowSyntaxError(JSThread *thread, const char *message);
213    static JSTaggedValue GetCallSpreadArgs(JSThread *thread, JSTaggedValue array);
214};
215}  // namespace panda::ecmascript
216#endif  // ECMASCRIPT_INTERPRETER_SLOW_RUNTIME_STUB_H
217