]> granicus.if.org Git - php/commitdiff
Reorder conditions
authorDmitry Stogov <dmitry@zend.com>
Tue, 18 Dec 2018 20:23:44 +0000 (23:23 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 18 Dec 2018 20:23:44 +0000 (23:23 +0300)
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index fca8e30279f5e4cb71e1ba39c0f7a1387887ff2b..d72de2b7494084e3ed7458b2e37cc4f8e16b6551 100644 (file)
@@ -64460,26 +64460,29 @@ static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, co
        if (spec & SPEC_RULE_OP1) offset = offset * 5 + zend_vm_decode[op->op1_type];
        if (spec & SPEC_RULE_OP2) offset = offset * 5 + zend_vm_decode[op->op2_type];
        if (spec & SPEC_EXTRA_MASK) {
-               if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
-               else if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);
-               else if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);
-               else if (spec & SPEC_RULE_SMART_BRANCH) {
+               if (spec & SPEC_RULE_RETVAL) {
+                       offset = offset * 2 + (op->result_type != IS_UNUSED);
+               } else if (spec & SPEC_RULE_QUICK_ARG) {
+                       offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);
+               } else if (spec & SPEC_RULE_OP_DATA) {
+                       offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];
+               } else if (spec & SPEC_RULE_DIM_OBJ) {
                        offset = offset * 3;
-                       if ((op+1)->opcode == ZEND_JMPZ) {
+                       if (op->extended_value == ZEND_ASSIGN_DIM) {
                                offset += 1;
-                       } else if ((op+1)->opcode == ZEND_JMPNZ) {
+                       } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
                                offset += 2;
                        }
-               }
-               else if (spec & SPEC_RULE_DIM_OBJ) {
+               } else if (spec & SPEC_RULE_ISSET) {
+                       offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
+               } else if (spec & SPEC_RULE_SMART_BRANCH) {
                        offset = offset * 3;
-                       if (op->extended_value == ZEND_ASSIGN_DIM) {
+                       if ((op+1)->opcode == ZEND_JMPZ) {
                                offset += 1;
-                       } else if (op->extended_value == ZEND_ASSIGN_OBJ) {
+                       } else if ((op+1)->opcode == ZEND_JMPNZ) {
                                offset += 2;
                        }
                }
-               else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
        }
        return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset];
 }
index e3187d749626a1f908a8094c4a6dd21bc2f82cd2..e396fe5d919a60819d0f3381c00db400165076d2 100755 (executable)
@@ -2705,28 +2705,20 @@ function gen_vm($def, $skel) {
                        $else = "";
                        out($f, "\tif (spec & SPEC_EXTRA_MASK) {\n");
 
-                       if (isset($used_extra_spec["OP_DATA"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_OP_DATA) offset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
-                               $else = "else ";
-                       }
                        if (isset($used_extra_spec["RETVAL"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) offset = offset * 2 + (op->result_type != IS_UNUSED);\n");
-                               $else = "else ";
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) {\n");
+                               out($f, "\t\t\toffset = offset * 2 + (op->result_type != IS_UNUSED);\n");
+                               $else = "} else ";
                        }
                        if (isset($used_extra_spec["QUICK_ARG"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_QUICK_ARG) offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);\n");
-                               $else = "else ";
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_QUICK_ARG) {\n");
+                               out($f, "\t\t\toffset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);\n");
+                               $else = "} else ";
                        }
-                       if (isset($used_extra_spec["SMART_BRANCH"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_SMART_BRANCH) {\n");
-                               out($f, "\t\t\toffset = offset * 3;\n");
-                               out($f, "\t\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
-                               out($f, "\t\t\t\toffset += 1;\n");
-                               out($f, "\t\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
-                               out($f, "\t\t\t\toffset += 2;\n");
-                               out($f, "\t\t\t}\n");
-                               out($f, "\t\t}\n");
-                               $else = "else ";
+                       if (isset($used_extra_spec["OP_DATA"])) {
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_OP_DATA) {\n");
+                               out($f, "\t\t\toffset = offset * 5 + zend_vm_decode[(op + 1)->op1_type];\n");
+                               $else = "} else ";
                        }
                        if (isset($used_extra_spec["DIM_OBJ"])) {
                                out($f, "\t\t{$else}if (spec & SPEC_RULE_DIM_OBJ) {\n");
@@ -2736,12 +2728,25 @@ function gen_vm($def, $skel) {
                                out($f, "\t\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n");
                                out($f, "\t\t\t\toffset += 2;\n");
                                out($f, "\t\t\t}\n");
-                               out($f, "\t\t}\n");
-                               $else = "else ";
+                               $else = "} else ";
                        }
                        if (isset($used_extra_spec["ISSET"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
-                               $else = "else ";
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) {\n");
+                               out($f, "\t\t\toffset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
+                               $else = "} else ";
+                       }
+                       if (isset($used_extra_spec["SMART_BRANCH"])) {
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_SMART_BRANCH) {\n");
+                               out($f, "\t\t\toffset = offset * 3;\n");
+                               out($f, "\t\t\tif ((op+1)->opcode == ZEND_JMPZ) {\n");
+                               out($f, "\t\t\t\toffset += 1;\n");
+                               out($f, "\t\t\t} else if ((op+1)->opcode == ZEND_JMPNZ) {\n");
+                               out($f, "\t\t\t\toffset += 2;\n");
+                               out($f, "\t\t\t}\n");
+                               $else = "} else ";
+                       }
+                       if ($else !== "") {
+                               out($f, "\t\t}\n");
                        }
                        out($f, "\t}\n");
                }