cvs: ZendEngine2(PHP_5_3) / zend_vm_def.h zend_vm_execute.h

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

  Modified files:              (Branch: PHP_5_3)
    /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-20090318141721.txt (text/plain, 19.7 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.86&r2=1.59.2.29.2.48.2.87&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.86 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.87
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.86	Wed Mar 18 12:53:14 2009
+++ ZendEngine2/zend_vm_def.h	Wed Mar 18 14:17:14 2009
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.86 2009/03/18 12:53:14 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.87 2009/03/18 14:17:14 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -1652,14 +1652,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();
@@ -1669,14 +1679,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();
@@ -1686,13 +1706,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
@@ -1711,16 +1737,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();
 }
@@ -1729,16 +1765,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.62.2.30.2.49.2.86&r2=1.62.2.30.2.49.2.87&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.86 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.87
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.86	Wed Mar 18 12:53:14 2009
+++ ZendEngine2/zend_vm_execute.h	Wed Mar 18 14:17:15 2009
@@ -1463,13 +1463,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();
@@ -1479,13 +1490,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();
@@ -1495,11 +1517,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
@@ -1518,15 +1548,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();
 }
@@ -1535,15 +1576,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();
 }
@@ -4689,14 +4741,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();
@@ -4706,14 +4768,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();
@@ -4723,13 +4795,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
@@ -4748,16 +4826,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();
 }
@@ -4766,16 +4854,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();
 }
@@ -7898,14 +7996,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();
@@ -7915,14 +8023,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();
@@ -7932,13 +8050,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
@@ -7957,16 +8081,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();
 }
@@ -7975,16 +8109,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();
 }
@@ -21779,13 +21923,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();
@@ -21795,13 +21950,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();
@@ -21811,11 +21977,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
@@ -21834,15 +22008,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();
 }
@@ -21851,15 +22036,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();
 }