• 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    expect
18} from 'chai';
19import 'mocha';
20import { CmdOptions } from '../../src/cmdOptions';
21import { creatAstFromSnippet } from "../utils/asthelper"
22import { PandaGen } from '../../src/pandagen';
23import {
24    Add2,
25    Asyncfunctionawaituncaught,
26    Asyncfunctionenter,
27    Asyncfunctionreject,
28    Asyncfunctionresolve,
29    Callarg0,
30    Callarg1,
31    Callargs2,
32    Createarraywithbuffer,
33    Createemptyarray,
34    Creategeneratorobj,
35    Createiterresultobj,
36    Createobjectwithbuffer,
37    Createregexpwithliteral,
38    Dec,
39    Defineclasswithbuffer,
40    Definefunc,
41    Eq,
42    Getresumemode,
43    Istrue,
44    Ldobjbyindex,
45    Ldobjbyname,
46    Neg,
47    Newobjrange,
48    Resumegenerator,
49    Stownbyindex,
50    Stricteq,
51    Suspendgenerator,
52    Throw,
53    Tonumeric,
54    Typeof,
55    Fldai,
56    Imm,
57    Jeqz,
58    Jmp,
59    Label,
60    Lda,
61    LdaStr,
62    Ldai,
63    Mov,
64    Return,
65    Sta,
66    VReg,
67    IRNode
68} from "../../src/irnodes";
69import { checkInstructions, compileMainSnippet, compileAllSnippet } from "../utils/base";
70
71describe("WatchExpressions", function () {
72    it("watch NumericLiteral", function () {
73        let insns = compileMainSnippet(`
74        a=-123.212
75        `, undefined, undefined, undefined, undefined, true);
76        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
77
78        let expected = [
79            new Fldai(new Imm(123.212)),
80            new Sta(new VReg()),
81            new Lda(new VReg()),
82            new Neg(new Imm(0)),
83            new Sta(new VReg()),
84            new Lda(new VReg()),
85            new Ldobjbyname(new Imm(1), 'debuggerSetValue'),
86            new Sta(new VReg()),
87            new LdaStr('a'),
88            new Sta(new VReg()),
89            new Lda(new VReg()),
90            new Callargs2(new Imm(3), new VReg(), new VReg()),
91
92            new Return()
93        ];
94
95        expect(checkInstructions(insns, expected)).to.be.true;
96    });
97
98    it("watch StringLiteral", function () {
99        let insns = compileMainSnippet(`
100        y = 'He is called \'Johnny\''
101        `, undefined, undefined, undefined, undefined, true);
102        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
103
104        let expected = [
105            new LdaStr('He is called '),
106            new Sta(new VReg()),
107            new Lda(new VReg()),
108            new Ldobjbyname(new Imm(0), 'debuggerSetValue'),
109            new Sta(new VReg()),
110            new LdaStr('y'),
111            new Sta(new VReg()),
112            new Lda(new VReg()),
113            new Callargs2(new Imm(2), new VReg(), new VReg()),
114            new Lda(new VReg()),
115            new Ldobjbyname(new Imm(3), 'debuggerGetValue'),
116            new Sta(new VReg()),
117            new LdaStr('Johnny'),
118            new Sta(new VReg()),
119            new Mov(new VReg(), new VReg()),
120            new Lda(new VReg()),
121            new Callargs2(new Imm(5), new VReg(), new VReg()),
122            new LdaStr(''),
123
124            new Return()
125        ];
126        expect(checkInstructions(insns, expected)).to.be.true;
127    });
128
129    it("watch RegularExpressionLiteral", function () {
130        let insns = compileMainSnippet(`
131        a = /abc/
132        `, undefined, undefined, undefined, undefined, true);
133        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
134
135        let expected = [
136            new Createregexpwithliteral(new Imm(0), 'abc', new Imm(0)),
137            new Sta(new VReg()),
138            new Lda(new VReg()),
139            new Ldobjbyname(new Imm(1), 'debuggerSetValue'),
140            new Sta(new VReg()),
141            new LdaStr('a'),
142            new Sta(new VReg()),
143            new Lda(new VReg()),
144            new Callargs2(new Imm(3), new VReg(), new VReg()),
145
146            new Return()
147        ];
148        expect(checkInstructions(insns, expected)).to.be.true;
149    });
150
151    it("watch Identifier", function () {
152        let insns = compileMainSnippet(`
153        _awef
154        `, undefined, undefined, undefined, undefined, true);
155        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
156
157        let expected = [
158            new Lda(new VReg()),
159            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
160            new Sta(new VReg()),
161            new LdaStr('_awef'),
162            new Sta(new VReg()),
163            new Mov(new VReg(), new VReg()),
164            new Lda(new VReg()),
165            new Callargs2(new Imm(2), new VReg(), new VReg()),
166
167            new Return()
168        ];
169        expect(checkInstructions(insns, expected)).to.be.true;
170    });
171
172    it("watch TrueKeyword", function () {
173        let insns = compileMainSnippet(`
174        b === true
175        `, undefined, undefined, undefined, undefined, true);
176        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
177
178        let isTrueLabel = new Label();
179        let isFalseLabel = new Label();
180        let expected = [
181            new Lda(new VReg()),
182            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
183            new Sta(new VReg()),
184            new LdaStr('b'),
185            new Sta(new VReg()),
186            new Mov(new VReg(), new VReg()),
187            new Lda(new VReg()),
188            new Callargs2(new Imm(2), new VReg(), new VReg()),
189            new Sta(new VReg()),
190            new Lda(new VReg()),
191            new Stricteq(new Imm(3), new VReg()),
192            new Jeqz(isTrueLabel),
193            new Lda(new VReg()),
194            new Jmp(isFalseLabel),
195            isTrueLabel,
196            new Lda(new VReg()),
197            isFalseLabel,
198
199            new Return()
200        ];
201        expect(checkInstructions(insns, expected)).to.be.true;
202    });
203
204    it("watch FalseKeyword", function () {
205        let insns = compileMainSnippet(`
206        b === false
207        `, undefined, undefined, undefined, undefined, true);
208        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
209
210        let ifFalseLabel = new Label(); //lable0
211        let ifTrueLabel = new Label();  //label1
212
213        let expected = [
214            new Lda(new VReg()),
215            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
216            new Sta(new VReg()),
217            new LdaStr('b'),
218            new Sta(new VReg()),
219            new Mov(new VReg(), new VReg()),
220            new Lda(new VReg()),
221            new Callargs2(new Imm(2), new VReg(), new VReg()),
222            new Sta(new VReg()),
223            new Lda(new VReg()),
224            new Stricteq(new Imm(3), new VReg()),
225            new Jeqz(ifFalseLabel),
226            new Lda(new VReg()),
227            new Jmp(ifTrueLabel),
228            ifFalseLabel,
229            new Lda(new VReg()), //lda. v10
230            ifTrueLabel,
231
232            new Return()
233        ];
234        expect(checkInstructions(insns, expected)).to.be.true;
235    });
236
237    it("watch CallExpression", function () {
238        let insns = compileMainSnippet(`
239        BigInt(10.2)
240        `, undefined, undefined, undefined, undefined, true);
241        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
242
243        let expected = [
244            new Lda(new VReg()),
245            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
246            new Sta(new VReg()),
247            new LdaStr('BigInt'),
248            new Sta(new VReg()),
249            new Mov(new VReg(), new VReg()),
250            new Lda(new VReg()),
251            new Callargs2(new Imm(2), new VReg(), new VReg()),
252            new Sta(new VReg()),
253            new Fldai(new Imm(10.2)),
254            new Sta(new VReg()),
255            new Lda(new VReg()),
256            new Callarg1(new Imm(3), new VReg()),
257
258            new Return()
259        ];
260        expect(checkInstructions(insns, expected)).to.be.true;
261    });
262
263    it("watch NullKeyword", function () {
264        let insns = compileMainSnippet(`
265        b === null
266        `, undefined, undefined, undefined, undefined, true);
267        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
268
269        let isTrueLabel = new Label();
270        let isFalseLabel = new Label();
271        let expected = [
272            new Lda(new VReg()),
273            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
274            new Sta(new VReg()),
275            new LdaStr('b'),
276            new Sta(new VReg()),
277            new Mov(new VReg(), new VReg()),
278            new Lda(new VReg()),
279            new Callargs2(new Imm(2), new VReg(), new VReg()),
280            new Sta(new VReg()),
281            new Lda(new VReg()),
282            new Stricteq(new Imm(3), new VReg()),
283            new Jeqz(isTrueLabel),
284            new Lda(new VReg()),
285            new Jmp(isFalseLabel),
286            isTrueLabel,
287            new Lda(new VReg()),
288            isFalseLabel,
289
290            new Return()
291        ];
292        expect(checkInstructions(insns, expected)).to.be.true;
293    });
294
295    it("watch ThisKeyword", function () {
296        let insns = compileMainSnippet(`
297        this
298        `, undefined, undefined, undefined, undefined, true);
299        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
300
301        let expected = [
302            new Lda(new VReg()),
303            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
304            new Sta(new VReg()),
305            new LdaStr('this'),
306            new Sta(new VReg()),
307            new Mov(new VReg(), new VReg()),
308            new Lda(new VReg()),
309            new Callargs2(new Imm(2), new VReg(), new VReg()),
310
311            new Return()
312        ];
313        expect(checkInstructions(insns, expected)).to.be.true;
314    });
315
316    it("watch MetaProperty", function () {
317        let pandaGens = compileAllSnippet(`
318        function (){
319            b = new.target;
320        }
321        `, undefined, undefined, true);
322        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
323
324        let expected = [
325            new Lda(new VReg()),
326            new Sta(new VReg()),
327            new Lda(new VReg()),
328            new Ldobjbyname(new Imm(0), "debuggerSetValue"),
329            new Sta(new VReg()),
330            new LdaStr("b"),
331            new Sta(new VReg()),
332            new Lda(new VReg()),
333            new Callargs2(new Imm(2), new VReg(), new VReg()),
334
335            new Return()
336        ];
337        pandaGens.forEach((pg) => {
338            if (pg.internalName == "#1#") {
339                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
340            }
341        });
342    });
343
344    it("watch ArrayLiteralExpression", function () {
345        let insns = compileMainSnippet(`
346        [1,2]
347        `, undefined, undefined, undefined, undefined, true);
348        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
349
350        let expected = [
351            new Createarraywithbuffer(new Imm(0), "snippet_1"),
352            new Sta(new VReg()),
353            new Lda(new VReg()),
354
355            new Return()
356        ];
357        expect(checkInstructions(insns, expected)).to.be.true;
358    });
359
360    it("watch ObjectLiteralExpression", function () {
361        let insns = compileMainSnippet(`
362        a = {key:1,value:1}
363        `, undefined, undefined, undefined, undefined, true);
364        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
365
366        let expected = [
367            new Createobjectwithbuffer(new Imm(0), "snippet_1"),
368            new Sta(new VReg()),
369            new Lda(new VReg()),
370            new Sta(new VReg()),
371            new Lda(new VReg()),
372            new Ldobjbyname(new Imm(1), 'debuggerSetValue'),
373            new Sta(new VReg()),
374            new LdaStr('a'),
375            new Sta(new VReg()),
376            new Lda(new VReg()),
377            new Callargs2(new Imm(3), new VReg(), new VReg()),
378
379            new Return()
380        ];
381        expect(checkInstructions(insns, expected)).to.be.true;
382    });
383
384    it("watch PropertyAccessExpression", function () {
385        let insns = compileMainSnippet(`
386        a.b
387        `, undefined, undefined, undefined, undefined, true);
388        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
389
390        let expected = [
391            new Lda(new VReg()),
392            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
393            new Sta(new VReg()),
394            new LdaStr('a'),
395            new Sta(new VReg()),
396            new Mov(new VReg(), new VReg()),
397            new Lda(new VReg()),
398            new Callargs2(new Imm(2), new VReg(), new VReg()),
399            new Sta(new VReg()),
400            new Lda(new VReg()),
401            new Ldobjbyname(new Imm(3), 'b'),
402
403            new Return()
404        ];
405        expect(checkInstructions(insns, expected)).to.be.true;
406    });
407
408    it("watch ElementAccessExpression", function () {
409        let insns = compileMainSnippet(`
410        a[0]
411        `, undefined, undefined, undefined, undefined, true);
412        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
413
414        let expected = [
415            new Lda(new VReg()),
416            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
417            new Sta(new VReg()),
418            new LdaStr('a'),
419            new Sta(new VReg()),
420            new Mov(new VReg(), new VReg()),
421            new Lda(new VReg()),
422            new Callargs2(new Imm(2), new VReg(), new VReg()),
423            new Sta(new VReg()),
424            new Lda(new VReg()),
425            new Ldobjbyindex(new Imm(3), new Imm(0)),
426
427            new Return()
428        ];
429        expect(checkInstructions(insns, expected)).to.be.true;
430    });
431
432    it("watch NewExpression", function () {
433        let insns = compileMainSnippet(`
434        new Function()
435        `, undefined, undefined, undefined, undefined, true);
436        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
437
438        let expected = [
439            new Lda(new VReg()),
440            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
441            new Sta(new VReg()),
442            new LdaStr('Function'),
443            new Sta(new VReg()),
444            new Mov(new VReg(), new VReg()),
445            new Lda(new VReg()),
446            new Callargs2(new Imm(2), new VReg(), new VReg()),
447            new Sta(new VReg()),
448            new Newobjrange(new Imm(3), new Imm(1), [new VReg()]),
449
450            new Return()
451        ];
452        expect(checkInstructions(insns, expected)).to.be.true;
453    });
454
455    it("watch ParenthesizedExpression", function () {
456        let insns = compileMainSnippet(`
457        (a,b,c)
458        `, undefined, undefined, undefined, undefined, true);
459        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
460
461        let expected = [
462            new Lda(new VReg()),
463            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
464            new Sta(new VReg()),
465            new LdaStr('a'),
466            new Sta(new VReg()),
467            new Mov(new VReg(), new VReg()),
468            new Lda(new VReg()),
469            new Callargs2(new Imm(2), new VReg(), new VReg()),
470            new Sta(new VReg()),
471            new Lda(new VReg()),
472            new Ldobjbyname(new Imm(3), 'debuggerGetValue'),
473            new Sta(new VReg()),
474            new LdaStr('b'),
475            new Sta(new VReg()),
476            new Mov(new VReg(), new VReg()),
477            new Lda(new VReg()),
478            new Callargs2(new Imm(5), new VReg(), new VReg()),
479            new Sta(new VReg()),
480            new Lda(new VReg()),
481            new Ldobjbyname(new Imm(6), 'debuggerGetValue'),
482            new Sta(new VReg()),
483            new LdaStr('c'),
484            new Sta(new VReg()),
485            new Mov(new VReg(), new VReg()),
486            new Lda(new VReg()),
487            new Callargs2(new Imm(8), new VReg(), new VReg()),
488
489            new Return()
490        ];
491        expect(checkInstructions(insns, expected)).to.be.true;
492    });
493
494    it("watch FunctionExpression", function () {
495        let pandaGens = compileAllSnippet(`
496        a = function () {}
497        `, undefined, undefined, true);
498        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
499
500        let expected = [
501            new Definefunc(new Imm(0), 'a', new Imm(0)),
502            new Sta(new VReg),
503            new Lda(new VReg()),
504            new Ldobjbyname(new Imm(1), 'debuggerSetValue'),
505            new Sta(new VReg()),
506            new LdaStr('a'),
507            new Sta(new VReg()),
508            new Lda(new VReg()),
509            new Callargs2(new Imm(3), new VReg(), new VReg()),
510
511            new Return()
512        ];
513        pandaGens.forEach((pg) => {
514            if (pg.internalName == "func_main_0") {
515                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
516            }
517        });
518    });
519
520    it("watch DeleteExpression", function () {
521        let insns = compileMainSnippet(`
522        delete[abc]
523        `, undefined, undefined, undefined, undefined, true);
524        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
525
526        let expected = [
527            new Createemptyarray(new Imm(0)),
528            new Sta(new VReg()),
529            new Lda(new VReg()),
530            new Ldobjbyname(new Imm(1), 'debuggerGetValue'),
531            new Sta(new VReg()),
532            new LdaStr('abc'),
533            new Sta(new VReg()),
534            new Mov(new VReg(), new VReg()),
535            new Lda(new VReg()),
536            new Callargs2(new Imm(3), new VReg(), new VReg()),
537            new Stownbyindex(new Imm(4), new VReg(), new Imm(0)),
538            new Lda(new VReg()),
539            new Lda(new VReg()),
540
541            new Return()
542        ];
543        expect(checkInstructions(insns, expected)).to.be.true;
544    });
545
546    it("watch TypeOfExpression", function () {
547        let insns = compileMainSnippet(`
548        typeof(a)
549        `, undefined, undefined, undefined, undefined, true);
550        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
551
552        let expected = [
553            new Lda(new VReg()),
554            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
555            new Sta(new VReg()),
556            new LdaStr('a'),
557            new Sta(new VReg()),
558            new Mov(new VReg(), new VReg()),
559            new Lda(new VReg()),
560            new Callargs2(new Imm(2), new VReg(), new VReg()),
561            new Typeof(new Imm(3)),
562
563            new Return()
564        ];
565        expect(checkInstructions(insns, expected)).to.be.true;
566    });
567
568    it("watch VoidExpression", function () {
569        let insns = compileMainSnippet(`
570        void doSomething()
571        `, undefined, undefined, undefined, undefined, true);
572        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
573
574        let expected = [
575            new Lda(new VReg()),
576            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
577            new Sta(new VReg()),
578            new LdaStr('doSomething'),
579            new Sta(new VReg()),
580            new Mov(new VReg(), new VReg()),
581            new Lda(new VReg()),
582            new Callargs2(new Imm(2), new VReg(), new VReg()),
583            new Sta(new VReg()),
584            new Lda(new VReg()),
585            new Callarg0(new Imm(3)),
586            new Lda(new VReg()),
587
588            new Return()
589        ];
590        expect(checkInstructions(insns, expected)).to.be.true;
591    });
592
593    it("watch AwaitExpression", function () {
594        let pandaGens = compileAllSnippet(
595            `async function a(){
596                await abc;
597            }`, undefined, undefined, true);
598        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
599
600        let beginLabel = new Label();
601        let endLabel = new Label();
602        let nextLabel = new Label();
603
604        let expected = [
605            new Asyncfunctionenter(),
606            new Sta(new VReg()),
607            beginLabel,
608            new Lda(new VReg()),
609            new Ldobjbyname(new Imm(0), "debuggerGetValue"),
610            new Sta(new VReg()),
611            new LdaStr('abc'),
612            new Sta(new VReg()),
613            new Mov(new VReg(), new VReg()),
614            new Lda(new VReg()),
615            new Callargs2(new Imm(2), new VReg(), new VReg()),
616            new Sta(new VReg()),
617            new Lda(new VReg()),
618            new Asyncfunctionawaituncaught(new VReg()),
619            new Suspendgenerator(new VReg()),
620            new Lda(new VReg()),
621            new Resumegenerator(),
622            new Sta(new VReg()),
623            new Lda(new VReg()),
624            new Getresumemode(),
625            new Sta(new VReg()),
626            new Ldai(new Imm(1)),
627            new Eq(new Imm(3), new VReg()),
628            new Jeqz(nextLabel),
629            new Lda(new VReg()),
630            new Throw(),
631            nextLabel,
632            new Lda(new VReg()),
633            new Lda(new VReg()),
634            new Asyncfunctionresolve(new VReg()),
635            new Return(),
636            endLabel,
637            new Asyncfunctionreject(new VReg()),
638            new Return(),
639        ];
640
641        pandaGens.forEach((pg) => {
642            if (pg.internalName == "a") {
643                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
644            }
645        });
646    });
647
648    it("watch PrefixUnaryExpression", function () {
649        let insns = compileMainSnippet(`
650        --a
651        `, undefined, undefined, undefined, undefined, true);
652        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
653
654        let expected = [
655            new Lda(new VReg()),
656            new Ldobjbyname(new Imm(0), "debuggerGetValue"),
657            new Sta(new VReg()),
658            new LdaStr('a'),
659            new Sta(new VReg()),
660            new Mov(new VReg(), new VReg()),
661            new Lda(new VReg()),
662            new Callargs2(new Imm(2), new VReg(), new VReg()),
663            new Sta(new VReg()),
664            new Lda(new VReg()),
665            new Dec(new Imm(3)),
666            new Sta(new VReg()),
667            new Lda(new VReg()),
668            new Ldobjbyname(new Imm(4), "debuggerSetValue"),
669            new Sta(new VReg()),
670            new LdaStr('a'),
671            new Sta(new VReg()),
672            new Lda(new VReg()),
673            new Callargs2(new Imm(6), new VReg(), new VReg()),
674
675            new Return()
676        ];
677        expect(checkInstructions(insns, expected)).to.be.true;
678    });
679
680    it("watch PostfixUnaryExpression", function () {
681        let insns = compileMainSnippet(`
682        a--
683        `, undefined, undefined, undefined, undefined, true);
684        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
685
686        let expected = [
687            new Lda(new VReg()),
688            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
689            new Sta(new VReg()),
690            new LdaStr('a'),
691            new Sta(new VReg()),
692            new Mov(new VReg(), new VReg()),
693            new Lda(new VReg()),
694            new Callargs2(new Imm(2), new VReg(), new VReg()),
695            new Sta(new VReg()),
696            new Lda(new VReg()),
697            new Dec(new Imm(3)),
698            new Sta(new VReg()),
699            new Lda(new VReg()),
700            new Ldobjbyname(new Imm(4), 'debuggerSetValue'),
701            new Sta(new VReg()),
702            new LdaStr('a'),
703            new Sta(new VReg()),
704            new Lda(new VReg()),
705            new Callargs2(new Imm(6), new VReg(), new VReg()),
706            new Lda(new VReg()),
707            new Tonumeric(new Imm(7)),
708
709            new Return()
710        ];
711        expect(checkInstructions(insns, expected)).to.be.true;
712    });
713
714    it("watch BinaryExpression", function () {
715        let insns = compileMainSnippet(`
716        a+b
717        `, undefined, undefined, undefined, undefined, true);
718        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
719
720        let expected = [
721            new Lda(new VReg()),
722            new Ldobjbyname(new Imm(0), "debuggerGetValue"),
723            new Sta(new VReg()),
724            new LdaStr("a"),
725            new Sta(new VReg()),
726            new Mov(new VReg(), new VReg()),
727            new Lda(new VReg()),
728            new Callargs2(new Imm(2), new VReg(), new VReg()),
729            new Sta(new VReg()),
730            new Lda(new VReg()),
731            new Ldobjbyname(new Imm(3), "debuggerGetValue"),
732            new Sta(new VReg()),
733            new LdaStr("b"),
734            new Sta(new VReg()),
735            new Mov(new VReg(), new VReg()),
736            new Lda(new VReg()),
737            new Callargs2(new Imm(5), new VReg(), new VReg()),
738            new Add2(new Imm(6), new VReg()),
739
740            new Return()
741        ];
742        expect(checkInstructions(insns, expected)).to.be.true;
743    });
744
745    it("watch ConditionalExpression", function () {
746        let insns = compileMainSnippet(`
747        a?4:2
748        `, undefined, undefined, undefined, undefined, true);
749        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
750
751        let ifTrueLabel = new Label();
752        let ifFalseLabel = new Label();
753
754        let expected = [
755            new Lda(new VReg()),
756            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
757            new Sta(new VReg()),
758            new LdaStr('a'),
759            new Sta(new VReg()),
760            new Mov(new VReg(), new VReg()),
761            new Lda(new VReg()),
762            new Callargs2(new Imm(2), new VReg(), new VReg()),
763            new Istrue(),
764            new Jeqz(ifTrueLabel),
765            new Ldai(new Imm(4)),
766            new Jmp(ifFalseLabel),
767            ifTrueLabel,
768            new Ldai(new Imm(2)),
769            ifFalseLabel,
770
771            new Return()
772        ];
773        expect(checkInstructions(insns, expected)).to.be.true;
774    });
775
776    it("watch YieldExpression", function () {
777        let pandaGens = compileAllSnippet(`
778        function* func(){
779            yield a;
780        }`, undefined, undefined, true);
781        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
782
783        let startLabel = new Label();
784        let thenLabel = new Label();
785        let nextLabel = new Label();
786        let endLabel = new Label();
787
788        let expected = [
789            new Creategeneratorobj(new VReg()),
790            new Sta(new VReg()),
791            new Lda(new VReg()),
792            new Suspendgenerator(new VReg()),
793            new Lda(new VReg()),
794            new Resumegenerator(),
795            new Sta(new VReg()),
796            new Lda(new VReg()),
797            new Getresumemode(),
798            new Sta(new VReg()),
799            new Ldai(new Imm(0)),
800            new Eq(new Imm(0), new VReg()),
801            new Jeqz(startLabel),
802            new Lda(new VReg()),
803            new Return(),
804            startLabel,
805            new Ldai(new Imm(1)),
806            new Eq(new Imm(1), new VReg()),
807            new Jeqz(thenLabel),
808            new Lda(new VReg()),
809            new Throw(),
810            thenLabel,
811            new Lda(new VReg()),
812            new Lda(new VReg()),
813            new Ldobjbyname(new Imm(2), 'debuggerGetValue'),
814            new Sta(new VReg()),
815            new LdaStr('a'),
816            new Sta(new VReg()),
817            new Mov(new VReg(), new VReg()),
818            new Lda(new VReg()),
819            new Callargs2(new Imm(4), new VReg(), new VReg()),
820            new Sta(new VReg()),
821            new Createiterresultobj(new VReg(),new VReg()),
822            new Suspendgenerator(new VReg()),
823            new Lda(new VReg()),
824            new Resumegenerator(),
825            new Sta(new VReg()),
826            new Lda(new VReg()),
827            new Getresumemode(),
828            new Sta(new VReg()),
829            new Ldai(new Imm(0)),
830            new Eq(new Imm(5), new VReg()),
831            new Jeqz(nextLabel),
832            new Lda(new VReg()),
833            new Return(),
834            nextLabel,
835            new Ldai(new Imm(1)),
836            new Eq(new Imm(6), new VReg()),
837            new Jeqz(endLabel),
838            new Lda(new VReg()),
839            new Throw(),
840            endLabel,
841            new Lda(new VReg()),
842
843            new Return()
844        ];
845
846        pandaGens.forEach((pg) => {
847            if (pg.internalName == "func") {
848                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
849            }
850        });
851    });
852
853    it("watch ArrowFunction", function () {
854        let pandaGens = compileAllSnippet(`
855        a => b.length
856        `, undefined, undefined, true);
857        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
858
859        let expected = [
860            new Lda(new VReg()),
861            new Ldobjbyname(new Imm(0), 'debuggerGetValue'),
862            new Sta(new VReg()),
863            new LdaStr('b'),
864            new Sta(new VReg()),
865            new Mov(new VReg(),new VReg()),
866            new Lda(new VReg()),
867            new Callargs2(new Imm(2), new VReg(),new VReg()),
868            new Sta(new VReg()),
869            new Lda(new VReg()),
870            new Ldobjbyname(new Imm(3), 'length'),
871            new Sta(new VReg()),
872            new Lda(new VReg()),
873
874            new Return()
875        ];
876
877        pandaGens.forEach((pg) => {
878            if (pg.internalName == "#1#") {
879                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
880            }
881        });
882    });
883
884    it("watch ClassExpression", function () {
885        let pandaGens = compileAllSnippet(`
886        a = new class{};
887        `, undefined, undefined, true);
888        IRNode.pg = new PandaGen("", creatAstFromSnippet(``), 0, undefined);
889
890        let expected = [
891            new Mov(new VReg(), new VReg()),
892            new Defineclasswithbuffer(new Imm(0), "#1#", "snippet_1", new Imm(0), new VReg()),
893            new Sta(new VReg()),
894            new Lda(new VReg()),
895            new Sta(new VReg()),
896            new Newobjrange(new Imm(1), new Imm(1), [new VReg()]),
897            new Sta(new VReg()),
898            new Lda(new VReg()),
899            new Ldobjbyname(new Imm(2), "debuggerSetValue"),
900            new Sta(new VReg()),
901            new LdaStr("a"),
902            new Sta(new VReg()),
903            new Lda(new VReg()),
904            new Callargs2(new Imm(4), new VReg(), new VReg()),
905
906            new Return()
907        ];
908        pandaGens.forEach((pg) => {
909            if (pg.internalName == "func_main_0") {
910                expect(checkInstructions(pg.getInsns(), expected)).to.be.true;
911            }
912        });
913    });
914});
915