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