]> granicus.if.org Git - php/commitdiff
Fixed bug #61347 (inconsist isset behavior of Arrayobject)
authorXinchen Hui <laruence@php.net>
Sun, 11 Mar 2012 08:27:55 +0000 (08:27 +0000)
committerXinchen Hui <laruence@php.net>
Sun, 11 Mar 2012 08:27:55 +0000 (08:27 +0000)
ext/spl/spl_array.c
ext/spl/tests/bug61347.phpt [new file with mode: 0644]

index 5bbc41d9bb1c7c738687e9244679f86e68bfb894..811a30b3d463e600b4c9e13027254044d87f598e 100755 (executable)
@@ -601,49 +601,46 @@ static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *o
        }
        
        switch(Z_TYPE_P(offset)) {
-       case IS_STRING:
-               if (check_empty) {
-                       if (zend_symtable_find(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **) &tmp) != FAILURE) {
-                               switch (check_empty) {
-                                       case 0:
-                                               return Z_TYPE_PP(tmp) != IS_NULL;
-                                       case 2:
-                                               return 1;
-                                       default:
-                                               return zend_is_true(*tmp);
+               case IS_STRING:
+                       {
+                               HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
+                               if (zend_symtable_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **) &tmp) != FAILURE) {
+                                       switch (check_empty) {
+                                               case 0:
+                                                       return Z_TYPE_PP(tmp) != IS_NULL;
+                                               case 2:
+                                                       return 1;
+                                               default:
+                                                       return zend_is_true(*tmp);
+                                       }
                                }
                        }
                        return 0;
-               } else {
-                       return zend_symtable_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
-               }
-       case IS_DOUBLE:
-       case IS_RESOURCE:
-       case IS_BOOL: 
-       case IS_LONG: 
-               if (offset->type == IS_DOUBLE) {
-                       index = (long)Z_DVAL_P(offset);
-               } else {
-                       index = Z_LVAL_P(offset);
-               }
-               if (check_empty) {
-                       HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
-                       if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE) {
-                               switch (check_empty) {
-                                       case 0:
-                                               return Z_TYPE_PP(tmp) != IS_NULL;
-                                       case 2:
-                                               return 1;
-                                       default:
-                                               return zend_is_true(*tmp);
+               case IS_DOUBLE:
+               case IS_RESOURCE:
+               case IS_BOOL: 
+               case IS_LONG:
+                       {       
+                               HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
+                               if (offset->type == IS_DOUBLE) {
+                                       index = (long)Z_DVAL_P(offset);
+                               } else {
+                                       index = Z_LVAL_P(offset);
+                               }
+                               if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE) {
+                                       switch (check_empty) {
+                                               case 0:
+                                                       return Z_TYPE_PP(tmp) != IS_NULL;
+                                               case 2:
+                                                       return 1;
+                                               default:
+                                                       return zend_is_true(*tmp);
+                                       }
                                }
+                               return 0;
                        }
-                       return 0;
-               } else {
-                       return zend_hash_index_exists(spl_array_get_hash_table(intern, 0 TSRMLS_CC), index);
-               }
-       default:
-               zend_error(E_WARNING, "Illegal offset type");
+               default:
+                       zend_error(E_WARNING, "Illegal offset type");
        }
        return 0;
 } /* }}} */
diff --git a/ext/spl/tests/bug61347.phpt b/ext/spl/tests/bug61347.phpt
new file mode 100644 (file)
index 0000000..cb09185
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Bug #61347 (inconsist isset behavior of Arrayobject)
+--FILE--
+<?php
+$a = array('b' => NULL, 37 => NULL);
+var_dump(isset($a['b'])); //false
+
+$b = new ArrayObject($a);
+var_dump(isset($b['b'])); //false
+var_dump(isset($b[37])); //false
+var_dump(isset($b['no_exists'])); //false
+var_dump(empty($b['b'])); //true
+var_dump(empty($b[37])); //true
+
+var_dump(array_key_exists('b', $b)); //true
+var_dump($b['b']);
+
+$a = array('b' => '', 37 => false);
+$b = new ArrayObject($a);
+var_dump(isset($b['b'])); //true
+var_dump(isset($b[37])); //true
+var_dump(isset($b['no_exists'])); //false
+var_dump(empty($b['b'])); //true
+var_dump(empty($b[37])); //true
+
+
+--EXPECT--
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+NULL
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)