#define ZEND_USER_OPCODE_CONTINUE 0 /* execute next opcode */
#define ZEND_USER_OPCODE_RETURN 1 /* exit from executor (return from function) */
#define ZEND_USER_OPCODE_DISPATCH 2 /* call original opcode handler */
+#define ZEND_USER_OPCODE_ENTER 3 /* enter into new op_array without recursion */
+#define ZEND_USER_OPCODE_LEAVE 4 /* return to calling op_array within the same executor */
#define ZEND_USER_OPCODE_DISPATCH_TO 0x100 /* call original handler of returned opcode */
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
}
-#ifndef ZEND_VM_EXPORT
if (zend_execute == execute && !EG(exception)) {
EX(call_opline) = opline;
ZEND_VM_ENTER();
} else {
zend_execute(EG(active_op_array) TSRMLS_CC);
}
-#else
- zend_execute(EG(active_op_array) TSRMLS_CC);
-#endif
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN:
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
+ case ZEND_USER_OPCODE_ENTER:
+ ZEND_VM_ENTER();
+ case ZEND_USER_OPCODE_LEAVE:
+ ZEND_VM_LEAVE();
case ZEND_USER_OPCODE_DISPATCH:
ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
default:
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
}
-#if 1
if (zend_execute == execute && !EG(exception)) {
EX(call_opline) = opline;
ZEND_VM_ENTER();
} else {
zend_execute(EG(active_op_array) TSRMLS_CC);
}
-#else
- zend_execute(EG(active_op_array) TSRMLS_CC);
-#endif
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
ZEND_VM_CONTINUE();
case ZEND_USER_OPCODE_RETURN:
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ case ZEND_USER_OPCODE_ENTER:
+ ZEND_VM_ENTER();
+ case ZEND_USER_OPCODE_LEAVE:
+ ZEND_VM_LEAVE();
case ZEND_USER_OPCODE_DISPATCH:
ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
default: