@@ -779,145 +779,84 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp
779
779
$ op_data_free_op , $ op_data_free_op_var_ptr , $ op_data_free_unfetched ;
780
780
781
781
// Specializing
782
- $ code = preg_replace (
783
- array (
784
- "/OP1_TYPE/ " ,
785
- "/OP2_TYPE/ " ,
786
- "/OP1_FREE/ " ,
787
- "/OP2_FREE/ " ,
788
- "/GET_OP1_ZVAL_PTR\(([^)]*)\)/ " ,
789
- "/GET_OP2_ZVAL_PTR\(([^)]*)\)/ " ,
790
- "/GET_OP1_ZVAL_PTR_DEREF\(([^)]*)\)/ " ,
791
- "/GET_OP2_ZVAL_PTR_DEREF\(([^)]*)\)/ " ,
792
- "/GET_OP1_ZVAL_PTR_UNDEF\(([^)]*)\)/ " ,
793
- "/GET_OP2_ZVAL_PTR_UNDEF\(([^)]*)\)/ " ,
794
- "/GET_OP1_ZVAL_PTR_PTR\(([^)]*)\)/ " ,
795
- "/GET_OP2_ZVAL_PTR_PTR\(([^)]*)\)/ " ,
796
- "/GET_OP1_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " ,
797
- "/GET_OP2_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " ,
798
- "/GET_OP1_OBJ_ZVAL_PTR\(([^)]*)\)/ " ,
799
- "/GET_OP2_OBJ_ZVAL_PTR\(([^)]*)\)/ " ,
800
- "/GET_OP1_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/ " ,
801
- "/GET_OP2_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/ " ,
802
- "/GET_OP1_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/ " ,
803
- "/GET_OP2_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/ " ,
804
- "/GET_OP1_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/ " ,
805
- "/GET_OP2_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/ " ,
806
- "/GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " ,
807
- "/GET_OP2_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " ,
808
- "/FREE_OP1\(\)/ " ,
809
- "/FREE_OP2\(\)/ " ,
810
- "/FREE_OP1_IF_VAR\(\)/ " ,
811
- "/FREE_OP2_IF_VAR\(\)/ " ,
812
- "/FREE_OP1_VAR_PTR\(\)/ " ,
813
- "/FREE_OP2_VAR_PTR\(\)/ " ,
814
- "/FREE_UNFETCHED_OP1\(\)/ " ,
815
- "/FREE_UNFETCHED_OP2\(\)/ " ,
816
- "/^#(\s*)ifdef\s+ZEND_VM_SPEC\s* \n/m " ,
817
- "/^#(\s*)ifndef\s+ZEND_VM_SPEC\s* \n/m " ,
818
- "/\!defined\(ZEND_VM_SPEC\)/m " ,
819
- "/defined\(ZEND_VM_SPEC\)/m " ,
820
- "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m " ,
821
- "/ZEND_VM_C_GOTO\(\s*([A-Za-z_]*)\s*\)/m " ,
822
- "/^#(\s*)if\s+1\s* \\| \\|.*[^ \\\\]$/m " ,
823
- "/^#(\s*)if\s+0\s*&&.*[^ \\\\]$/m " ,
824
- "/^#(\s*)ifdef\s+ZEND_VM_EXPORT\s* \n/m " ,
825
- "/^#(\s*)ifndef\s+ZEND_VM_EXPORT\s* \n/m " ,
826
- "/OP_DATA_TYPE/ " ,
827
- "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/ " ,
828
- "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/ " ,
829
- "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/ " ,
830
- "/FREE_OP_DATA\(\)/ " ,
831
- "/FREE_OP_DATA_VAR_PTR\(\)/ " ,
832
- "/FREE_UNFETCHED_OP_DATA\(\)/ " ,
833
- "/RETURN_VALUE_USED\(opline\)/ " ,
834
- "/arg_num <= MAX_ARG_FLAG_NUM/ " ,
835
- "/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/ " ,
836
- "/opline->extended_value\s*==\s*0/ " ,
837
- "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/ " ,
838
- "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/ " ,
839
- "/opline->extended_value\s*==\s*ZEND_ASSIGN_STATIC_PROP/ " ,
840
- "/opline->extended_value\s*&\s*ZEND_ISEMPTY/ " ,
841
- "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/ " ,
842
- ),
843
- array (
844
- $ op1_type [$ op1 ],
845
- $ op2_type [$ op2 ],
846
- $ op1_free [$ op1 ],
847
- $ op2_free [$ op2 ],
848
- $ op1_get_zval_ptr [$ op1 ],
849
- $ op2_get_zval_ptr [$ op2 ],
850
- $ op1_get_zval_ptr_deref [$ op1 ],
851
- $ op2_get_zval_ptr_deref [$ op2 ],
852
- $ op1_get_zval_ptr_undef [$ op1 ],
853
- $ op2_get_zval_ptr_undef [$ op2 ],
854
- $ op1_get_zval_ptr_ptr [$ op1 ],
855
- $ op2_get_zval_ptr_ptr [$ op2 ],
856
- $ op1_get_zval_ptr_ptr_undef [$ op1 ],
857
- $ op2_get_zval_ptr_ptr_undef [$ op2 ],
858
- $ op1_get_obj_zval_ptr [$ op1 ],
859
- $ op2_get_obj_zval_ptr [$ op2 ],
860
- $ op1_get_obj_zval_ptr_undef [$ op1 ],
861
- $ op2_get_obj_zval_ptr_undef [$ op2 ],
862
- $ op1_get_obj_zval_ptr_deref [$ op1 ],
863
- $ op2_get_obj_zval_ptr_deref [$ op2 ],
864
- $ op1_get_obj_zval_ptr_ptr [$ op1 ],
865
- $ op2_get_obj_zval_ptr_ptr [$ op2 ],
866
- $ op1_get_obj_zval_ptr_ptr_undef [$ op1 ],
867
- $ op2_get_obj_zval_ptr_ptr_undef [$ op2 ],
868
- $ op1_free_op [$ op1 ],
869
- $ op2_free_op [$ op2 ],
870
- $ op1_free_op_if_var [$ op1 ],
871
- $ op2_free_op_if_var [$ op2 ],
872
- $ op1_free_op_var_ptr [$ op1 ],
873
- $ op2_free_op_var_ptr [$ op2 ],
874
- $ op1_free_unfetched [$ op1 ],
875
- $ op2_free_unfetched [$ op2 ],
876
- ($ op1 !="ANY " ||$ op2 !="ANY " )?"# \\1if 1 \n" :"# \\1if 0 \n" ,
877
- ($ op1 !="ANY " ||$ op2 !="ANY " )?"# \\1if 0 \n" :"# \\1if 1 \n" ,
878
- ($ op1 !="ANY " ||$ op2 !="ANY " )?"0 " :"1 " ,
879
- ($ op1 !="ANY " ||$ op2 !="ANY " )?"1 " :"0 " ,
880
- "\\1 " .(($ spec && $ kind != ZEND_VM_KIND_CALL )?("_SPEC " .$ prefix [$ op1 ].$ prefix [$ op2 ].extra_spec_name ($ extra_spec )):"" ),
881
- "goto \\1 " .(($ spec && $ kind != ZEND_VM_KIND_CALL )?("_SPEC " .$ prefix [$ op1 ].$ prefix [$ op2 ].extra_spec_name ($ extra_spec )):"" ),
882
- "# \\1if 1 " ,
883
- "# \\1if 0 " ,
884
- $ export ?"# \\1if 1 \n" :"# \\1if 0 \n" ,
885
- $ export ?"# \\1if 0 \n" :"# \\1if 1 \n" ,
886
- $ op_data_type [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
887
- $ op_data_get_zval_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
888
- $ op_data_get_zval_ptr_deref [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
889
- $ op_data_get_zval_ptr_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
890
- $ op_data_free_op [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
891
- $ op_data_free_op_var_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
892
- $ op_data_free_unfetched [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
893
- isset ($ extra_spec ['RETVAL ' ]) ? $ extra_spec ['RETVAL ' ] : "RETURN_VALUE_USED(opline) " ,
894
- isset ($ extra_spec ['QUICK_ARG ' ]) ? $ extra_spec ['QUICK_ARG ' ] : "arg_num <= MAX_ARG_FLAG_NUM " ,
895
- isset ($ extra_spec ['SMART_BRANCH ' ]) ?
896
- ($ extra_spec ['SMART_BRANCH ' ] == 1 ?
897
- "ZEND_VM_SMART_BRANCH_JMPZ( \\1, \\2) "
898
- : ($ extra_spec ['SMART_BRANCH ' ] == 2 ?
899
- "ZEND_VM_SMART_BRANCH_JMPNZ( \\1, \\2) " : "" ))
900
- : "ZEND_VM_SMART_BRANCH( \\1, \\2) " ,
901
- isset ($ extra_spec ['DIM_OBJ ' ]) ?
902
- ($ extra_spec ['DIM_OBJ ' ] == 0 ? "1 " : "0 " )
903
- : "\\0 " ,
904
- isset ($ extra_spec ['DIM_OBJ ' ]) ?
905
- ($ extra_spec ['DIM_OBJ ' ] == 1 ? "1 " : "0 " )
906
- : "\\0 " ,
907
- isset ($ extra_spec ['DIM_OBJ ' ]) ?
908
- ($ extra_spec ['DIM_OBJ ' ] == 2 ? "1 " : "0 " )
909
- : "\\0 " ,
910
- isset ($ extra_spec ['DIM_OBJ ' ]) ?
911
- ($ extra_spec ['DIM_OBJ ' ] == 3 ? "1 " : "0 " )
912
- : "\\0 " ,
913
- isset ($ extra_spec ['ISSET ' ]) ?
914
- ($ extra_spec ['ISSET ' ] == 0 ? "0 " : "1 " )
915
- : "\\0 " ,
916
- isset ($ extra_spec ['ISSET ' ]) ?
917
- ($ extra_spec ['ISSET ' ] == 0 ? "\\0 " : "opline->extended_value " )
918
- : "\\0 " ,
919
- ),
920
- $ code );
782
+ $ specialized_replacements = array (
783
+ "/OP1_TYPE/ " => $ op1_type [$ op1 ],
784
+ "/OP2_TYPE/ " => $ op2_type [$ op2 ],
785
+ "/OP1_FREE/ " => $ op1_free [$ op1 ],
786
+ "/OP2_FREE/ " => $ op2_free [$ op2 ],
787
+ "/GET_OP1_ZVAL_PTR\(([^)]*)\)/ " => $ op1_get_zval_ptr [$ op1 ],
788
+ "/GET_OP2_ZVAL_PTR\(([^)]*)\)/ " => $ op2_get_zval_ptr [$ op2 ],
789
+ "/GET_OP1_ZVAL_PTR_DEREF\(([^)]*)\)/ " => $ op1_get_zval_ptr_deref [$ op1 ],
790
+ "/GET_OP2_ZVAL_PTR_DEREF\(([^)]*)\)/ " => $ op2_get_zval_ptr_deref [$ op2 ],
791
+ "/GET_OP1_ZVAL_PTR_UNDEF\(([^)]*)\)/ " => $ op1_get_zval_ptr_undef [$ op1 ],
792
+ "/GET_OP2_ZVAL_PTR_UNDEF\(([^)]*)\)/ " => $ op2_get_zval_ptr_undef [$ op2 ],
793
+ "/GET_OP1_ZVAL_PTR_PTR\(([^)]*)\)/ " => $ op1_get_zval_ptr_ptr [$ op1 ],
794
+ "/GET_OP2_ZVAL_PTR_PTR\(([^)]*)\)/ " => $ op2_get_zval_ptr_ptr [$ op2 ],
795
+ "/GET_OP1_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " => $ op1_get_zval_ptr_ptr_undef [$ op1 ],
796
+ "/GET_OP2_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " => $ op2_get_zval_ptr_ptr_undef [$ op2 ],
797
+ "/GET_OP1_OBJ_ZVAL_PTR\(([^)]*)\)/ " => $ op1_get_obj_zval_ptr [$ op1 ],
798
+ "/GET_OP2_OBJ_ZVAL_PTR\(([^)]*)\)/ " => $ op2_get_obj_zval_ptr [$ op2 ],
799
+ "/GET_OP1_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/ " => $ op1_get_obj_zval_ptr_undef [$ op1 ],
800
+ "/GET_OP2_OBJ_ZVAL_PTR_UNDEF\(([^)]*)\)/ " => $ op2_get_obj_zval_ptr_undef [$ op2 ],
801
+ "/GET_OP1_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/ " => $ op1_get_obj_zval_ptr_deref [$ op1 ],
802
+ "/GET_OP2_OBJ_ZVAL_PTR_DEREF\(([^)]*)\)/ " => $ op2_get_obj_zval_ptr_deref [$ op2 ],
803
+ "/GET_OP1_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/ " => $ op1_get_obj_zval_ptr_ptr [$ op1 ],
804
+ "/GET_OP2_OBJ_ZVAL_PTR_PTR\(([^)]*)\)/ " => $ op2_get_obj_zval_ptr_ptr [$ op2 ],
805
+ "/GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " => $ op1_get_obj_zval_ptr_ptr_undef [$ op1 ],
806
+ "/GET_OP2_OBJ_ZVAL_PTR_PTR_UNDEF\(([^)]*)\)/ " => $ op2_get_obj_zval_ptr_ptr_undef [$ op2 ],
807
+ "/FREE_OP1\(\)/ " => $ op1_free_op [$ op1 ],
808
+ "/FREE_OP2\(\)/ " => $ op2_free_op [$ op2 ],
809
+ "/FREE_OP1_IF_VAR\(\)/ " => $ op1_free_op_if_var [$ op1 ],
810
+ "/FREE_OP2_IF_VAR\(\)/ " => $ op2_free_op_if_var [$ op2 ],
811
+ "/FREE_OP1_VAR_PTR\(\)/ " => $ op1_free_op_var_ptr [$ op1 ],
812
+ "/FREE_OP2_VAR_PTR\(\)/ " => $ op2_free_op_var_ptr [$ op2 ],
813
+ "/FREE_UNFETCHED_OP1\(\)/ " => $ op1_free_unfetched [$ op1 ],
814
+ "/FREE_UNFETCHED_OP2\(\)/ " => $ op2_free_unfetched [$ op2 ],
815
+ "/^#(\s*)ifdef\s+ZEND_VM_SPEC\s* \n/m " => ($ op1 !="ANY " ||$ op2 !="ANY " )?"# \\1if 1 \n" :"# \\1if 0 \n" ,
816
+ "/^#(\s*)ifndef\s+ZEND_VM_SPEC\s* \n/m " => ($ op1 !="ANY " ||$ op2 !="ANY " )?"# \\1if 0 \n" :"# \\1if 1 \n" ,
817
+ "/\!defined\(ZEND_VM_SPEC\)/m " => ($ op1 !="ANY " ||$ op2 !="ANY " )?"0 " :"1 " ,
818
+ "/defined\(ZEND_VM_SPEC\)/m " => ($ op1 !="ANY " ||$ op2 !="ANY " )?"1 " :"0 " ,
819
+ "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m " => "\\1 " .(($ spec && $ kind != ZEND_VM_KIND_CALL )?("_SPEC " .$ prefix [$ op1 ].$ prefix [$ op2 ].extra_spec_name ($ extra_spec )):"" ),
820
+ "/ZEND_VM_C_GOTO\(\s*([A-Za-z_]*)\s*\)/m " => "goto \\1 " .(($ spec && $ kind != ZEND_VM_KIND_CALL )?("_SPEC " .$ prefix [$ op1 ].$ prefix [$ op2 ].extra_spec_name ($ extra_spec )):"" ),
821
+ "/^#(\s*)if\s+1\s* \\| \\|.*[^ \\\\]$/m " => "# \\1if 1 " ,
822
+ "/^#(\s*)if\s+0\s*&&.*[^ \\\\]$/m " => "# \\1if 0 " ,
823
+ "/^#(\s*)ifdef\s+ZEND_VM_EXPORT\s* \n/m " => $ export ?"# \\1if 1 \n" :"# \\1if 0 \n" ,
824
+ "/^#(\s*)ifndef\s+ZEND_VM_EXPORT\s* \n/m " => $ export ?"# \\1if 0 \n" :"# \\1if 1 \n" ,
825
+ "/OP_DATA_TYPE/ " => $ op_data_type [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
826
+ "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/ " => $ op_data_get_zval_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
827
+ "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/ " => $ op_data_get_zval_ptr_deref [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
828
+ "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/ " => $ op_data_get_zval_ptr_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
829
+ "/FREE_OP_DATA\(\)/ " => $ op_data_free_op [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
830
+ "/FREE_OP_DATA_VAR_PTR\(\)/ " => $ op_data_free_op_var_ptr [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
831
+ "/FREE_UNFETCHED_OP_DATA\(\)/ " => $ op_data_free_unfetched [isset ($ extra_spec ['OP_DATA ' ]) ? $ extra_spec ['OP_DATA ' ] : "ANY " ],
832
+ "/RETURN_VALUE_USED\(opline\)/ " => isset ($ extra_spec ['RETVAL ' ]) ? $ extra_spec ['RETVAL ' ] : "RETURN_VALUE_USED(opline) " ,
833
+ "/arg_num <= MAX_ARG_FLAG_NUM/ " => isset ($ extra_spec ['QUICK_ARG ' ]) ? $ extra_spec ['QUICK_ARG ' ] : "arg_num <= MAX_ARG_FLAG_NUM " ,
834
+ "/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/ " => isset ($ extra_spec ['SMART_BRANCH ' ]) ?
835
+ ($ extra_spec ['SMART_BRANCH ' ] == 1 ?
836
+ "ZEND_VM_SMART_BRANCH_JMPZ( \\1, \\2) "
837
+ : ($ extra_spec ['SMART_BRANCH ' ] == 2 ?
838
+ "ZEND_VM_SMART_BRANCH_JMPNZ( \\1, \\2) " : "" ))
839
+ : "ZEND_VM_SMART_BRANCH( \\1, \\2) " ,
840
+ "/opline->extended_value\s*==\s*0/ " => isset ($ extra_spec ['DIM_OBJ ' ]) ?
841
+ ($ extra_spec ['DIM_OBJ ' ] == 0 ? "1 " : "0 " )
842
+ : "\\0 " ,
843
+ "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/ " => isset ($ extra_spec ['DIM_OBJ ' ]) ?
844
+ ($ extra_spec ['DIM_OBJ ' ] == 1 ? "1 " : "0 " )
845
+ : "\\0 " ,
846
+ "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/ " => isset ($ extra_spec ['DIM_OBJ ' ]) ?
847
+ ($ extra_spec ['DIM_OBJ ' ] == 2 ? "1 " : "0 " )
848
+ : "\\0 " ,
849
+ "/opline->extended_value\s*==\s*ZEND_ASSIGN_STATIC_PROP/ " => isset ($ extra_spec ['DIM_OBJ ' ]) ?
850
+ ($ extra_spec ['DIM_OBJ ' ] == 3 ? "1 " : "0 " )
851
+ : "\\0 " ,
852
+ "/opline->extended_value\s*&\s*ZEND_ISEMPTY/ " => isset ($ extra_spec ['ISSET ' ]) ?
853
+ ($ extra_spec ['ISSET ' ] == 0 ? "0 " : "1 " )
854
+ : "\\0 " ,
855
+ "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/ " => isset ($ extra_spec ['ISSET ' ]) ?
856
+ ($ extra_spec ['ISSET ' ] == 0 ? "\\0 " : "opline->extended_value " )
857
+ : "\\0 " ,
858
+ );
859
+ $ code = preg_replace (array_keys ($ specialized_replacements ), array_values ($ specialized_replacements ), $ code );
921
860
922
861
if (0 && strpos ($ code , '{ ' ) === 0 ) {
923
862
$ code = "{ \n\tfprintf(stderr, \"$ name \\n \"); \n" . substr ($ code , 1 );
0 commit comments