(t *testing.T)
| 460 | } |
| 461 | |
| 462 | func TestCompile_optimizes_jumps(t *testing.T) { |
| 463 | env := map[string]any{ |
| 464 | "a": true, |
| 465 | "b": true, |
| 466 | "c": true, |
| 467 | "d": true, |
| 468 | "i64": int64(1), |
| 469 | } |
| 470 | tests := []struct { |
| 471 | code string |
| 472 | want string |
| 473 | }{ |
| 474 | { |
| 475 | `let foo = true; let bar = false; let baz = true; foo || bar || baz`, |
| 476 | `0 OpTrue |
| 477 | 1 OpStore <0> foo |
| 478 | 2 OpFalse |
| 479 | 3 OpStore <1> bar |
| 480 | 4 OpTrue |
| 481 | 5 OpStore <2> baz |
| 482 | 6 OpLoadVar <0> foo |
| 483 | 7 OpJumpIfTrue <5> (13) |
| 484 | 8 OpPop |
| 485 | 9 OpLoadVar <1> bar |
| 486 | 10 OpJumpIfTrue <2> (13) |
| 487 | 11 OpPop |
| 488 | 12 OpLoadVar <2> baz |
| 489 | `, |
| 490 | }, |
| 491 | { |
| 492 | `a && b && c`, |
| 493 | `0 OpLoadFast <0> a |
| 494 | 1 OpJumpIfFalse <5> (7) |
| 495 | 2 OpPop |
| 496 | 3 OpLoadFast <1> b |
| 497 | 4 OpJumpIfFalse <2> (7) |
| 498 | 5 OpPop |
| 499 | 6 OpLoadFast <2> c |
| 500 | `, |
| 501 | }, |
| 502 | { |
| 503 | `a && b || c && d`, |
| 504 | `0 OpLoadFast <0> a |
| 505 | 1 OpJumpIfFalse <2> (4) |
| 506 | 2 OpPop |
| 507 | 3 OpLoadFast <1> b |
| 508 | 4 OpJumpIfTrue <5> (10) |
| 509 | 5 OpPop |
| 510 | 6 OpLoadFast <2> c |
| 511 | 7 OpJumpIfFalse <2> (10) |
| 512 | 8 OpPop |
| 513 | 9 OpLoadFast <3> d |
| 514 | `, |
| 515 | }, |
| 516 | { |
| 517 | `filter([1, 2, 3, 4, 5], # > 3 && # != 4 && # != 5)`, |
| 518 | `0 OpPush <0> [1 2 3 4 5] |
| 519 | 1 OpBegin |