• 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_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 
23 namespace panda::ecmascript {
24 class GlobalEnv;
25 class JSArray;
26 
27 class SlowRuntimeStub {
28 public:
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 
70     static JSTaggedValue NewLexicalEnv(JSThread *thread, uint16_t numVars);
71     static JSTaggedValue NewLexicalEnvWithName(JSThread *thread, uint16_t numVars, uint16_t scopeId);
72     static JSTaggedValue CreateIterResultObj(JSThread *thread, JSTaggedValue value, JSTaggedValue flag);
73 
74     static JSTaggedValue CreateGeneratorObj(JSThread *thread, JSTaggedValue genFunc);
75     static JSTaggedValue SuspendGenerator(JSThread *thread, JSTaggedValue genObj, JSTaggedValue value);
76     static void SetGeneratorState(JSThread *thread, JSTaggedValue genObj, int32_t index);
77     static JSTaggedValue AsyncFunctionAwaitUncaught(JSThread *thread, JSTaggedValue asyncFuncObj, JSTaggedValue value);
78     static JSTaggedValue AsyncFunctionResolveOrReject(JSThread *thread, JSTaggedValue asyncFuncObj, JSTaggedValue value,
79                                                       bool is_resolve);
80 
81     static JSTaggedValue NewObjApply(JSThread *thread, JSTaggedValue func, JSTaggedValue array);
82     static void ThrowUndefinedIfHole(JSThread *thread, JSTaggedValue obj);
83     static void ThrowIfNotObject(JSThread *thread);
84     static void ThrowThrowNotExists(JSThread *thread);
85     static void ThrowPatternNonCoercible(JSThread *thread);
86     static JSTaggedValue ThrowIfSuperNotCorrectCall(JSThread *thread, uint16_t index, JSTaggedValue thisValue);
87     static void ThrowDeleteSuperProperty(JSThread *thread);
88 
89     static JSTaggedValue StOwnByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
90     static JSTaggedValue StOwnByNameWithNameSet(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop,
91                                                 JSTaggedValue value);
92     static JSTaggedValue StOwnByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, JSTaggedValue value);
93     static JSTaggedValue StOwnByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue value);
94     static JSTaggedValue StOwnByValueWithNameSet(JSThread *thread, JSTaggedValue obj, JSTaggedValue key,
95                                                  JSTaggedValue value);
96     static JSTaggedValue CreateEmptyArray(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv);
97     static JSTaggedValue CreateEmptyObject(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv);
98     static JSTaggedValue CreateObjectWithBuffer(JSThread *thread, ObjectFactory *factory, JSObject *literal);
99     static JSTaggedValue CreateObjectHavingMethod(JSThread *thread, ObjectFactory *factory, JSObject *literal,
100                                                   JSTaggedValue env);
101     static JSTaggedValue SetObjectWithProto(JSThread *thread, JSTaggedValue proto, JSTaggedValue obj);
102     static JSTaggedValue CreateArrayWithBuffer(JSThread *thread, ObjectFactory *factory, JSArray *literal);
103 
104     static JSTaggedValue GetTemplateObject(JSThread *thread, JSTaggedValue literal);
105     static JSTaggedValue GetNextPropName(JSThread *thread, JSTaggedValue iter);
106     static JSTaggedValue CopyDataProperties(JSThread *thread, JSTaggedValue dst, JSTaggedValue src);
107 
108     static JSTaggedValue GetUnmapedArgs(JSThread *thread, JSTaggedType *sp, uint32_t actualNumArgs, uint32_t startIdx);
109     static JSTaggedValue CopyRestArgs(JSThread *thread, JSTaggedType *sp, uint32_t restNumArgs, uint32_t startIdx);
110     static JSTaggedValue GetIterator(JSThread *thread, JSTaggedValue obj);
111     static JSTaggedValue GetAsyncIterator(JSThread *thread, JSTaggedValue obj);
112     static JSTaggedValue IterNext(JSThread *thread, JSTaggedValue iter);
113     static JSTaggedValue CloseIterator(JSThread *thread, JSTaggedValue iter);
114     static void StModuleVar(JSThread *thread, JSTaggedValue key, JSTaggedValue value);
115     static JSTaggedValue LdModuleVar(JSThread *thread, JSTaggedValue key, bool inner);
116     static void StModuleVar(JSThread *thread, int32_t index, JSTaggedValue value);
117     static JSTaggedValue LdLocalModuleVar(JSThread *thread, int32_t index);
118     static JSTaggedValue LdExternalModuleVar(JSThread *thread, int32_t index);
119     static JSTaggedValue CreateRegExpWithLiteral(JSThread *thread, JSTaggedValue pattern, uint8_t flags);
120     static JSTaggedValue GetIteratorNext(JSThread *thread, JSTaggedValue obj, JSTaggedValue method);
121 
122     static JSTaggedValue DefineGetterSetterByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop,
123                                                    JSTaggedValue getter, JSTaggedValue setter, bool flag);
124 
125     static JSTaggedValue LdObjByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, bool callGetter,
126                                       JSTaggedValue receiver);
127     static JSTaggedValue StObjByIndex(JSThread *thread, JSTaggedValue obj, uint32_t idx, JSTaggedValue value);
128     static JSTaggedValue LdObjByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, bool callGetter,
129                                      JSTaggedValue receiver);
130     static JSTaggedValue StObjByName(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
131     static JSTaggedValue LdObjByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, bool callGetter,
132                                       JSTaggedValue receiver);
133     static JSTaggedValue StObjByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue prop, JSTaggedValue value);
134     static JSTaggedValue TryLdGlobalByNameFromGlobalProto(JSThread *thread, JSTaggedValue global, JSTaggedValue prop);
135     static JSTaggedValue TryStGlobalByName(JSThread *thread, JSTaggedValue prop);
136     static JSTaggedValue LdGlobalVarFromGlobalProto(JSThread *thread, JSTaggedValue global, JSTaggedValue prop);
137     static JSTaggedValue StGlobalVar(JSThread *thread, JSTaggedValue prop, JSTaggedValue value);
138     static JSTaggedValue StGlobalRecord(JSThread *thread, JSTaggedValue prop, JSTaggedValue value, bool isConst);
139     static JSTaggedValue LdGlobalRecord(JSThread *thread, JSTaggedValue key);
140     static JSTaggedValue TryUpdateGlobalRecord(JSThread *thread, JSTaggedValue prop, JSTaggedValue value);
141     static JSTaggedValue StArraySpread(JSThread *thread, JSTaggedValue dst, JSTaggedValue index, JSTaggedValue src);
142 
143     static JSTaggedValue DefineFunc(JSThread *thread, Method *method);
144 
145     static JSTaggedValue GetSuperConstructor(JSThread *thread, JSTaggedValue ctor);
146     static JSTaggedValue SuperCall(JSThread *thread, JSTaggedValue func, JSTaggedValue newTarget, uint16_t firstVRegIdx,
147                                    uint16_t length);
148     static JSTaggedValue SuperCallSpread(JSThread *thread, JSTaggedValue func, JSTaggedValue newTarget,
149                                          JSTaggedValue array);
150     static JSTaggedValue DynamicImport(JSThread *thread, JSTaggedValue specifier, JSTaggedValue func);
151     static JSTaggedValue DefineMethod(JSThread *thread, Method *method, JSTaggedValue homeObject);
152     static JSTaggedValue LdSuperByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue thisFunc);
153     static JSTaggedValue StSuperByValue(JSThread *thread, JSTaggedValue obj, JSTaggedValue key, JSTaggedValue value,
154                                         JSTaggedValue thisFunc);
155     static JSTaggedValue NotifyInlineCache(JSThread *thread, Method *method);
156     static JSTaggedValue ThrowReferenceError(JSThread *thread, JSTaggedValue prop, const char *desc);
157 
158     static JSTaggedValue ResolveClass(JSThread *thread, JSTaggedValue ctor, TaggedArray *literal, JSTaggedValue base,
159                                       JSTaggedValue lexenv);
160     static JSTaggedValue CloneClassFromTemplate(JSThread *thread, JSTaggedValue ctor, JSTaggedValue base,
161                                                 JSTaggedValue lexenv);
162     static JSTaggedValue CreateClassWithBuffer(JSThread *thread, JSTaggedValue base,
163                                                JSTaggedValue lexenv, JSTaggedValue constpool,
164                                                uint16_t methodId, uint16_t literalId, JSTaggedValue module);
165     static JSTaggedValue SetClassConstructorLength(JSThread *thread, JSTaggedValue ctor, JSTaggedValue length);
166     static JSTaggedValue GetModuleNamespace(JSThread *thread, JSTaggedValue localName);
167     static JSTaggedValue GetModuleNamespace(JSThread *thread, int32_t index);
168     static JSTaggedValue LdBigInt(JSThread *thread, JSTaggedValue numberBigInt);
169     static JSTaggedValue ThrowTypeError(JSThread *thread, const char *message);
170     static JSTaggedValue SetClassInheritanceRelationship(JSThread *thread, JSTaggedValue ctor, JSTaggedValue base);
171 
172     static JSTaggedValue AsyncGeneratorResolve(JSThread *thread, JSTaggedValue asyncFuncObj,
173                                                const JSTaggedValue value, JSTaggedValue flag);
174     static JSTaggedValue AsyncGeneratorReject(JSThread *thread, JSTaggedValue asyncFuncObj,
175                                               const JSTaggedValue value);
176     static JSTaggedValue CreateAsyncGeneratorObj(JSThread *thread, JSTaggedValue genFunc);
177 
178     static JSTaggedValue LdPatchVar(JSThread *thread, uint32_t index);
179     static JSTaggedValue StPatchVar(JSThread *thread, uint32_t index, JSTaggedValue value);
180 
181     static JSTaggedValue NotifyConcurrentResult(JSThread *thread, JSTaggedValue result, JSTaggedValue hint);
182 
183 private:
184     static JSTaggedValue ThrowSyntaxError(JSThread *thread, const char *message);
185     static JSTaggedValue GetCallSpreadArgs(JSThread *thread, JSTaggedValue array);
186 };
187 }  // namespace panda::ecmascript
188 #endif  // ECMASCRIPT_INTERPRETER_SLOW_RUNTIME_STUB_H
189