Commit 33de806
vm: native foreach over non-by-ref non-local targets
Previously `foreach ($arr as [$a,$b])` / `as $obj->prop` / `as
Foo::$bar` / `as $k => [$a,$b]` etc. were AST-delegated via
OP_TRY_FINALLY, forcing the enclosing function out of slot-only mode
and re-running the whole loop through the AST tree walker.
Adds two opcodes:
OP_FOREACH_STEP_PUSH (A=keyFlag, C=exhaust-jmp): like OP_FOREACH_STEP
but pushes value (and key when A=1) onto the stack instead of storing
into a local slot. Always Dup()s to match the AST runner's snapshot.
OP_ASSIGN_WRITABLE (A=lhs-ast-idx): pops a value and writes it to the
AST node at SubASTs[A] via the phpv.Writable interface — handles obj
prop, array element, static prop, dynamic-name var, etc.
emitForeach now picks per-target shape:
- Both targets bare locals → OP_FOREACH_STEP (unchanged fast path).
- Destructure target → push value, OP_DESTRUCTURE_ASSIGN + refresh slots.
- Other Writable target → push value, OP_ASSIGN_WRITABLE + refresh slots.
By-ref (`as &$v`) still AST-delegates — the iterator needs to yield
refs, which OpForeachInit doesn't build yet. That's the next sub-step.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>1 parent 1714315 commit 33de806
3 files changed
Lines changed: 139 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
394 | 394 | | |
395 | 395 | | |
396 | 396 | | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
397 | 415 | | |
398 | 416 | | |
399 | 417 | | |
| |||
521 | 539 | | |
522 | 540 | | |
523 | 541 | | |
| 542 | + | |
| 543 | + | |
524 | 544 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1019 | 1019 | | |
1020 | 1020 | | |
1021 | 1021 | | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
1022 | 1056 | | |
1023 | 1057 | | |
1024 | 1058 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
549 | 549 | | |
550 | 550 | | |
551 | 551 | | |
552 | | - | |
553 | | - | |
554 | | - | |
555 | | - | |
556 | | - | |
557 | | - | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
558 | 559 | | |
559 | 560 | | |
560 | | - | |
| 561 | + | |
561 | 562 | | |
562 | 563 | | |
563 | 564 | | |
564 | 565 | | |
565 | 566 | | |
566 | 567 | | |
567 | | - | |
568 | | - | |
569 | 568 | | |
570 | | - | |
571 | | - | |
572 | | - | |
573 | | - | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
574 | 583 | | |
575 | 584 | | |
576 | 585 | | |
| |||
586 | 595 | | |
587 | 596 | | |
588 | 597 | | |
589 | | - | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
590 | 625 | | |
591 | 626 | | |
592 | 627 | | |
| |||
618 | 653 | | |
619 | 654 | | |
620 | 655 | | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
621 | 692 | | |
622 | 693 | | |
623 | 694 | | |
| |||
0 commit comments