]> granicus.if.org Git - php/commitdiff
Fixed ability to build unspecialized executor
authorDmitry Stogov <dmitry@zend.com>
Thu, 26 Feb 2015 14:53:03 +0000 (17:53 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 26 Feb 2015 14:53:03 +0000 (17:53 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index e4cfd7953a48ae39762f5e2597b68cd5944ba33a..39815b400f53e3144df4c3254ab0fb6db4d8d029 100644 (file)
@@ -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
index e411bf446bd736a0919734346bcf3a64f053a94f..90aa7111f0b44bb23e0819473e2dddfa44f8e87e 100644 (file)
@@ -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);
index cad9e8b75b7d5ca2dec97b032a4db0cca63c8a96..c3b16b34783b3f7f2c28cb92329af6d744febd8e 100644 (file)
@@ -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);