Hello Andrei, thanks for the info. I'll see where the effect comes from then.
best regards marcus Saturday, December 16, 2006, 8:10:55 PM, you wrote: > The only thing added to serializer was the 'S' format. The 'u' format > has been there for a while. > -Andrei > On Dec 16, 2006, at 5:55 AM, Marcus Boerger wrote: >> helly Sat Dec 16 13:55:14 2006 UTC >> >> Added files: >> /php-src/ext/spl/tests observer_003.phpt >> >> Modified files: >> /php-src/ext/spl spl_observer.c >> Log: >> - Implement feature request #39836i (SplObjectStorage empty after >> unserialize) >> # Unicode mode currently does not work...looks like funny changes >> in the >> # unserializer. >> >> >> http://cvs.php.net/viewvc.cgi/php-src/ext/spl/spl_observer.c? >> r1=1.10&r2=1.11&diff_format=u >> Index: php-src/ext/spl/spl_observer.c >> diff -u php-src/ext/spl/spl_observer.c:1.10 php-src/ext/spl/ >> spl_observer.c:1.11 >> --- php-src/ext/spl/spl_observer.c:1.10 Wed Aug 23 09:31:41 2006 >> +++ php-src/ext/spl/spl_observer.c Sat Dec 16 13:55:14 2006 >> @@ -16,7 +16,7 @@ >> >> +--------------------------------------------------------------------- >> -+ >> */ >> >> -/* $Id: spl_observer.c,v 1.10 2006/08/23 09:31:41 bjori Exp $ */ >> +/* $Id: spl_observer.c,v 1.11 2006/12/16 13:55:14 helly Exp $ */ >> >> #ifdef HAVE_CONFIG_H >> # include "config.h" >> @@ -25,6 +25,8 @@ >> #include "php.h" >> #include "php_ini.h" >> #include "ext/standard/info.h" >> +#include "ext/standard/php_var.h" >> +#include "ext/standard/php_smart_str.h" >> #include "zend_interfaces.h" >> #include "zend_exceptions.h" >> >> @@ -34,6 +36,7 @@ >> #include "spl_observer.h" >> #include "spl_iterators.h" >> #include "spl_array.h" >> +#include "spl_exceptions.h" >> >> SPL_METHOD(SplObserver, update); >> SPL_METHOD(SplSubject, attach); >> @@ -121,18 +124,8 @@ >> } >> /* }}} */ >> >> -/* {{{ proto void SplObjectStorage::attach($obj) >> - Attaches an object to the storage if not yet contained */ >> -SPL_METHOD(SplObjectStorage, attach) >> +void spl_object_storage_attach(spl_SplObjectStorage *intern, zval >> *obj TSRMLS_DC) /* {{{ */ >> { >> - zval *obj; >> - >> - spl_SplObjectStorage *intern = (spl_SplObjectStorage*) >> zend_object_store_get_object(getThis() TSRMLS_CC); >> - >> - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) >> == FAILURE) { >> - return; >> - } >> - >> #if HAVE_PACKED_OBJECT_VALUE >> zend_hash_update(&intern->storage, (char*)&Z_OBJVAL_P(obj), sizeof >> (zend_object_value), &obj, sizeof(zval*), NULL); >> #else >> @@ -148,6 +141,20 @@ >> obj->refcount++; >> } /* }}} */ >> >> +/* {{{ proto void SplObjectStorage::attach($obj) >> + Attaches an object to the storage if not yet contained */ >> +SPL_METHOD(SplObjectStorage, attach) >> +{ >> + zval *obj; >> + >> + spl_SplObjectStorage *intern = (spl_SplObjectStorage*) >> zend_object_store_get_object(getThis() TSRMLS_CC); >> + >> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) >> == FAILURE) { >> + return; >> + } >> + spl_object_storage_attach(intern, obj TSRMLS_CC); >> +} /* }}} */ >> + >> /* {{{ proto void SplObjectStorage::detach($obj) >> Detaches an object from the storage */ >> SPL_METHOD(SplObjectStorage, detach) >> @@ -259,11 +266,117 @@ >> intern->index++; >> } /* }}} */ >> >> +/* {{{ proto string SplObjectStorage::serialize() >> + */ >> +SPL_METHOD(SplObjectStorage, serialize) >> +{ >> + spl_SplObjectStorage *intern = (spl_SplObjectStorage*) >> zend_object_store_get_object(getThis() TSRMLS_CC); >> + >> + zval **entry; >> + HashPosition pos; >> + php_serialize_data_t var_hash; >> + smart_str buf = {0}; >> + long index = 0; >> + >> + PHP_VAR_SERIALIZE_INIT(var_hash); >> + >> + smart_str_appendl(&buf, "a:", 2); >> + smart_str_append_long(&buf, zend_hash_num_elements(&intern- >> >storage)); >> + smart_str_appendl(&buf, ":{", 2); >> + >> + zend_hash_internal_pointer_reset_ex(&intern->storage, &pos); >> + >> + while(zend_hash_has_more_elements_ex(&intern->storage, &pos) == >> SUCCESS) { >> + smart_str_appendl(&buf, "i:", 2); >> + smart_str_append_long(&buf, index++); >> + smart_str_appendc(&buf, ';'); >> + if (zend_hash_get_current_data_ex(&intern->storage, (void**) >> &entry, &pos) == FAILURE) { >> + smart_str_free(&buf); >> + PHP_VAR_SERIALIZE_DESTROY(var_hash); >> + RETURN_FALSE; >> + } >> + php_var_serialize(&buf, entry, &var_hash TSRMLS_CC); >> + zend_hash_move_forward_ex(&intern->storage, &pos); >> + } >> + >> + smart_str_appendc(&buf, '}'); >> + smart_str_0(&buf); >> + PHP_VAR_SERIALIZE_DESTROY(var_hash); >> + >> + if (buf.c) { >> + RETURN_STRINGL(buf.c, buf.len, 0); >> + } else { >> + RETURN_NULL(); >> + } >> + >> +} /* }}} */ >> + >> +/* {{{ proto void SplObjectStorage::unserialize(string unserialized) >> + */ >> +SPL_METHOD(SplObjectStorage, unserialize) >> +{ >> + spl_SplObjectStorage *intern = (spl_SplObjectStorage*) >> zend_object_store_get_object(getThis() TSRMLS_CC); >> + >> + char *buf; >> + int buf_len; >> + const unsigned char *p; >> + php_unserialize_data_t var_hash; >> + zval *zentries, **entry; >> + HashPosition pos; >> + >> + ALLOC_INIT_ZVAL(zentries); >> + >> + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, >> &buf_len) == FAILURE) { >> + return; >> + } >> + >> + if (buf_len == 0) { >> + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 >> TSRMLS_CC, "Empty serialized string cannot be empty"); >> + return; >> + } >> + >> + p = (const unsigned char*)buf; >> + PHP_VAR_UNSERIALIZE_INIT(var_hash); >> + if (!php_var_unserialize(&zentries, &p, p + buf_len, &var_hash >> TSRMLS_CC)) { >> + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); >> + zval_ptr_dtor(&zentries); >> + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 >> TSRMLS_CC, "Error at offset %ld of %d bytes", (long)((char*)p - >> buf), buf_len); >> + return; >> + } >> + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); >> + >> + /* move from temp array to storage */ >> + >> + if (Z_TYPE_P(zentries) != IS_ARRAY) { >> + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 >> TSRMLS_CC, "Serialize string must contain a single array"); >> + return; >> + } >> + >> + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(zentries), &pos); >> + >> + while(zend_hash_has_more_elements_ex(Z_ARRVAL_P(zentries), &pos) >> == SUCCESS) { >> + if (zend_hash_get_current_data_ex(Z_ARRVAL_P(zentries), >> (void**) >> &entry, &pos) == FAILURE || Z_TYPE_PP(entry) != IS_OBJECT) { >> + >> zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 >> TSRMLS_CC, "Serialize string must only contain objects"); >> + zval_ptr_dtor(&zentries); >> + return; >> + } >> + spl_object_storage_attach(intern, *entry TSRMLS_CC); >> + zend_hash_move_forward_ex(Z_ARRVAL_P(zentries), &pos); >> + } >> + >> + zval_ptr_dtor(&zentries); >> +} /* }}} */ >> + >> static >> ZEND_BEGIN_ARG_INFO(arginfo_Object, 0) >> ZEND_ARG_INFO(0, object) >> ZEND_END_ARG_INFO(); >> >> +static >> +ZEND_BEGIN_ARG_INFO(arginfo_Serialized, 0) >> + ZEND_ARG_INFO(0, serialized) >> +ZEND_END_ARG_INFO(); >> + >> static zend_function_entry spl_funcs_SplObjectStorage[] = { >> SPL_ME(SplObjectStorage, attach, arginfo_Object, 0) >> SPL_ME(SplObjectStorage, detach, arginfo_Object, 0) >> @@ -274,6 +387,8 @@ >> SPL_ME(SplObjectStorage, key, NULL, 0) >> SPL_ME(SplObjectStorage, current, NULL, 0) >> SPL_ME(SplObjectStorage, next, NULL, 0) >> + SPL_ME(SplObjectStorage, unserialize, arginfo_Serialized, 0) >> + SPL_ME(SplObjectStorage, serialize, NULL, 0) >> {NULL, NULL, NULL} >> }; >> >> @@ -288,7 +403,8 @@ >> >> REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Countable); >> REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Iterator); >> - >> + REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Serializable); >> + >> return SUCCESS; >> } >> /* }}} */ >> >> http://cvs.php.net/viewvc.cgi/php-src/ext/spl/tests/ >> observer_003.phpt?view=markup&rev=1.1 >> Index: php-src/ext/spl/tests/observer_003.phpt >> +++ php-src/ext/spl/tests/observer_003.phpt >> --TEST-- >> SPL: SplObjectStorage serialization >> --SKIPIF-- >> <?php if (!extension_loaded("spl")) print "skip"; ?> >> --FILE-- >> <?php >> >> class TestClass >> { >> public $test = 25; >> >> public function __construct($test = 42) >> { >> $this->test = $test; >> } >> } >> >> $storage = new SplObjectStorage(); >> >> foreach(array(1,"2","foo",true) as $value) >> { >> $storage->attach(new TestClass($value)); >> } >> >> var_dump(count($storage)); >> >> foreach($storage as $object) >> { >> var_dump($object->test); >> } >> >> echo "===UNSERIALIZE===\n"; >> >> $storage2 = unserialize(serialize($storage)); >> >> var_dump(count($storage2)); >> >> foreach($storage2 as $object) >> { >> var_dump($object->test); >> } >> >> ?> >> ===DONE=== >> <?php exit(0); ?> >> --EXPECT-- >> int(4) >> int(1) >> string(1) "2" >> string(3) "foo" >> bool(true) >> ===UNSERIALIZE=== >> int(4) >> int(1) >> string(1) "2" >> string(3) "foo" >> bool(true) >> ===DONE=== >> >> -- >> PHP CVS Mailing List (http://www.php.net/) >> To unsubscribe, visit: http://www.php.net/unsub.php Best regards, Marcus -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
