fix ZEND_VM_SET_OPCODE_HANDLER cannot set user opcode handler
authorHaitao Lv <i@lvht.net>
Mon, 12 Feb 2018 03:20:24 +0000 (11:20 +0800)
committerDmitry Stogov <dmitry@zend.com>
Tue, 20 Feb 2018 07:46:41 +0000 (10:46 +0300)
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php

index ccf41339edc1efb66fd9054f173e0d91c981252a..d9f5534ed9ab1bd124987d38505ab9539bbd5d4e 100644 (file)
@@ -66630,7 +66630,8 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
 
 ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)
 {
-       uint32_t spec = zend_spec_handlers[op->opcode];
+       zend_uchar opcode = zend_user_opcodes[op->opcode];
+       uint32_t spec = zend_spec_handlers[opcode];
 
        if (spec & SPEC_RULE_COMMUTATIVE) {
                if (op->op1_type < op->op2_type) {
index 404121317e0b18b3fcd99d39255821082ab2f229..aa8df9d95d1a1a4bff302a8e20364752ac4eb36b 100644 (file)
@@ -2646,10 +2646,11 @@ function gen_vm($def, $skel) {
        // Generate zend_vm_get_opcode_handler() function
        out($f, "ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)\n");
        out($f, "{\n");
+       out($f, "\tzend_uchar opcode = zend_user_opcodes[op->opcode];\n");
        if (!ZEND_VM_SPEC) {
-               out($f, "\top->handler = zend_vm_get_opcode_handler(op->opcode, op);\n");
+               out($f, "\top->handler = zend_vm_get_opcode_handler(opcode, op);\n");
        } else {
-               out($f, "\tuint32_t spec = zend_spec_handlers[op->opcode];\n\n");
+               out($f, "\tuint32_t spec = zend_spec_handlers[opcode];\n\n");
                out($f, "\tif (spec & SPEC_RULE_COMMUTATIVE) {\n");
                out($f, "\t\tif (op->op1_type < op->op2_type) {\n");
                out($f, "\t\t\tzend_swap_operands(op);\n");