version 1.1, 2012/02/21 23:47:52
|
version 1.1.1.3, 2013/07/22 01:32:16
|
Line 2
|
Line 2
|
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Zend Engine | |
| Zend Engine | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) | | | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| This source file is subject to version 2.00 of the Zend license, | |
| This source file is subject to version 2.00 of the Zend license, | |
| that is bundled with this package in the file LICENSE, and is | |
| that is bundled with this package in the file LICENSE, and is | |
Line 28
|
Line 28
|
|
|
ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) |
ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) |
{ |
{ |
ALLOC_HASHTABLE(object->properties); | object->ce = ce; |
zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); | object->properties = NULL; |
| object->properties_table = NULL; |
object->ce = ce; | |
object->guards = NULL; |
object->guards = NULL; |
} |
} |
|
|
Line 39 ZEND_API void zend_object_std_dtor(zend_object *object
|
Line 38 ZEND_API void zend_object_std_dtor(zend_object *object
|
{ |
{ |
if (object->guards) { |
if (object->guards) { |
zend_hash_destroy(object->guards); |
zend_hash_destroy(object->guards); |
FREE_HASHTABLE(object->guards); | FREE_HASHTABLE(object->guards); |
} |
} |
if (object->properties) { |
if (object->properties) { |
zend_hash_destroy(object->properties); |
zend_hash_destroy(object->properties); |
FREE_HASHTABLE(object->properties); |
FREE_HASHTABLE(object->properties); |
|
if (object->properties_table) { |
|
efree(object->properties_table); |
|
} |
|
} else if (object->properties_table) { |
|
int i; |
|
|
|
for (i = 0; i < object->ce->default_properties_count; i++) { |
|
if (object->properties_table[i]) { |
|
zval_ptr_dtor(&object->properties_table[i]); |
|
} |
|
} |
|
efree(object->properties_table); |
} |
} |
} |
} |
|
|
Line 63 ZEND_API void zend_objects_destroy_object(zend_object
|
Line 74 ZEND_API void zend_objects_destroy_object(zend_object
|
if (object->ce != EG(scope)) { |
if (object->ce != EG(scope)) { |
zend_class_entry *ce = object->ce; |
zend_class_entry *ce = object->ce; |
|
|
zend_error(EG(in_execution) ? E_ERROR : E_WARNING, | zend_error(EG(in_execution) ? E_ERROR : E_WARNING, |
"Call to private %s::__destruct() from context '%s'%s", | "Call to private %s::__destruct() from context '%s'%s", |
ce->name, | ce->name, |
EG(scope) ? EG(scope)->name : "", | EG(scope) ? EG(scope)->name : "", |
EG(in_execution) ? "" : " during shutdown ignored"); |
EG(in_execution) ? "" : " during shutdown ignored"); |
return; |
return; |
} |
} |
} else { |
} else { |
/* Ensure that if we're calling a protected function, we're allowed to do so. |
/* Ensure that if we're calling a protected function, we're allowed to do so. |
*/ |
*/ |
if (!zend_check_protected(destructor->common.scope, EG(scope))) { | if (!zend_check_protected(zend_get_function_root_class(destructor), EG(scope))) { |
zend_class_entry *ce = object->ce; |
zend_class_entry *ce = object->ce; |
|
|
zend_error(EG(in_execution) ? E_ERROR : E_WARNING, | zend_error(EG(in_execution) ? E_ERROR : E_WARNING, |
"Call to protected %s::__destruct() from context '%s'%s", | "Call to protected %s::__destruct() from context '%s'%s", |
ce->name, | ce->name, |
EG(scope) ? EG(scope)->name : "", | EG(scope) ? EG(scope)->name : "", |
EG(in_execution) ? "" : " during shutdown ignored"); |
EG(in_execution) ? "" : " during shutdown ignored"); |
return; |
return; |
} |
} |
Line 128 ZEND_API void zend_objects_free_object_storage(zend_ob
|
Line 139 ZEND_API void zend_objects_free_object_storage(zend_ob
|
} |
} |
|
|
ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type TSRMLS_DC) |
ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type TSRMLS_DC) |
{ | { |
zend_object_value retval; |
zend_object_value retval; |
|
|
*object = emalloc(sizeof(zend_object)); |
*object = emalloc(sizeof(zend_object)); |
(*object)->ce = class_type; |
(*object)->ce = class_type; |
|
(*object)->properties = NULL; |
|
(*object)->properties_table = NULL; |
|
(*object)->guards = NULL; |
retval.handle = zend_objects_store_put(*object, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) zend_objects_free_object_storage, NULL TSRMLS_CC); |
retval.handle = zend_objects_store_put(*object, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) zend_objects_free_object_storage, NULL TSRMLS_CC); |
retval.handlers = &std_object_handlers; |
retval.handlers = &std_object_handlers; |
(*object)->guards = NULL; |
|
return retval; |
return retval; |
} |
} |
|
|
Line 146 ZEND_API zend_object *zend_objects_get_address(const z
|
Line 159 ZEND_API zend_object *zend_objects_get_address(const z
|
|
|
ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object_value new_obj_val, zend_object *old_object, zend_object_handle handle TSRMLS_DC) |
ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object_value new_obj_val, zend_object *old_object, zend_object_handle handle TSRMLS_DC) |
{ |
{ |
zend_hash_copy(new_object->properties, old_object->properties, zval_copy_property_ctor(old_object->ce), (void *) NULL /* Not used anymore */, sizeof(zval *)); | int i; |
|
|
|
if (old_object->properties_table) { |
|
if (!new_object->properties_table) { |
|
new_object->properties_table = emalloc(sizeof(zval*) * old_object->ce->default_properties_count); |
|
memset(new_object->properties_table, 0, sizeof(zval*) * old_object->ce->default_properties_count); |
|
} |
|
for (i = 0; i < old_object->ce->default_properties_count; i++) { |
|
if (!new_object->properties) { |
|
if (new_object->properties_table[i]) { |
|
zval_ptr_dtor(&new_object->properties_table[i]); |
|
} |
|
} |
|
if (!old_object->properties) { |
|
new_object->properties_table[i] = old_object->properties_table[i]; |
|
if (new_object->properties_table[i]) { |
|
Z_ADDREF_P(new_object->properties_table[i]); |
|
} |
|
} |
|
} |
|
} |
|
if (old_object->properties) { |
|
if (!new_object->properties) { |
|
ALLOC_HASHTABLE(new_object->properties); |
|
zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); |
|
} |
|
zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *)); |
|
if (old_object->properties_table) { |
|
HashPosition pos; |
|
zend_property_info *prop_info; |
|
for (zend_hash_internal_pointer_reset_ex(&old_object->ce->properties_info, &pos); |
|
zend_hash_get_current_data_ex(&old_object->ce->properties_info, (void**)&prop_info, &pos) == SUCCESS; |
|
zend_hash_move_forward_ex(&old_object->ce->properties_info, &pos)) { |
|
if ((prop_info->flags & ZEND_ACC_STATIC) == 0) { |
|
if (zend_hash_quick_find(new_object->properties, prop_info->name, prop_info->name_length+1, prop_info->h, (void**)&new_object->properties_table[prop_info->offset]) == FAILURE) { |
|
new_object->properties_table[prop_info->offset] = NULL; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
if (old_object->ce->clone) { |
if (old_object->ce->clone) { |
zval *new_obj; |
zval *new_obj; |
|
|
Line 169 ZEND_API zend_object_value zend_objects_clone_obj(zval
|
Line 222 ZEND_API zend_object_value zend_objects_clone_obj(zval
|
zend_object *new_object; |
zend_object *new_object; |
zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); |
zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); |
|
|
/* assume that create isn't overwritten, so when clone depends on the | /* assume that create isn't overwritten, so when clone depends on the |
* overwritten one then it must itself be overwritten */ |
* overwritten one then it must itself be overwritten */ |
old_object = zend_objects_get_address(zobject TSRMLS_CC); |
old_object = zend_objects_get_address(zobject TSRMLS_CC); |
new_obj_val = zend_objects_new(&new_object, old_object->ce TSRMLS_CC); |
new_obj_val = zend_objects_new(&new_object, old_object->ce TSRMLS_CC); |
|
|
ALLOC_HASHTABLE(new_object->properties); |
|
zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); |
|
|
|
zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC); |
zend_objects_clone_members(new_object, new_obj_val, old_object, handle TSRMLS_CC); |
|
|