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