From 2bb9a591758ff39fe5dbeca7be146b9549da4e48 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 26 Feb 2015 17:53:03 +0300 Subject: [PATCH] Fixed ability to build unspecialized executor --- Zend/zend_vm_def.h | 9 ++++--- Zend/zend_vm_execute.h | 53 ++++++++++++++++++++---------------------- Zend/zend_vm_gen.php | 24 +++++++++---------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e4cfd7953a..39815b400f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1659,14 +1659,13 @@ ZEND_VM_HANDLER(98, ZEND_FETCH_LIST, CONST|TMPVAR|CV, CONST) ZEND_VM_C_LABEL(try_fetch_list): if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { - zend_free_op free_op2; - zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R); + zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), EX_CONSTANT(opline->op2), OP2_TYPE, BP_VAR_R); ZVAL_COPY(EX_VAR(opline->result.var), value); } else if (UNEXPECTED(Z_TYPE_P(container) == IS_OBJECT) && EXPECTED(Z_OBJ_HT_P(container)->read_dimension)) { zval *result = EX_VAR(opline->result.var); - zval *retval = Z_OBJ_HT_P(container)->read_dimension(container, GET_OP2_ZVAL_PTR(BP_VAR_R), BP_VAR_R, result); + zval *retval = Z_OBJ_HT_P(container)->read_dimension(container, EX_CONSTANT(opline->op2), BP_VAR_R, result); if (retval) { if (result != retval) { @@ -3205,7 +3204,7 @@ ZEND_VM_C_LABEL(fcall_end): ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED) { -#if OP1_TYPE != IS_UNUSED +#if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -4450,7 +4449,7 @@ ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|UNUSE if (OP1_TYPE == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED +#if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED) } else { ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT); #endif diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e411bf446b..90aa7111f0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4411,7 +4411,6 @@ static int ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_H try_fetch_list: if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { - zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), EX_CONSTANT(opline->op2), IS_CONST, BP_VAR_R); ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -4839,7 +4838,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_H if (IS_CONST == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CONST != IS_UNUSED +#if 0 || (IS_CONST != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -6358,7 +6357,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if IS_CONST != IS_UNUSED +#if 0 || (IS_CONST != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -6487,7 +6486,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_ if (IS_CONST == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CONST != IS_UNUSED +#if 0 || (IS_CONST != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -7697,7 +7696,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAND if (IS_CONST == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CONST != IS_UNUSED +#if 0 || (IS_CONST != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -8802,7 +8801,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_ if (IS_CONST == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CONST != IS_UNUSED +#if 0 || (IS_CONST != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -9986,7 +9985,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAN if (IS_TMP_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_TMP_VAR != IS_UNUSED +#if 0 || (IS_TMP_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -10485,7 +10484,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_O static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if IS_TMP_VAR != IS_UNUSED +#if 0 || (IS_TMP_VAR != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -10614,7 +10613,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HA if (IS_TMP_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_TMP_VAR != IS_UNUSED +#if 0 || (IS_TMP_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -11068,7 +11067,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLE if (IS_TMP_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_TMP_VAR != IS_UNUSED +#if 0 || (IS_TMP_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -11493,7 +11492,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HA if (IS_TMP_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_TMP_VAR != IS_UNUSED +#if 0 || (IS_TMP_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -14257,7 +14256,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN if (IS_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_VAR != IS_UNUSED +#if 0 || (IS_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -15555,7 +15554,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if IS_VAR != IS_UNUSED +#if 0 || (IS_VAR != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -15684,7 +15683,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA if (IS_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_VAR != IS_UNUSED +#if 0 || (IS_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -17151,7 +17150,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE if (IS_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_VAR != IS_UNUSED +#if 0 || (IS_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -18618,7 +18617,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HA if (IS_VAR == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_VAR != IS_UNUSED +#if 0 || (IS_VAR != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -19928,7 +19927,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_ if (IS_UNUSED == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_UNUSED != IS_UNUSED +#if 0 || (IS_UNUSED != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -20892,7 +20891,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPC static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if IS_UNUSED != IS_UNUSED +#if 0 || (IS_UNUSED != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -20933,7 +20932,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE if (IS_UNUSED == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_UNUSED != IS_UNUSED +#if 0 || (IS_UNUSED != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -22050,7 +22049,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAN if (IS_UNUSED == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_UNUSED != IS_UNUSED +#if 0 || (IS_UNUSED != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -23455,7 +23454,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE if (IS_UNUSED == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_UNUSED != IS_UNUSED +#if 0 || (IS_UNUSED != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -26658,7 +26657,6 @@ static int ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND try_fetch_list: if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { - zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), EX_CONSTANT(opline->op2), IS_CONST, BP_VAR_R); ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -27089,7 +27087,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND if (IS_CV == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CV != IS_UNUSED +#if 0 || (IS_CV != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -29264,7 +29262,7 @@ assign_dim_clean: static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { -#if IS_CV != IS_UNUSED +#if 0 || (IS_CV != IS_UNUSED) USE_OPLINE #endif SAVE_OPLINE(); @@ -29393,7 +29391,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN if (IS_CV == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CV != IS_UNUSED +#if 0 || (IS_CV != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -31385,7 +31383,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER if (IS_CV == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CV != IS_UNUSED +#if 0 || (IS_CV != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -33397,7 +33395,7 @@ static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HAN if (IS_CV == IS_UNUSED) { ZEND_VM_NEXT_OPCODE(); -#if 0 || IS_CV != IS_UNUSED +#if 0 || (IS_CV != IS_UNUSED) } else { return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); #endif @@ -34798,7 +34796,6 @@ static int ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_ try_fetch_list: if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { - zval *value = zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), EX_CONSTANT(opline->op2), IS_CONST, BP_VAR_R); ZVAL_COPY(EX_VAR(opline->result.var), value); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index cad9e8b75b..c3b16b3478 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -438,16 +438,16 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) { "/FREE_OP2_IF_VAR\(\)/", "/FREE_OP1_VAR_PTR\(\)/", "/FREE_OP2_VAR_PTR\(\)/", - "/^#ifdef\s+ZEND_VM_SPEC\s*\n/m", - "/^#ifndef\s+ZEND_VM_SPEC\s*\n/m", + "/^#(\s*)ifdef\s+ZEND_VM_SPEC\s*\n/m", + "/^#(\s*)ifndef\s+ZEND_VM_SPEC\s*\n/m", "/\!defined\(ZEND_VM_SPEC\)/m", "/defined\(ZEND_VM_SPEC\)/m", "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m", "/ZEND_VM_C_GOTO\(\s*([A-Za-z_]*)\s*\)/m", - "/^#if\s+1\s*\\|\\|.*[^\\\\]$/m", - "/^#if\s+0\s*&&.*[^\\\\]$/m", - "/^#ifdef\s+ZEND_VM_EXPORT\s*\n/m", - "/^#ifndef\s+ZEND_VM_EXPORT\s*\n/m" + "/^#(\s*)if\s+1\s*\\|\\|.*[^\\\\]$/m", + "/^#(\s*)if\s+0\s*&&.*[^\\\\]$/m", + "/^#(\s*)ifdef\s+ZEND_VM_EXPORT\s*\n/m", + "/^#(\s*)ifndef\s+ZEND_VM_EXPORT\s*\n/m" ), array( $op1_type[$op1], @@ -476,16 +476,16 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) { $op2_free_op_if_var[$op2], $op1_free_op_var_ptr[$op1], $op2_free_op_var_ptr[$op2], - ($op1!="ANY"||$op2!="ANY")?"#if 1\n":"#if 0\n", - ($op1!="ANY"||$op2!="ANY")?"#if 0\n":"#if 1\n", + ($op1!="ANY"||$op2!="ANY")?"#\\1if 1\n":"#\\1if 0\n", + ($op1!="ANY"||$op2!="ANY")?"#\\1if 0\n":"#\\1if 1\n", ($op1!="ANY"||$op2!="ANY")?"0":"1", ($op1!="ANY"||$op2!="ANY")?"1":"0", "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2]):""), "goto \\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2]):""), - "#if 1", - "#if 0", - $export?"#if 1\n":"#if 0\n", - $export?"#if 0\n":"#if 1\n" + "#\\1if 1", + "#\\1if 0", + $export?"#\\1if 1\n":"#\\1if 0\n", + $export?"#\\1if 0\n":"#\\1if 1\n" ), $code); -- 2.40.0