@@ -638,23 +638,24 @@ Bytecode::CodeGenerationErrorOr<void> WhileStatement::generate_labelled_evaluati
638
638
// end
639
639
auto & test_block = generator.make_block ();
640
640
auto & body_block = generator.make_block ();
641
+ auto & load_result_and_jump_to_end_block = generator.make_block ();
641
642
auto & end_block = generator.make_block ();
642
643
643
644
// Init result register
644
645
generator.emit <Bytecode::Op::LoadImmediate>(js_undefined ());
645
646
auto result_reg = generator.allocate_register ();
646
- generator.emit <Bytecode::Op::Store>(result_reg);
647
647
648
648
// jump to the test block
649
649
generator.emit <Bytecode::Op::Jump>().set_targets (
650
650
Bytecode::Label { test_block },
651
651
{});
652
652
653
653
generator.switch_to_basic_block (test_block);
654
+ generator.emit <Bytecode::Op::Store>(result_reg);
654
655
TRY (m_test->generate_bytecode (generator));
655
656
generator.emit <Bytecode::Op::JumpConditional>().set_targets (
656
657
Bytecode::Label { body_block },
657
- Bytecode::Label { end_block });
658
+ Bytecode::Label { load_result_and_jump_to_end_block });
658
659
659
660
generator.switch_to_basic_block (body_block);
660
661
generator.begin_continuable_scope (Bytecode::Label { test_block }, label_set);
@@ -669,8 +670,11 @@ Bytecode::CodeGenerationErrorOr<void> WhileStatement::generate_labelled_evaluati
669
670
{});
670
671
}
671
672
672
- generator.switch_to_basic_block (end_block );
673
+ generator.switch_to_basic_block (load_result_and_jump_to_end_block );
673
674
generator.emit <Bytecode::Op::Load>(result_reg);
675
+ generator.emit <Bytecode::Op::Jump>(Bytecode::Label { end_block });
676
+
677
+ generator.switch_to_basic_block (end_block);
674
678
return {};
675
679
}
676
680
@@ -689,6 +693,7 @@ Bytecode::CodeGenerationErrorOr<void> DoWhileStatement::generate_labelled_evalua
689
693
// end
690
694
auto & test_block = generator.make_block ();
691
695
auto & body_block = generator.make_block ();
696
+ auto & load_result_and_jump_to_end_block = generator.make_block ();
692
697
auto & end_block = generator.make_block ();
693
698
694
699
// Init result register
@@ -702,10 +707,11 @@ Bytecode::CodeGenerationErrorOr<void> DoWhileStatement::generate_labelled_evalua
702
707
{});
703
708
704
709
generator.switch_to_basic_block (test_block);
710
+ generator.emit <Bytecode::Op::Store>(result_reg);
705
711
TRY (m_test->generate_bytecode (generator));
706
712
generator.emit <Bytecode::Op::JumpConditional>().set_targets (
707
713
Bytecode::Label { body_block },
708
- Bytecode::Label { end_block });
714
+ Bytecode::Label { load_result_and_jump_to_end_block });
709
715
710
716
generator.switch_to_basic_block (body_block);
711
717
generator.begin_continuable_scope (Bytecode::Label { test_block }, label_set);
@@ -720,8 +726,11 @@ Bytecode::CodeGenerationErrorOr<void> DoWhileStatement::generate_labelled_evalua
720
726
{});
721
727
}
722
728
723
- generator.switch_to_basic_block (end_block );
729
+ generator.switch_to_basic_block (load_result_and_jump_to_end_block );
724
730
generator.emit <Bytecode::Op::Load>(result_reg);
731
+ generator.emit <Bytecode::Op::Jump>(Bytecode::Label { end_block });
732
+
733
+ generator.switch_to_basic_block (end_block);
725
734
return {};
726
735
}
727
736
@@ -748,6 +757,7 @@ Bytecode::CodeGenerationErrorOr<void> ForStatement::generate_labelled_evaluation
748
757
Bytecode::BasicBlock* test_block_ptr { nullptr };
749
758
Bytecode::BasicBlock* body_block_ptr { nullptr };
750
759
Bytecode::BasicBlock* update_block_ptr { nullptr };
760
+ Bytecode::BasicBlock* load_result_and_jump_to_end_block_ptr { nullptr };
751
761
752
762
auto & end_block = generator.make_block ();
753
763
@@ -789,22 +799,33 @@ Bytecode::CodeGenerationErrorOr<void> ForStatement::generate_labelled_evaluation
789
799
790
800
generator.emit <Bytecode::Op::LoadImmediate>(js_undefined ());
791
801
auto result_reg = generator.allocate_register ();
792
- generator.emit <Bytecode::Op::Store>(result_reg);
802
+
803
+ if (m_test && m_update)
804
+ generator.emit <Bytecode::Op::Store>(result_reg);
793
805
794
806
generator.emit <Bytecode::Op::Jump>().set_targets (
795
807
Bytecode::Label { *test_block_ptr },
796
808
{});
797
809
798
810
if (m_test) {
811
+ load_result_and_jump_to_end_block_ptr = &generator.make_block ();
799
812
generator.switch_to_basic_block (*test_block_ptr);
813
+
814
+ if (!m_update)
815
+ generator.emit <Bytecode::Op::Store>(result_reg);
816
+
800
817
TRY (m_test->generate_bytecode (generator));
801
818
generator.emit <Bytecode::Op::JumpConditional>().set_targets (
802
819
Bytecode::Label { *body_block_ptr },
803
- Bytecode::Label { end_block });
820
+ Bytecode::Label { *load_result_and_jump_to_end_block_ptr });
804
821
}
805
822
806
823
if (m_update) {
807
824
generator.switch_to_basic_block (*update_block_ptr);
825
+
826
+ if (m_test)
827
+ generator.emit <Bytecode::Op::Store>(result_reg);
828
+
808
829
TRY (m_update->generate_bytecode (generator));
809
830
generator.emit <Bytecode::Op::Jump>().set_targets (
810
831
Bytecode::Label { *test_block_ptr },
@@ -830,8 +851,13 @@ Bytecode::CodeGenerationErrorOr<void> ForStatement::generate_labelled_evaluation
830
851
}
831
852
}
832
853
854
+ if (load_result_and_jump_to_end_block_ptr) {
855
+ generator.switch_to_basic_block (*load_result_and_jump_to_end_block_ptr);
856
+ generator.emit <Bytecode::Op::Load>(result_reg);
857
+ generator.emit <Bytecode::Op::Jump>(Bytecode::Label { end_block });
858
+ }
859
+
833
860
generator.switch_to_basic_block (end_block);
834
- generator.emit <Bytecode::Op::Load>(result_reg);
835
861
836
862
if (has_lexical_environment)
837
863
generator.end_variable_scope ();
0 commit comments