summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h315
1 files changed, 310 insertions, 5 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index af40d57d0e..d90053a55e 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2836,7 +2836,43 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
if (i_zend_is_true(value)) {
ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
- zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ if (!0) {
+ zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ }
+
+#if DEBUG_ZEND>=2
+ printf("Conditional jmp to %d\n", opline->op2.opline_num);
+#endif
+ ZEND_VM_JMP(opline->op2.jmp_addr);
+ }
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = opline->op1.zv;
+
+ if (i_zend_is_true(value)) {
+ if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
@@ -2866,6 +2902,33 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = opline->op1.zv;
+
+ if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -7132,8 +7195,45 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (i_zend_is_true(value)) {
ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
- zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
- zval_dtor(free_op1.var);
+ if (!1) {
+ zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ }
+
+#if DEBUG_ZEND>=2
+ printf("Conditional jmp to %d\n", opline->op2.opline_num);
+#endif
+ ZEND_VM_JMP(opline->op2.jmp_addr);
+ }
+
+ zval_dtor(free_op1.var);
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (i_zend_is_true(value)) {
+ if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!1) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
+
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
#endif
@@ -7163,6 +7263,33 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!1) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -11539,7 +11666,44 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (i_zend_is_true(value)) {
ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
- zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ if (!0) {
+ zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ }
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+#if DEBUG_ZEND>=2
+ printf("Conditional jmp to %d\n", opline->op2.opline_num);
+#endif
+ ZEND_VM_JMP(opline->op2.jmp_addr);
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (i_zend_is_true(value)) {
+ if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
@@ -11570,6 +11734,34 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+ zend_free_op free_op1;
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
+
+ if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -27127,7 +27319,43 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (i_zend_is_true(value)) {
ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
- zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ if (!0) {
+ zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
+ }
+
+#if DEBUG_ZEND>=2
+ printf("Conditional jmp to %d\n", opline->op2.opline_num);
+#endif
+ ZEND_VM_JMP(opline->op2.jmp_addr);
+ }
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
+static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
+
+ if (i_zend_is_true(value)) {
+ if (IS_CV == IS_VAR || IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
@@ -27157,6 +27385,33 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ zval *value, *ret;
+
+ SAVE_OPLINE();
+ value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
+
+ if (IS_CV == IS_VAR || IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ EX_T(opline->result.var).var.ptr = value;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ } else {
+ ALLOC_ZVAL(ret);
+ INIT_PZVAL_COPY(ret, value);
+ EX_T(opline->result.var).var.ptr = ret;
+ EX_T(opline->result.var).var.ptr_ptr = NULL;
+ if (!0) {
+ zval_copy_ctor(EX_T(opline->result.var).var.ptr);
+ }
+ }
+
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -39759,6 +40014,56 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
+ ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
+ ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER
};
zend_opcode_handlers = (opcode_handler_t*)labels;