helly           Mon Nov 17 00:25:48 2003 EDT

  Modified files:              
    /spl        spl_array.c 
  Log:
  Fix ArrayClass and provide missing has_dimension handler. 
  
  
Index: spl/spl_array.c
diff -u spl/spl_array.c:1.22 spl/spl_array.c:1.23
--- spl/spl_array.c:1.22        Sun Nov  9 09:05:34 2003
+++ spl/spl_array.c     Mon Nov 17 00:25:47 2003
@@ -106,10 +106,7 @@
        zend_hash_destroy(intern->std.properties);
        FREE_HASHTABLE(intern->std.properties);
 
-       if (!ZVAL_DELREF(intern->array)) {
-               zval_dtor(intern->array);
-               FREE_ZVAL(intern->array);
-       }
+       zval_ptr_dtor(&intern->array);
 
        efree(object);
 }
@@ -275,6 +272,32 @@
 }
 /* }}} */
 
+/* {{{ spl_array_has_dimension */
+static int spl_array_has_dimension(zval *object, zval *offset, int check_empty 
TSRMLS_DC)
+{
+       spl_array_object *intern = 
(spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
+       long index;
+
+       switch(Z_TYPE_P(offset)) {
+       case IS_STRING:
+               return zend_symtable_exists(HASH_OF(intern->array), 
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);
+               }
+               return zend_hash_index_exists(HASH_OF(intern->array), index);
+       default:
+               zend_error(E_WARNING, "Illegal offset type");
+       }
+       return 0;
+}
+/* }}} */
+
 /* {{{ spl_array_get_properties */
 static HashTable *spl_array_get_properties(zval *object TSRMLS_DC)
 {
@@ -299,6 +322,7 @@
        spl_handler_ArrayClass.read_dimension = spl_array_read_dimension;
        spl_handler_ArrayClass.write_dimension = spl_array_write_dimension;
        spl_handler_ArrayClass.unset_dimension = spl_array_unset_dimension;
+       spl_handler_ArrayClass.has_dimension = spl_array_has_dimension;
        spl_handler_ArrayClass.get_properties = spl_array_get_properties;
 
        REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, 
spl_funcs_ArrayIterator);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to