summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 85cf32e32c..ea333632be 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3548,7 +3548,13 @@ ZEND_API const char *zend_get_module_version(const char *module_name) /* {{{ */
ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment TSRMLS_DC) /* {{{ */
{
- zend_property_info property_info, *property_info_ptr;
+ zend_property_info *property_info, *property_info_ptr;
+
+ if (ce->type == ZEND_INTERNAL_CLASS) {
+ property_info = pemalloc(sizeof(zend_property_info), 1);
+ } else {
+ property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info));
+ }
if (Z_CONSTANT_P(property)) {
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
@@ -3559,28 +3565,28 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
if (access_type & ZEND_ACC_STATIC) {
if ((property_info_ptr = zend_hash_find_ptr(&ce->properties_info, name)) != NULL &&
(property_info_ptr->flags & ZEND_ACC_STATIC) != 0) {
- property_info.offset = property_info_ptr->offset;
- zval_ptr_dtor(&ce->default_static_members_table[property_info.offset]);
+ property_info->offset = property_info_ptr->offset;
+ zval_ptr_dtor(&ce->default_static_members_table[property_info->offset]);
zend_hash_del(&ce->properties_info, name);
} else {
- property_info.offset = ce->default_static_members_count++;
+ property_info->offset = ce->default_static_members_count++;
ce->default_static_members_table = perealloc(ce->default_static_members_table, sizeof(zval) * ce->default_static_members_count, ce->type == ZEND_INTERNAL_CLASS);
}
- ZVAL_COPY_VALUE(&ce->default_static_members_table[property_info.offset], property);
+ ZVAL_COPY_VALUE(&ce->default_static_members_table[property_info->offset], property);
if (ce->type == ZEND_USER_CLASS) {
ce->static_members_table = ce->default_static_members_table;
}
} else {
if ((property_info_ptr = zend_hash_find_ptr(&ce->properties_info, name)) != NULL &&
(property_info_ptr->flags & ZEND_ACC_STATIC) == 0) {
- property_info.offset = property_info_ptr->offset;
- zval_ptr_dtor(&ce->default_properties_table[property_info.offset]);
+ property_info->offset = property_info_ptr->offset;
+ zval_ptr_dtor(&ce->default_properties_table[property_info->offset]);
zend_hash_del(&ce->properties_info, name);
} else {
- property_info.offset = ce->default_properties_count++;
+ property_info->offset = ce->default_properties_count++;
ce->default_properties_table = perealloc(ce->default_properties_table, sizeof(zval) * ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS);
}
- ZVAL_COPY_VALUE(&ce->default_properties_table[property_info.offset], property);
+ ZVAL_COPY_VALUE(&ce->default_properties_table[property_info->offset], property);
}
if (ce->type & ZEND_INTERNAL_CLASS) {
switch(Z_TYPE_P(property)) {
@@ -3595,27 +3601,23 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z
}
switch (access_type & ZEND_ACC_PPP_MASK) {
case ZEND_ACC_PRIVATE: {
- property_info.name = zend_mangle_property_name(ce->name->val, ce->name->len, name->val, name->len, ce->type & ZEND_INTERNAL_CLASS);
+ property_info->name = zend_mangle_property_name(ce->name->val, ce->name->len, name->val, name->len, ce->type & ZEND_INTERNAL_CLASS);
}
break;
case ZEND_ACC_PROTECTED: {
- property_info.name = zend_mangle_property_name("*", 1, name->val, name->len, ce->type & ZEND_INTERNAL_CLASS);
+ property_info->name = zend_mangle_property_name("*", 1, name->val, name->len, ce->type & ZEND_INTERNAL_CLASS);
}
break;
case ZEND_ACC_PUBLIC:
- property_info.name = STR_COPY(name);
+ property_info->name = STR_COPY(name);
break;
}
- property_info.name = zend_new_interned_string(property_info.name TSRMLS_CC);
-
- property_info.flags = access_type;
-
- property_info.doc_comment = doc_comment;
-
- property_info.ce = ce;
-
- zend_hash_update_mem(&ce->properties_info, name, &property_info, sizeof(zend_property_info));
+ property_info->name = zend_new_interned_string(property_info->name TSRMLS_CC);
+ property_info->flags = access_type;
+ property_info->doc_comment = doc_comment;
+ property_info->ce = ce;
+ zend_hash_update_ptr(&ce->properties_info, name, property_info);
return SUCCESS;
}