cvs: ZendEngine2 / zend_vm_def.h zend_vm_execute.h

[email protected] ("Dmitry Stogov") Wed, 18 Mar 2009 14:17:38 -0000
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1237385858@cvsserver>
dmitry		Wed Mar 18 14:17:38 2009 UTC

  Modified files:              
    /ZendEngine2	zend_vm_def.h zend_vm_execute.h 
  Log:
  Improved speed of conditional jump instructions by checking for most useful case (conditional expression)
dmitry-20090318141738.txt (text/plain, 19.6 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.258&r2=1.259&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.258 ZendEngine2/zend_vm_def.h:1.259
--- ZendEngine2/zend_vm_def.h:1.258	Wed Mar 18 12:52:58 2009
+++ ZendEngine2/zend_vm_def.h	Wed Mar 18 14:17:38 2009
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.258 2009/03/18 12:52:58 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.259 2009/03/18 14:17:38 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1693,14 +1693,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
+	zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+	int ret;
 
-	FREE_OP1();
+	if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		FREE_OP1();
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (!ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -1710,14 +1720,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
+	zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+	int ret;
 
-	FREE_OP1();
+	if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		FREE_OP1();
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -1727,13 +1747,19 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
+	zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+	int retval;
 
-	FREE_OP1();
-
-	if (UNEXPECTED(EG(exception) != NULL)) {
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(retval != 0)) {
+	if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		FREE_OP1();
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
+	if (EXPECTED(retval != 0)) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp on true to %d\n", opline->extended_value);
 #endif
@@ -1752,16 +1778,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
+	zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+	int retval;
 
-	FREE_OP1();
+	if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		FREE_OP1();
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (!retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -1770,16 +1806,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
+	zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
+	int retval;
 
-	FREE_OP1();
+	if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		FREE_OP1();
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.262&r2=1.263&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.262 ZendEngine2/zend_vm_execute.h:1.263
--- ZendEngine2/zend_vm_execute.h:1.262	Wed Mar 18 12:52:58 2009
+++ ZendEngine2/zend_vm_execute.h	Wed Mar 18 14:17:38 2009
@@ -1456,13 +1456,24 @@
 {
 	zend_op *opline = EX(opline);
 
-	int ret = i_zend_is_true(&opline->op1.u.constant);
+	zval *val = &opline->op1.u.constant;
+	int ret;
 
+	if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (!ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -1472,13 +1483,24 @@
 {
 	zend_op *opline = EX(opline);
 
-	int ret = i_zend_is_true(&opline->op1.u.constant);
+	zval *val = &opline->op1.u.constant;
+	int ret;
 
+	if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -1488,11 +1510,19 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(&opline->op1.u.constant);
+	zval *val = &opline->op1.u.constant;
+	int retval;
 
-	if (UNEXPECTED(EG(exception) != NULL)) {
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(retval != 0)) {
+	if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
+	if (EXPECTED(retval != 0)) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp on true to %d\n", opline->extended_value);
 #endif
@@ -1511,15 +1541,26 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(&opline->op1.u.constant);
+	zval *val = &opline->op1.u.constant;
+	int retval;
+
+	if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
 
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (!retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -1528,15 +1569,26 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(&opline->op1.u.constant);
+	zval *val = &opline->op1.u.constant;
+	int retval;
+
+	if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
 
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -4838,14 +4890,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int ret;
 
-	zval_dtor(free_op1.var);
+	if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		zval_dtor(free_op1.var);
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (!ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -4855,14 +4917,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int ret;
 
-	zval_dtor(free_op1.var);
+	if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		zval_dtor(free_op1.var);
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -4872,13 +4944,19 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
-
-	zval_dtor(free_op1.var);
+	zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	if (UNEXPECTED(EG(exception) != NULL)) {
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(retval != 0)) {
+	if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		zval_dtor(free_op1.var);
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
+	if (EXPECTED(retval != 0)) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp on true to %d\n", opline->extended_value);
 #endif
@@ -4897,16 +4975,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	zval_dtor(free_op1.var);
+	if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		zval_dtor(free_op1.var);
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (!retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -4915,16 +5003,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	zval_dtor(free_op1.var);
+	if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		zval_dtor(free_op1.var);
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -8191,14 +8289,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int ret;
 
-	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+	if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (!ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -8208,14 +8316,24 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int ret = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int ret;
 
-	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+	if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -8225,13 +8343,19 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
-
-	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+	zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	if (UNEXPECTED(EG(exception) != NULL)) {
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(retval != 0)) {
+	if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
+	if (EXPECTED(retval != 0)) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp on true to %d\n", opline->extended_value);
 #endif
@@ -8250,16 +8374,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+	if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (!retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -8268,16 +8402,26 @@
 {
 	zend_op *opline = EX(opline);
 	zend_free_op free_op1;
-	int retval = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
+	zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+	int retval;
 
-	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+	if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -22721,13 +22865,24 @@
 {
 	zend_op *opline = EX(opline);
 
-	int ret = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
+	zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
+	int ret;
+
+	if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
 
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (!ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -22737,13 +22892,24 @@
 {
 	zend_op *opline = EX(opline);
 
-	int ret = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
+	zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
+	int ret;
 
+	if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		ret = Z_LVAL_P(val);
+	} else {
+		ret = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	if (ret) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -22753,11 +22919,19 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
+	zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
+	int retval;
 
-	if (UNEXPECTED(EG(exception) != NULL)) {
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(retval != 0)) {
+	if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
+	if (EXPECTED(retval != 0)) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp on true to %d\n", opline->extended_value);
 #endif
@@ -22776,15 +22950,26 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
+	zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
+	int retval;
 
+	if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (!retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -22793,15 +22978,26 @@
 {
 	zend_op *opline = EX(opline);
 
-	int retval = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
+	zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
+	int retval;
 
+	if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
+		retval = Z_LVAL_P(val);
+	} else {
+		retval = i_zend_is_true(val);
+
+		if (UNEXPECTED(EG(exception) != NULL)) {
+			ZEND_VM_CONTINUE();
+		}
+	}
 	Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
 	Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
 	if (retval) {
 #if DEBUG_ZEND>=2
 		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
 #endif
-		ZEND_VM_JMP(opline->op2.u.jmp_addr);
+		ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
+		ZEND_VM_CONTINUE();
 	}
 	ZEND_VM_NEXT_OPCODE();
 }