• 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
16import {
17    expect
18} from 'chai';
19import 'mocha';
20import { DiagnosticCode, DiagnosticError } from '../../src/diagnostic';
21import {
22    EcmaAdd2dyn,
23    EcmaCreatearraywithbuffer,
24    EcmaCreateemptyarray,
25    EcmaCreateemptyobject,
26    EcmaCreateobjectwithbuffer,
27    EcmaIncdyn,
28    EcmaReturnundefined,
29    EcmaStarrayspread,
30    EcmaStlettoglobalrecord,
31    EcmaStownbyindex,
32    EcmaStownbyname,
33    EcmaStownbyvalue,
34    EcmaTryldglobalbyname,
35    Imm,
36    LdaDyn,
37    LdaiDyn,
38    LdaStr,
39    ResultType,
40    StaDyn,
41    VReg
42} from "../../src/irnodes";
43import { checkInstructions, compileMainSnippet } from "../utils/base";
44
45describe("LiteralTest", function () {
46    it("5", function () {
47        let insns = compileMainSnippet("5");
48        let expected = [
49            new LdaiDyn(new Imm(5)),
50            new EcmaReturnundefined()
51        ];
52        expect(checkInstructions(insns, expected)).to.be.true;
53    });
54
55    it("\"stringLiteral\"", function () {
56        let insns = compileMainSnippet("\"stringLiteral\"");
57        let expected = [
58            new LdaStr("stringLiteral"),
59            new EcmaReturnundefined()
60        ];
61        expect(checkInstructions(insns, expected)).to.be.true;
62    });
63
64    it("true", function () {
65        let insns = compileMainSnippet("true");
66        let expected = [
67            new LdaDyn(new VReg()),
68            new EcmaReturnundefined()
69        ];
70        expect(checkInstructions(insns, expected)).to.be.true;
71    });
72
73    it("false", function () {
74        let insns = compileMainSnippet("false");
75        let expected = [
76            new LdaDyn(new VReg()),
77            new EcmaReturnundefined()
78        ];
79        expect(checkInstructions(insns, expected)).to.be.true;
80    });
81
82    it("null", function () {
83        let insns = compileMainSnippet("null");
84        let expected = [
85            new LdaDyn(new VReg()),
86            new EcmaReturnundefined()
87        ];
88        expect(checkInstructions(insns, expected)).to.be.true;
89    });
90
91    it("let arr = [1]", function () {
92        let insns = compileMainSnippet("let arr = [1]");
93        let arrayInstance = new VReg();
94
95        let expected = [
96            new EcmaCreatearraywithbuffer(new Imm(0)),
97            new StaDyn(arrayInstance),
98            new LdaDyn(arrayInstance),
99            new EcmaStlettoglobalrecord('arr'),
100            new EcmaReturnundefined()
101        ];
102        expect(checkInstructions(insns, expected)).to.be.true;
103    });
104
105    it("let arr = []", function () {
106        let insns = compileMainSnippet("let arr = []");
107        let arrayInstance = new VReg();
108
109        let expected = [
110            new EcmaCreateemptyarray(),
111            new StaDyn(arrayInstance),
112            new EcmaStlettoglobalrecord('arr'),
113            new EcmaReturnundefined()
114        ];
115        expect(checkInstructions(insns, expected)).to.be.true;
116    });
117
118    it("let arr = [1, 2]", function () {
119        let insns = compileMainSnippet("let arr = [1, 2]");
120        let arrayInstance = new VReg();
121
122        let expected = [
123            new EcmaCreatearraywithbuffer(new Imm(0)),
124            new StaDyn(arrayInstance),
125            new LdaDyn(arrayInstance),
126            new EcmaStlettoglobalrecord('arr'),
127            new EcmaReturnundefined()
128        ];
129        insns = insns.slice(0, insns.length);
130        expect(checkInstructions(insns, expected)).to.be.true;
131    });
132
133    it("let arr = [, 1]", function () {
134        let insns = compileMainSnippet("let arr = [, 1]");
135        let arrayInstance = new VReg();
136
137        let expected = [
138            new EcmaCreateemptyarray(),
139            new StaDyn(arrayInstance),
140            new LdaiDyn(new Imm(1)),
141            new EcmaStownbyindex(arrayInstance, new Imm(1)),
142            new LdaDyn(arrayInstance),
143            new EcmaStlettoglobalrecord('arr'),
144            new EcmaReturnundefined()
145        ];
146        insns = insns.slice(0, insns.length);
147        expect(checkInstructions(insns, expected)).to.be.true;
148    });
149
150    it("let arr = [1, , 3]", function () {
151        let insns = compileMainSnippet("let arr = [1,, 3]");
152        let arrayInstance = new VReg();
153
154        let expected = [
155            new EcmaCreatearraywithbuffer(new Imm(0)),
156            new StaDyn(arrayInstance),
157            new LdaiDyn(new Imm(3)),
158            new EcmaStownbyindex(arrayInstance, new Imm(2)),
159            new LdaDyn(arrayInstance),
160            new EcmaStlettoglobalrecord('arr'),
161            new EcmaReturnundefined()
162        ];
163
164        insns = insns.slice(0, insns.length);
165        expect(checkInstructions(insns, expected)).to.be.true;
166    });
167
168    it("let arr = [1, ...arr1, 3]", function () {
169        let insns = compileMainSnippet(`let arr1 = [1, 2];
170                                let arr = [1, ...arr1, 3]`);
171        let elemIdxReg = new VReg();
172        let arrayInstance = new VReg();
173
174        let expected = [
175            new EcmaCreatearraywithbuffer(new Imm(0)),
176            new StaDyn(arrayInstance),
177            new LdaDyn(arrayInstance),
178            new EcmaStlettoglobalrecord('arr1'),
179
180            new EcmaCreatearraywithbuffer(new Imm(1)),
181            new StaDyn(arrayInstance),
182            new LdaiDyn(new Imm(1)),
183            new StaDyn(elemIdxReg),
184            new EcmaTryldglobalbyname('arr1'),
185            new EcmaStarrayspread(arrayInstance, elemIdxReg),
186            new StaDyn(elemIdxReg),
187            new LdaiDyn(new Imm(3)),
188            new EcmaStownbyvalue(arrayInstance, elemIdxReg),
189            new EcmaIncdyn(elemIdxReg),
190            new StaDyn(elemIdxReg),
191            new LdaDyn(arrayInstance),
192            new EcmaStlettoglobalrecord('arr'),
193        ];
194        insns = insns.slice(0, insns.length - 1);
195        expect(checkInstructions(insns, expected)).to.be.true;
196    });
197
198    it("let obj = {}", function () {
199        let insns = compileMainSnippet("let obj = {}");
200        let objInstance = new VReg();
201
202        let expected = [
203            new EcmaCreateemptyobject(),
204            new StaDyn(objInstance),
205
206            new EcmaStlettoglobalrecord('obj'),
207            new EcmaReturnundefined()
208        ];
209        expect(checkInstructions(insns, expected)).to.be.true;
210    });
211
212    it("let obj = {a: 1}", function () {
213        let insns = compileMainSnippet("let obj = {a: 1}");
214        let objInstance = new VReg();
215        let expected = [
216            new EcmaCreateobjectwithbuffer(new Imm(0)),
217            new StaDyn(objInstance),
218            new LdaDyn(objInstance),
219            new EcmaStlettoglobalrecord('obj'),
220            new EcmaReturnundefined()
221        ];
222        expect(checkInstructions(insns, expected)).to.be.true;
223    });
224
225    it("let obj = {0: 1 + 2}", function () {
226        let insns = compileMainSnippet("let obj = {0: 1 + 2}");
227        let objInstance = new VReg();
228        let lhs = new VReg();
229
230        let expected = [
231            new EcmaCreateobjectwithbuffer(new Imm(0)),
232            new StaDyn(objInstance),
233            new LdaiDyn(new Imm(1)),
234            new StaDyn(lhs),
235            new LdaiDyn(new Imm(2)),
236            new EcmaAdd2dyn(lhs),
237            new EcmaStownbyindex(objInstance, new Imm(0)),
238            new LdaDyn(objInstance),
239            new EcmaStlettoglobalrecord('obj'),
240            new EcmaReturnundefined()
241        ];
242        expect(checkInstructions(insns, expected)).to.be.true;
243    });
244
245    it("let obj = {\"str\": 1}", function () {
246        let insns = compileMainSnippet("let obj = {\"str\": 1}");
247        let objInstance = new VReg();
248
249        let expected = [
250            new EcmaCreateobjectwithbuffer(new Imm(0)),
251            new StaDyn(objInstance),
252            new LdaDyn(objInstance),
253            new EcmaStlettoglobalrecord('obj'),
254            new EcmaReturnundefined()
255        ];
256        expect(checkInstructions(insns, expected)).to.be.true;
257    });
258
259    it("let a; let obj = {a}", function () {
260        let insns = compileMainSnippet("let a; let obj = {a}");
261        let objInstance = new VReg();
262
263        let expected = [
264            new EcmaCreateobjectwithbuffer(new Imm(0)),
265            new StaDyn(objInstance),
266            new EcmaTryldglobalbyname('a'),
267            new EcmaStownbyname("a", objInstance),
268            new LdaDyn(objInstance),
269            new EcmaStlettoglobalrecord('obj')
270        ];
271        insns = insns.slice(2, insns.length - 1);
272        expect(checkInstructions(insns, expected)).to.be.true;
273    });
274
275    it("duplicate __proto__", function () {
276        let errorThrown = false;
277        try {
278            compileMainSnippet("({__proto__: null,other: null,'__proto__': null});");
279        } catch (err) {
280            expect(err instanceof DiagnosticError).to.be.true;
281            expect((<DiagnosticError>err).code).to.equal(DiagnosticCode.Duplicate_identifier_0);
282            errorThrown = true;
283        }
284        expect(errorThrown).to.be.true;
285    });
286});
287
288