Hello guys,

  the attached patch closes one more __toString() part. It allows
to use objects that define __toString as indexes to arrays. What do
you guys think about this, should we add it or stay with the old
behavior that didn't allow objects as indexes at all.

-- 
Best regards,
 Marcus                          mailto:[EMAIL PROTECTED]
Index: Zend/zend_execute.c
===================================================================
RCS file: /repository/ZendEngine2/zend_execute.c,v
retrieving revision 1.746
diff -u -p -d -r1.746 zend_execute.c
--- Zend/zend_execute.c 1 Jun 2006 11:56:23 -0000       1.746
+++ Zend/zend_execute.c 3 Jun 2006 11:37:17 -0000
@@ -919,11 +919,11 @@ static inline HashTable *zend_get_target
 
 static inline zval **zend_fetch_dimension_address_inner(HashTable *ht, zval 
*dim, int type TSRMLS_DC)
 {
-       zval **retval;
+       zval **retval, dim_copy;
        zstr offset_key;
        int offset_key_length;
        zend_uchar ztype = Z_TYPE_P(dim);
-       int free_offset = 0;
+       int free_offset = 0, use_copy = 0;
 
        switch (ztype) {
                case IS_NULL:
@@ -931,6 +931,15 @@ static inline zval **zend_fetch_dimensio
                        offset_key.s = "";
                        offset_key_length = 1;
                        goto fetch_string_dim;
+
+               case IS_OBJECT:
+                       zend_make_printable_zval(dim, &dim_copy, &use_copy 
TSRMLS_CC);
+                       if (use_copy) {
+                               dim = &dim_copy;
+                       }
+                       ztype = Z_TYPE_P(dim);
+                       /* no break */
+
                case IS_STRING:
                case IS_UNICODE:
 
@@ -975,6 +984,9 @@ fetch_string_dim:
                        if (free_offset) {
                                efree(offset_key.v);
                        }
+                       if (use_copy) {
+                               zval_dtor(&dim_copy);
+                       }
                        break;
                case IS_RESOURCE:
                        zend_error(E_STRICT, "Resource ID#%ld used as offset, 
casting to integer (%ld)", Z_LVAL_P(dim), Z_LVAL_P(dim));
Index: Zend/tests/offset_object_tostring.phpt
===================================================================
RCS file: Zend/tests/offset_object_tostring.phpt
diff -N Zend/tests/offset_object_tostring.phpt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ Zend/tests/offset_object_tostring.phpt      3 Jun 2006 11:37:17 -0000
@@ -0,0 +1,51 @@
+--TEST--
+accessing array dimension via object's __tostring
+--FILE--
+<?php
+
+function my_error_handler($code, $msg)
+{
+       echo "$msg\n";
+}
+
+set_error_handler('my_error_handler');
+
+class Test
+{
+       function __toString()
+       {
+               return 'foo';
+       }
+}
+
+class Fail
+{
+       function __toString()
+       {
+               throw new Exception(__METHOD__);
+       }
+}
+
+$arr = array(0 => 42, 'foo' => 'bar');
+
+var_dump($arr[new Test]);
+
+var_dump($arr[new stdClass]);
+
+var_dump($arr[new Fail]);
+?>
+===DONE===
+--EXPECTF--    
+string(3) "bar"
+Object of class stdClass could not be converted to string
+Undefined index:  
+NULL
+
+Fatal error: Method Fail::__toString() must not throw an exception in 
%soffset_object_tostring.php on line %d
+--UEXPECTF--   
+unicode(3) "bar"
+Object of class stdClass could not be converted to string
+Undefined index:  
+NULL
+
+Fatal error: Method Fail::__toString() must not throw an exception in 
%soffset_object_tostring.php on line %d
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to