From: Xinchen Hui Date: Fri, 28 Feb 2014 04:59:51 +0000 (+0800) Subject: Move zend_objects_store_put out of zend_object_std_init X-Git-Tag: POST_PHPNG_MERGE~412^2~497 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8ced4f0ac906fd9a28b968801487630326c45bc8;p=php Move zend_objects_store_put out of zend_object_std_init --- diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 46894c6106..00555564a3 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -254,6 +254,7 @@ static zend_object *zend_closure_new(zend_class_entry *class_type TSRMLS_DC) /* zend_object_std_init(&closure->std, class_type TSRMLS_CC); closure->std.handlers = &closure_handlers; + zend_objects_store_put(&closure->std); return (zend_object*)closure; } diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 7bdebf6a7b..b163646970 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -222,6 +222,7 @@ static zend_object *zend_generator_create(zend_class_entry *class_type TSRMLS_DC generator->largest_used_integer_key = -1; zend_object_std_init(&generator->std, class_type TSRMLS_CC); + zend_objects_store_put(&generator->std TSRMLS_CC); generator->std.handlers = &zend_generator_handlers; return (zend_object*)generator; diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 5b6bd5ebb8..25f453a7e5 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -36,7 +36,6 @@ ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSR object->properties = NULL; object->guards = NULL; memset(object->properties_table, 0, sizeof(zval) * ce->default_properties_count); - zend_objects_store_put(object); } ZEND_API void zend_object_std_dtor(zend_object *object TSRMLS_DC) @@ -133,6 +132,7 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce TSRMLS_DC) zend_object *object = emalloc(sizeof(zend_object) + sizeof(zval) * (ce->default_properties_count - 1)); zend_object_std_init(object, ce); + zend_objects_store_put(object); object->handlers = &std_object_handlers; return object; } diff --git a/ext/date/php_date.c b/ext/date/php_date.c index d3426f944c..869d3f659b 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2108,6 +2108,7 @@ static inline zend_object *date_object_new_date_ex(zend_class_entry *class_type zend_object_std_init(&intern->std, class_type TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &date_object_handlers_date; + zend_objects_store_put(&intern->std TSRMLS_CC); return (zend_object*)intern; } @@ -2242,6 +2243,7 @@ static inline zend_object *date_object_new_timezone_ex(zend_class_entry *class_t zend_object_std_init(&intern->std, class_type TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &date_object_handlers_timezone; + zend_objects_store_put(&intern->std TSRMLS_CC); return (zend_object*)intern; } @@ -2333,6 +2335,7 @@ static inline zend_object *date_object_new_interval_ex(zend_class_entry *class_t zend_object_std_init(&intern->std, class_type TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &date_object_handlers_interval; + zend_objects_store_put(&intern->std TSRMLS_CC); return (zend_object*)intern; } @@ -2414,6 +2417,7 @@ static inline zend_object *date_object_new_period_ex(zend_class_entry *class_typ object_properties_init(&intern->std, class_type); //??? date_object_free_storage_period, NULL TSRMLS_CC); intern->std.handlers = &date_object_handlers_period; + zend_objects_store_put(&intern->std TSRMLS_CC); return (zend_object*)intern; } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index e82e13248e..075a642f6d 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -325,6 +325,7 @@ static zend_object *reflection_objects_new(zend_class_entry *class_type TSRMLS_D intern->zo.ce = class_type; zend_object_std_init(&intern->zo, class_type TSRMLS_CC); + zend_objects_store_put(&intern->zo TSRMLS_CC); object_properties_init(&intern->zo, class_type); intern->zo.handlers = &reflection_object_handlers; return (zend_object*)intern; diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 9244231222..b9cba542e1 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -180,6 +180,7 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zval * memset(intern, 0, sizeof(spl_array_object)); zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->ar_flags = 0; diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 19edadd1bf..957068d9f5 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -157,6 +157,7 @@ static zend_object *spl_filesystem_object_new_ex(zend_class_entry *class_type TS intern->info_class = spl_ce_SplFileInfo; zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &spl_filesystem_object_handlers; diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index b00df3eb0d..c8e7e7cb9d 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -375,6 +375,7 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zval intern = ecalloc(1, sizeof(spl_dllist_object)); zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->flags = 0; diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 758eec3e16..3e99cdaa85 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -217,6 +217,7 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z intern = ecalloc(1, sizeof(spl_fixedarray_object)); zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->current = 0; diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index f74b1d4a10..7d69358b44 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -384,6 +384,7 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zval *o intern = ecalloc(1, sizeof(spl_heap_object)); zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->flags = 0; diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index f4575d8350..f7629c4614 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -905,6 +905,7 @@ static zend_object *spl_RecursiveIteratorIterator_new_ex(zend_class_entry *class } zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &spl_handlers_rec_it_it; @@ -1282,14 +1283,14 @@ static union _zend_function *spl_dual_it_get_method(zval *object_ptr, zend_strin function_handler = std_object_handlers.get_method(object_ptr, method, key TSRMLS_CC); if (!function_handler && intern->inner.ce) { if ((function_handler = zend_hash_find_ptr(&intern->inner.ce->function_table, method)) == NULL) { - if (Z_OBJ_HT_P(intern->inner.zobject)->get_method) { + if (Z_OBJ_HT(intern->inner.zobject)->get_method) { //!!! maybe we really need a zval ** here? //*object_ptr = &intern->inner.zobject? - object_ptr = intern->inner.zobject; + object_ptr = &intern->inner.zobject; function_handler = Z_OBJ_HT_P(object_ptr)->get_method(object_ptr, method, key TSRMLS_CC); } } else { - object_ptr = intern->inner.zobject; + object_ptr = &intern->inner.zobject; } } return function_handler; @@ -1519,11 +1520,11 @@ static spl_dual_it_object* spl_dual_it_construct(INTERNAL_FUNCTION_PARAMETERS, z zend_restore_error_handling(&error_handling TSRMLS_CC); if (inc_refcount) { - Z_ADDREF_P(zobject); + ZVAL_COPY(&intern->inner.zobject, zobject); + } else { + ZVAL_COPY_VALUE(&intern->inner.zobject, zobject); } - intern->inner.zobject = zobject; intern->inner.ce = dit_type == DIT_IteratorIterator ? ce : Z_OBJCE_P(zobject); - intern->inner.object = Z_OBJ_P(zobject); intern->inner.iterator = intern->inner.ce->get_iterator(intern->inner.ce, zobject, 0 TSRMLS_CC); return intern; @@ -1558,8 +1559,8 @@ SPL_METHOD(dual_it, getInnerIterator) SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); - if (intern->inner.zobject) { - RETVAL_ZVAL(intern->inner.zobject, 1, 0); + if (!ZVAL_IS_UNDEF(&intern->inner.zobject)) { + RETVAL_ZVAL(&intern->inner.zobject, 1, 0); } else { RETURN_NULL(); } @@ -1843,7 +1844,7 @@ SPL_METHOD(RecursiveFilterIterator, hasChildren) SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval); if (Z_TYPE(retval) != IS_UNDEF) { RETURN_ZVAL(&retval, 0, 1); } else { @@ -1864,7 +1865,7 @@ SPL_METHOD(RecursiveFilterIterator, getChildren) SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); if (!EG(exception) && Z_TYPE(retval) != IS_UNDEF) { spl_instantiate_arg_ex1(Z_OBJCE_P(getThis()), return_value, &retval TSRMLS_CC); } @@ -1884,7 +1885,7 @@ SPL_METHOD(RecursiveCallbackFilterIterator, getChildren) intern = (spl_dual_it_object*)Z_OBJ_P(getThis()); - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); if (!EG(exception) && Z_TYPE(retval) != IS_UNDEF) { spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &retval, &intern->u.cbfilter->fci.function_name TSRMLS_CC); } @@ -1925,7 +1926,7 @@ SPL_METHOD(CallbackFilterIterator, accept) ZVAL_COPY_VALUE(¶ms[0], &intern->current.data); ZVAL_COPY_VALUE(¶ms[1], &intern->current.key); - ZVAL_COPY_VALUE(¶ms[2], intern->inner.zobject); + ZVAL_COPY_VALUE(¶ms[2], &intern->inner.zobject); fci->retval = &result; fci->param_count = 3; @@ -2181,7 +2182,7 @@ SPL_METHOD(RecursiveRegexIterator, getChildren) SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); if (!EG(exception)) { ZVAL_STR(®ex, STR_COPY(intern->u.regex.regex)); spl_instantiate_arg_ex2(Z_OBJCE_P(getThis()), return_value, &retval, ®ex TSRMLS_CC); @@ -2195,7 +2196,7 @@ SPL_METHOD(RecursiveRegexIterator, getChildren) /* {{{ spl_dual_it_dtor */ static void spl_dual_it_dtor(zend_object *_object TSRMLS_DC) { - spl_dual_it_object *object = (spl_dual_it_object *)_object; + spl_dual_it_object *object = (spl_dual_it_object *)_object; /* call standard dtor */ zend_objects_destroy_object(_object TSRMLS_CC); @@ -2211,11 +2212,11 @@ static void spl_dual_it_dtor(zend_object *_object TSRMLS_DC) /* {{{ spl_dual_it_free_storage */ static void spl_dual_it_free_storage(zend_object *_object TSRMLS_DC) { - spl_dual_it_object *object = (spl_dual_it_object *)_object; + spl_dual_it_object *object = (spl_dual_it_object *)_object; - if (object->inner.zobject) { - zval_ptr_dtor(object->inner.zobject); + if (!ZVAL_IS_UNDEF(&object->inner.zobject)) { + zval_ptr_dtor(&object->inner.zobject); } if (object->dit_type == DIT_AppendIterator) { @@ -2228,7 +2229,6 @@ static void spl_dual_it_free_storage(zend_object *_object TSRMLS_DC) if (object->dit_type == DIT_CachingIterator || object->dit_type == DIT_RecursiveCachingIterator) { if (Z_TYPE(object->u.caching.zcache) != IS_UNDEF) { zval_ptr_dtor(&object->u.caching.zcache); - ZVAL_UNDEF(&object->u.caching.zcache); } } @@ -2269,6 +2269,7 @@ static zend_object *spl_dual_it_new(zend_class_entry *class_type TSRMLS_DC) intern->dit_type = DIT_Unknown; zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); intern->std.handlers = &spl_handlers_dual_it; @@ -2408,7 +2409,7 @@ static inline void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS if (pos != intern->current.pos && instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) { ZVAL_LONG(&zpos, pos); spl_dual_it_free(intern TSRMLS_CC); - zend_call_method_with_1_params(intern->inner.zobject, intern->inner.ce, NULL, "seek", NULL, &zpos); + zend_call_method_with_1_params(&intern->inner.zobject, intern->inner.ce, NULL, "seek", NULL, &zpos); zval_ptr_dtor(&zpos); if (!EG(exception)) { intern->current.pos = pos; @@ -2560,7 +2561,7 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC) /* Recursion ? */ if (intern->dit_type == DIT_RecursiveCachingIterator) { zval retval, zchildren, zflags; - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "haschildren", &retval); if (EG(exception)) { zval_ptr_dtor(&retval); if (intern->u.caching.flags & CIT_CATCH_GET_CHILD) { @@ -2570,7 +2571,7 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC) } } else { if (zend_is_true(&retval TSRMLS_CC)) { - zend_call_method_with_0_params(intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &zchildren); + zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &zchildren); if (EG(exception)) { zval_ptr_dtor(&zchildren); if (intern->u.caching.flags & CIT_CATCH_GET_CHILD) { @@ -2599,7 +2600,7 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC) int use_copy; zval expr_copy; if (intern->u.caching.flags & CIT_TOSTRING_USE_INNER) { - ZVAL_COPY_VALUE(&intern->u.caching.zstr, intern->inner.zobject); + ZVAL_COPY_VALUE(&intern->u.caching.zstr, &intern->inner.zobject); } else { ZVAL_COPY_VALUE(&intern->u.caching.zstr, &intern->current.data); } @@ -3217,11 +3218,10 @@ int spl_append_it_next_iterator(spl_dual_it_object *intern TSRMLS_DC) /* {{{*/ { spl_dual_it_free(intern TSRMLS_CC); - if (intern->inner.zobject) { - zval_ptr_dtor(intern->inner.zobject); - intern->inner.zobject = NULL; + if (!ZVAL_IS_UNDEF(&intern->inner.zobject)) { + zval_ptr_dtor(&intern->inner.zobject); + ZVAL_UNDEF(&intern->inner.zobject); intern->inner.ce = NULL; - intern->inner.object = NULL; if (intern->inner.iterator) { intern->inner.iterator->funcs->dtor(intern->inner.iterator TSRMLS_CC); intern->inner.iterator = NULL; @@ -3231,10 +3231,8 @@ int spl_append_it_next_iterator(spl_dual_it_object *intern TSRMLS_DC) /* {{{*/ zval *it; it = intern->u.append.iterator->funcs->get_current_data(intern->u.append.iterator TSRMLS_CC); - Z_ADDREF_P(it); - intern->inner.zobject = it; + ZVAL_COPY(&intern->inner.zobject, it); intern->inner.ce = Z_OBJCE_P(it); - intern->inner.object = Z_OBJ_P(it); intern->inner.iterator = intern->inner.ce->get_iterator(intern->inner.ce, it, 0 TSRMLS_CC); spl_dual_it_rewind(intern TSRMLS_CC); return SUCCESS; @@ -3289,7 +3287,7 @@ SPL_METHOD(AppendIterator, append) } do { spl_append_it_next_iterator(intern TSRMLS_CC); - } while (intern->inner.zobject != it); + } while (&intern->inner.zobject != it); spl_append_it_fetch(intern TSRMLS_CC); } } /* }}} */ diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index 1da5b85181..9c5b3e3b5d 100644 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -126,9 +126,8 @@ typedef struct _spl_cbfilter_it_intern { typedef struct _spl_dual_it_object { zend_object std; struct { - zval *zobject; + zval zobject; zend_class_entry *ce; - zend_object *object; zend_object_iterator *iterator; } inner; struct { diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 19037323ec..098f250d4e 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -249,6 +249,7 @@ static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zval intern->pos = INVALID_IDX; zend_object_std_init(&intern->std, class_type TSRMLS_CC); + zend_objects_store_put(&intern->std TSRMLS_CC); object_properties_init(&intern->std, class_type); zend_hash_init(&intern->storage, 0, NULL, spl_object_storage_dtor, 0);