Skip to content

Commit d303225

Browse files
beberleinikic
authored andcommitted
Make regex replacements in zend_vm_gen.php more obvious
Change specializing preg_replace code in VM to be map of search to replacement for easier understanding.
1 parent b4cbf6f commit d303225

File tree

1 file changed

+78
-139
lines changed

1 file changed

+78
-139
lines changed

Zend/zend_vm_gen.php

+78-139
Original file line numberDiff line numberDiff line change
@@ -779,145 +779,84 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp
779779
$op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched;
780780

781781
// 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);
921860

922861
if (0 && strpos($code, '{') === 0) {
923862
$code = "{\n\tfprintf(stderr, \"$name\\n\");\n" . substr($code, 1);

0 commit comments

Comments
 (0)