]> granicus.if.org Git - php/commitdiff
Fixed bug #34199 (if($obj)/if(!$obj) inconsistency)
authorDmitry Stogov <dmitry@php.net>
Mon, 12 Sep 2005 11:48:57 +0000 (11:48 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 12 Sep 2005 11:48:57 +0000 (11:48 +0000)
NEWS
Zend/tests/bug34199.phpt [new file with mode: 0755]
Zend/zend_execute.h
Zend/zend_operators.c

diff --git a/NEWS b/NEWS
index 34d5db8b98c41acfbe729c2b3f55773b84342ba4..9efef9c066f63e14445a0a96d06a5782bd8c1a24 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,8 @@ PHP                                                                        NEWS
   (Dmitry)
 - Fixed bug #34257 (lib64 not handled correctly in ming extension). (Marcus)
 - Fixed bug #34221 (Compiling xmlrpc as shared fails other parts). (Jani)
+- Fixed bug #34199 (if($obj)/if(!$obj) inconsistency because of cast handler).
+  (Dmitry, Alex)
 - Fixed bug #34191 (ob_gzhandler does not enforce trailing \0). (Ilia)
 - Fixed bug #34156 (memory usage remains elevated after memory limit is 
   reached). (Ilia)
diff --git a/Zend/tests/bug34199.phpt b/Zend/tests/bug34199.phpt
new file mode 100755 (executable)
index 0000000..9541eea
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #34199 (if($obj)/if(!$obj) inconsistency because of cast handler)
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--FILE--
+<?php
+$xml = "<root></root>";
+$xml = simplexml_load_string($xml);
+$kids = $xml->children();
+var_dump((bool)$kids);
+if($kids) echo "bug\n"; else echo "ok\n";
+if(!$kids) echo "ok\n"; else echo "bug\n";
+?>
+--EXPECT--
+bool(false)
+ok
+ok
index 98a6b0494911063c7f584ef37908d8e43d82bf5f..9aa0ea4398c4d8c8e18a79c2bb8d3c2726846f42 100644 (file)
@@ -99,6 +99,24 @@ static inline int i_zend_is_true(zval *op)
                case IS_OBJECT:
                        if(IS_ZEND_STD_OBJECT(*op)) {
                                TSRMLS_FETCH();
+
+                               if (Z_OBJ_HT_P(op)->cast_object) {
+                                       zval tmp;
+                                       if (Z_OBJ_HT_P(op)->cast_object(op, &tmp, IS_BOOL, 1 TSRMLS_CC) == SUCCESS) {
+                                               result = Z_LVAL(tmp);
+                                               break;
+                                       }
+                               } else if (Z_OBJ_HT_P(op)->get) {
+                                       zval *tmp = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);
+                                       if(Z_TYPE_P(tmp) != IS_OBJECT) {
+                                               /* for safety - avoid loop */
+                                               convert_to_boolean(tmp);
+                                               result = Z_LVAL_P(tmp);
+                                               zval_ptr_dtor(&tmp);
+                                               break;
+                                       }
+                               }
+                       
                                if(EG(ze1_compatibility_mode)) {
                                        result = (zend_hash_num_elements(Z_OBJPROP_P(op))?1:0);
                                } else {
index 509f9e231581f284285cb2bfdcc9058d6ce4089b..12437019557f1d965790983fb48d39134b6a5876 100644 (file)
@@ -482,7 +482,7 @@ ZEND_API void convert_to_boolean(zval *op)
                                zend_bool retval = 1;
                                TSRMLS_FETCH();
 
-                               convert_object_to_type(op, IS_BOOL, convert_to_double);
+                               convert_object_to_type(op, IS_BOOL, convert_to_boolean);
 
                                if (op->type == IS_BOOL) {
                                        return;