• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022 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
16import {
17    EcmaCallarg0dyn,
18    EcmaCallarg1dyn,
19    EcmaCallargs2dyn,
20    EcmaCallargs3dyn,
21    EcmaCallirangedyn,
22    EcmaCallithisrangedyn,
23    EcmaCloseiterator,
24    EcmaCopydataproperties,
25    EcmaCopymodule,
26    EcmaCreatearraywithbuffer,
27    EcmaCreateemptyarray,
28    EcmaCreateemptyobject,
29    EcmaCreateobjecthavingmethod,
30    EcmaCreateobjectwithbuffer,
31    EcmaCreateobjectwithexcludedkeys,
32    EcmaCreateregexpwithliteral,
33    EcmaDebugger,
34    EcmaDefineasyncfunc,
35    EcmaDefineclasswithbuffer,
36    EcmaDefinefuncdyn,
37    EcmaDefinegeneratorfunc,
38    EcmaDefinegettersetterbyvalue,
39    EcmaDefinemethod,
40    EcmaDefinencfuncdyn,
41    EcmaDelobjprop,
42    EcmaGetiterator,
43    EcmaGetiteratornext,
44    EcmaGetnextpropname,
45    EcmaGetpropiterator,
46    EcmaImportmodule,
47    EcmaIsfalse,
48    EcmaIstrue,
49    EcmaLdglobalvar,
50    EcmaLdhomeobject,
51    EcmaLdlexenvdyn,
52    EcmaLdlexvardyn,
53    EcmaLdmodvarbyname,
54    EcmaLdobjbyindex,
55    EcmaLdobjbyname,
56    EcmaLdobjbyvalue,
57    EcmaLdsuperbyname,
58    EcmaLdsuperbyvalue,
59    EcmaNewlexenvdyn,
60    EcmaNewlexenvwithnamedyn,
61    EcmaNewobjdynrange,
62    EcmaPoplexenvdyn,
63    EcmaReturnundefined,
64    EcmaSetobjectwithproto,
65    EcmaStarrayspread,
66    EcmaStclasstoglobalrecord,
67    EcmaStconsttoglobalrecord,
68    EcmaStglobalvar,
69    EcmaStlettoglobalrecord,
70    EcmaStlexvardyn,
71    EcmaStmodulevar,
72    EcmaStobjbyindex,
73    EcmaStobjbyname,
74    EcmaStobjbyvalue,
75    EcmaStownbyindex,
76    EcmaStownbyname,
77    EcmaStownbynamewithnameset,
78    EcmaStownbyvalue,
79    EcmaStownbyvaluewithnameset,
80    EcmaStsuperbyname,
81    EcmaStsuperbyvalue,
82    EcmaSupercall,
83    EcmaSupercallspread,
84    EcmaThrowconstassignment,
85    EcmaThrowdeletesuperproperty,
86    EcmaThrowdyn,
87    EcmaThrowifnotobject,
88    EcmaThrowifsupernotcorrectcall,
89    EcmaThrowpatternnoncoercible,
90    EcmaThrowthrownotexists,
91    EcmaThrowundefinedifhole,
92    EcmaTryldglobalbyname,
93    EcmaTrystglobalbyname,
94    FldaiDyn,
95    Imm,
96    IRNode,
97    Jmp,
98    Label,
99    LdaDyn,
100    LdaiDyn,
101    LdaStr,
102    MovDyn,
103    StaDyn,
104    EcmaLdbigint,
105    VReg
106} from "../irnodes";
107
108export function loadAccumulatorInt(value: number): IRNode {
109    return new LdaiDyn(new Imm(value));
110}
111
112export function loadAccumulatorFloat(value: number): IRNode {
113    return new FldaiDyn(new Imm(value));
114}
115
116export function loadAccumulatorString(value: string): IRNode {
117    return new LdaStr(value);
118}
119
120export function loadAccumulator(vreg: VReg): IRNode {
121    return new LdaDyn(vreg);
122}
123
124export function storeAccumulator(vreg: VReg): IRNode {
125    return new StaDyn(vreg);
126}
127
128export function deleteObjProperty(obj: VReg, prop: VReg): IRNode {
129    return new EcmaDelobjprop(obj, prop);
130}
131
132export function moveVreg(vd: VReg, vs: VReg): IRNode {
133    return new MovDyn(vd, vs);
134}
135
136export function jumpTarget(target: Label): IRNode {
137    return new Jmp(target);
138}
139
140export function creatDebugger(): IRNode {
141    return new EcmaDebugger();
142}
143
144export function throwException(): IRNode {
145    return new EcmaThrowdyn();
146}
147
148export function throwConstAssignment(name: VReg) {
149    return new EcmaThrowconstassignment(name);
150}
151
152export function throwUndefinedIfHole(hole: VReg, name: VReg) {
153    return new EcmaThrowundefinedifhole(hole, name);
154}
155
156export function throwThrowNotExists() {
157    return new EcmaThrowthrownotexists();
158}
159
160export function throwDeleteSuperProperty() {
161    return new EcmaThrowdeletesuperproperty();
162}
163
164export function newLexicalEnv(numVars: number, scopeInfoIdx: number | undefined) {
165    if (scopeInfoIdx == undefined) {
166        return new EcmaNewlexenvdyn(new Imm(numVars));
167    }
168    return new EcmaNewlexenvwithnamedyn(new Imm(numVars), new Imm(scopeInfoIdx));
169}
170
171export function loadLexicalEnv() {
172    return new EcmaLdlexenvdyn();
173}
174
175export function popLexicalEnv() {
176    return new EcmaPoplexenvdyn();
177}
178
179export function loadLexicalVar(level: number, slot: number) {
180    return new EcmaLdlexvardyn(new Imm(level), new Imm(slot));
181}
182
183export function storeLexicalVar(level: number, slot: number, value: VReg) {
184    return new EcmaStlexvardyn(new Imm(level), new Imm(slot), value);
185}
186
187export function tryLoadGlobalByName(key: string) {
188    return new EcmaTryldglobalbyname(key);
189}
190
191export function tryStoreGlobalByName(key: string) {
192    return new EcmaTrystglobalbyname(key);
193}
194
195export function loadGlobalVar(name: string) {
196    return new EcmaLdglobalvar(name);
197}
198
199export function storeGlobalVar(name: string) {
200    return new EcmaStglobalvar(name);
201}
202
203export function loadObjByName(obj: VReg, key: string) {
204    return new EcmaLdobjbyname(key, obj);
205}
206
207export function storeObjByName(obj: VReg, key: string) {
208    return new EcmaStobjbyname(key, obj);
209}
210
211export function loadObjByIndex(obj: VReg, index: number) {
212    return new EcmaLdobjbyindex(obj, new Imm(index));
213}
214
215export function storeObjByIndex(obj: VReg, index: number) {
216    return new EcmaStobjbyindex(obj, new Imm(index));
217}
218
219export function loadObjByValue(obj: VReg, prop: VReg): IRNode {
220    return new EcmaLdobjbyvalue(obj, prop);
221}
222
223export function storeObjByValue(obj: VReg, prop: VReg): IRNode {
224    return new EcmaStobjbyvalue(obj, prop);
225}
226
227export function storeOwnByName(obj: VReg, key: string, nameSetting: boolean): IRNode {
228    return nameSetting ? new EcmaStownbynamewithnameset(key, obj) : new EcmaStownbyname(key, obj);
229}
230
231export function storeOwnByIndex(obj: VReg, index: number) {
232    return new EcmaStownbyindex(obj, new Imm(index));
233}
234
235export function storeOwnByValue(obj: VReg, value: VReg, nameSetting: boolean) {
236    return nameSetting ? new EcmaStownbyvaluewithnameset(obj, value) : new EcmaStownbyvalue(obj, value);
237}
238
239export function throwIfSuperNotCorrectCall(num: number) {
240    return new EcmaThrowifsupernotcorrectcall(new Imm(num));
241}
242
243export function call(args: VReg[], passThis: boolean) {
244    let length = args.length;
245    let insn: IRNode;
246    if (!passThis) {
247        switch (length) {
248            case 1:
249                insn = new EcmaCallarg0dyn(args[0]);
250                break;
251            case 2:
252                insn = new EcmaCallarg1dyn(args[0], args[1]);
253                break;
254            case 3:
255                insn = new EcmaCallargs2dyn(args[0], args[1], args[2]);
256                break;
257            case 4:
258                insn = new EcmaCallargs3dyn(args[0], args[1], args[2], args[3]);
259                break;
260            default:
261                insn = new EcmaCallirangedyn(new Imm(length - 1), args);
262        }
263    } else {
264        insn = new EcmaCallithisrangedyn(new Imm(length - 1), args);
265    }
266
267    return insn;
268}
269
270export function newObject(args: VReg[]) {
271    return new EcmaNewobjdynrange(new Imm(args.length), args);
272}
273
274export function getPropIterator() {
275    return new EcmaGetpropiterator();
276}
277
278export function getNextPropName(iter: VReg) {
279    return new EcmaGetnextpropname(iter);
280}
281
282export function returnUndefined() {
283    return new EcmaReturnundefined();
284}
285
286export function createEmptyObject() {
287    return new EcmaCreateemptyobject();
288}
289
290export function createObjectHavingMethod(idx: number) {
291    return new EcmaCreateobjecthavingmethod(new Imm(idx));
292}
293
294export function createObjectWithBuffer(idx: number) {
295    return new EcmaCreateobjectwithbuffer(new Imm(idx));
296}
297
298export function setObjectWithProto(proto: VReg, object: VReg) {
299    return new EcmaSetobjectwithproto(proto, object);
300}
301
302export function copyDataProperties(dstObj: VReg, srcObj: VReg) {
303    return new EcmaCopydataproperties(dstObj, srcObj);
304}
305
306export function defineGetterSetterByValue(obj: VReg, name: VReg, getter: VReg, setter: VReg) {
307    return new EcmaDefinegettersetterbyvalue(obj, name, getter, setter);
308}
309
310export function createEmptyArray() {
311    return new EcmaCreateemptyarray();
312}
313
314export function createArrayWithBuffer(idx: number) {
315    return new EcmaCreatearraywithbuffer(new Imm(idx));
316}
317
318export function storeArraySpread(array: VReg, index: VReg) {
319    return new EcmaStarrayspread(array, index);
320}
321
322export function defineClassWithBuffer(id: string, idx: number, parameterLength: number, env: VReg, base: VReg) {
323    return new EcmaDefineclasswithbuffer(id, new Imm(idx), new Imm(parameterLength), env, base);
324}
325
326export function createObjectWithExcludedKeys(obj: VReg, args: VReg[]) {
327    return new EcmaCreateobjectwithexcludedkeys(new Imm(args.length - 1), obj, args);
328}
329
330export function throwObjectNonCoercible() {
331    return new EcmaThrowpatternnoncoercible();
332}
333
334export function throwIfNotObject(v: VReg) {
335    return new EcmaThrowifnotobject(v);
336}
337
338export function getIterator() {
339    return new EcmaGetiterator();
340}
341
342export function getIteratorNext(iter: VReg, nextMethod: VReg) {
343    return new EcmaGetiteratornext(iter, nextMethod);
344}
345
346export function closeIterator(iter: VReg) {
347    return new EcmaCloseiterator(iter);
348}
349
350export function superCall(num: number, start: VReg) {
351    return new EcmaSupercall(new Imm(num), start);
352}
353
354export function superCallSpread(vs: VReg) {
355    return new EcmaSupercallspread(vs);
356}
357
358export function ldSuperByName(obj: VReg, key: string) {
359    return new EcmaLdsuperbyname(key, obj);
360}
361
362export function stSuperByName(obj: VReg, key: string) {
363    return new EcmaStsuperbyname(key, obj);
364}
365
366export function stSuperByValue(obj: VReg, prop: VReg) {
367    return new EcmaStsuperbyvalue(obj, prop);
368}
369
370export function ldSuperByValue(obj: VReg, prop: VReg): IRNode {
371    return new EcmaLdsuperbyvalue(obj, prop);
372}
373
374export function importModule(name: string) {
375    return new EcmaImportmodule(name);
376}
377
378export function loadModuleVarByName(name: string, module: VReg) {
379    return new EcmaLdmodvarbyname(name, module);
380}
381
382export function storeModuleVariable(name: string) {
383    return new EcmaStmodulevar(name);
384}
385
386export function copyModuleIntoCurrentModule(mod: VReg) {
387    return new EcmaCopymodule(mod);
388}
389
390export function loadHomeObject() {
391    return new EcmaLdhomeobject();
392}
393
394export function defineFunc(name: string, env: VReg, paramLength: number) {
395    return new EcmaDefinefuncdyn(name, new Imm(paramLength), env);
396}
397
398export function defineAsyncFunc(name: string, env: VReg, paramLength: number) {
399    return new EcmaDefineasyncfunc(name, new Imm(paramLength), env);
400}
401
402export function defineGeneratorFunc(name: string, env: VReg, paramLength: number) {
403    return new EcmaDefinegeneratorfunc(name, new Imm(paramLength), env);
404}
405
406export function defineNCFunc(name: string, env: VReg, paramLength: number) {
407    return new EcmaDefinencfuncdyn(name, new Imm(paramLength), env);
408}
409
410export function defineMethod(name: string, env: VReg, paramLength: number) {
411    return new EcmaDefinemethod(name, new Imm(paramLength), env);
412}
413
414export function isTrue() {
415    return new EcmaIstrue();
416}
417
418export function isFalse() {
419    return new EcmaIsfalse();
420}
421
422export function createRegExpWithLiteral(pattern: string, flags: number) {
423    return new EcmaCreateregexpwithliteral(pattern, new Imm(flags));
424}
425
426export function stLetToGlobalRecord (name: string) {
427    return new EcmaStlettoglobalrecord(name);
428}
429
430export function stConstToGlobalRecord (name: string) {
431    return new EcmaStconsttoglobalrecord(name);
432}
433
434export function stClassToGlobalRecord (name: string) {
435    return new EcmaStclasstoglobalrecord(name);
436}
437
438export function loadAccumulatorBigInt(value: string): IRNode {
439    return new EcmaLdbigint(value);
440}