dmitry                                   Wed, 11 Aug 2010 09:38:41 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=302104

Log:
In ZTS mode default properties and constants of internal classes can't be 
modified in place and have to be separated

Changed paths:
    U   php/php-src/branches/PHP_5_2/Zend/zend_compile.c
    U   php/php-src/branches/PHP_5_3/Zend/zend_compile.c
    U   php/php-src/trunk/Zend/zend_compile.c

Modified: php/php-src/branches/PHP_5_2/Zend/zend_compile.c
===================================================================
--- php/php-src/branches/PHP_5_2/Zend/zend_compile.c    2010-08-11 08:57:34 UTC 
(rev 302103)
+++ php/php-src/branches/PHP_5_2/Zend/zend_compile.c    2010-08-11 09:38:41 UTC 
(rev 302104)
@@ -2298,6 +2298,25 @@
        return ZEND_HASH_APPLY_KEEP;
 }

+#ifdef ZTS
+static void zval_internal_ctor(zval **p)
+{
+       zval *orig_ptr = *p;
+
+       ALLOC_ZVAL(*p);
+       **p = *orig_ptr;
+       zval_copy_ctor(*p);
+       (*p)->refcount = 1;
+       (*p)->is_ref = 0;
+}
+
+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) (((parent_ce)->type != (ce)->type) ? 
zval_internal_ctor : zval_add_ref))
+#else
+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) zval_add_ref)
+#endif
+
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry 
*parent_ce TSRMLS_DC)
 {
        if ((ce->ce_flags & ZEND_ACC_INTERFACE)
@@ -2313,7 +2332,7 @@
        zend_do_inherit_interfaces(ce, parent_ce TSRMLS_CC);

        /* Inherit properties */
-       zend_hash_merge(&ce->default_properties, 
&parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, 
sizeof(zval *), 0);
+       zend_hash_merge(&ce->default_properties, 
&parent_ce->default_properties, zval_property_ctor(parent_ce, ce), NULL, 
sizeof(zval *), 0);
        if (parent_ce->type != ce->type) {
                /* User class extends internal class */
                zend_update_class_constants(parent_ce  TSRMLS_CC);
@@ -2323,7 +2342,7 @@
        }
        zend_hash_merge_ex(&ce->properties_info, &parent_ce->properties_info, 
(copy_ctor_func_t) (ce->type & ZEND_INTERNAL_CLASS ? 
zend_duplicate_property_info_internal : zend_duplicate_property_info), 
sizeof(zend_property_info), (merge_checker_func_t) 
do_inherit_property_access_check, ce);

-       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
(void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0);
+       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
zval_property_ctor(parent_ce, ce), NULL, sizeof(zval *), 0);
        zend_hash_merge_ex(&ce->function_table, &parent_ce->function_table, 
(copy_ctor_func_t) do_inherit_method, sizeof(zend_function), 
(merge_checker_func_t) do_inherit_method_check, ce);
        do_inherit_parent_constructor(ce);


Modified: php/php-src/branches/PHP_5_3/Zend/zend_compile.c
===================================================================
--- php/php-src/branches/PHP_5_3/Zend/zend_compile.c    2010-08-11 08:57:34 UTC 
(rev 302103)
+++ php/php-src/branches/PHP_5_3/Zend/zend_compile.c    2010-08-11 09:38:41 UTC 
(rev 302104)
@@ -2817,6 +2817,26 @@
 }
 /* }}} */

+#ifdef ZTS
+static void zval_internal_ctor(zval **p) /* {{{ */
+{
+       zval *orig_ptr = *p;
+
+       ALLOC_ZVAL(*p);
+       **p = *orig_ptr;
+       zval_copy_ctor(*p);
+       Z_SET_REFCOUNT_PP(p, 1);
+       Z_UNSET_ISREF_PP(p);
+}
+/* }}} */
+
+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) (((parent_ce)->type != (ce)->type) ? 
zval_internal_ctor : zval_add_ref))
+#else
+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) zval_add_ref)
+#endif
+
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry 
*parent_ce TSRMLS_DC) /* {{{ */
 {
        if ((ce->ce_flags & ZEND_ACC_INTERFACE)
@@ -2840,7 +2860,7 @@
        zend_do_inherit_interfaces(ce, parent_ce TSRMLS_CC);

        /* Inherit properties */
-       zend_hash_merge(&ce->default_properties, 
&parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, 
sizeof(zval *), 0);
+       zend_hash_merge(&ce->default_properties, 
&parent_ce->default_properties, zval_property_ctor(parent_ce, ce), NULL, 
sizeof(zval *), 0);
        if (parent_ce->type != ce->type) {
                /* User class extends internal class */
                zend_update_class_constants(parent_ce  TSRMLS_CC);
@@ -2850,7 +2870,7 @@
        }
        zend_hash_merge_ex(&ce->properties_info, &parent_ce->properties_info, 
(copy_ctor_func_t) (ce->type & ZEND_INTERNAL_CLASS ? 
zend_duplicate_property_info_internal : zend_duplicate_property_info), 
sizeof(zend_property_info), (merge_checker_func_t) 
do_inherit_property_access_check, ce);

-       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
(void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0);
+       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
zval_property_ctor(parent_ce, ce), NULL, sizeof(zval *), 0);
        zend_hash_merge_ex(&ce->function_table, &parent_ce->function_table, 
(copy_ctor_func_t) do_inherit_method, sizeof(zend_function), 
(merge_checker_func_t) do_inherit_method_check, ce);
        do_inherit_parent_constructor(ce);


Modified: php/php-src/trunk/Zend/zend_compile.c
===================================================================
--- php/php-src/trunk/Zend/zend_compile.c       2010-08-11 08:57:34 UTC (rev 
302103)
+++ php/php-src/trunk/Zend/zend_compile.c       2010-08-11 09:38:41 UTC (rev 
302104)
@@ -3150,20 +3150,23 @@
 }
 /* }}} */

-static int inherit_static_prop(zval **p TSRMLS_DC, int num_args, va_list args, 
const zend_hash_key *key) /* {{{ */
+#ifdef ZTS
+static void zval_internal_ctor(zval **p) /* {{{ */
 {
-       HashTable *target = va_arg(args, HashTable*);
+       zval *orig_ptr = *p;

-       if (!zend_hash_quick_exists(target, key->arKey, key->nKeyLength, 
key->h)) {
-               SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
-               if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, 
key->h, p, sizeof(zval*), NULL) == SUCCESS) {
-                       Z_ADDREF_PP(p);
-               }
-       }
-       return ZEND_HASH_APPLY_KEEP;
+       ALLOC_ZVAL(*p);
+       MAKE_COPY_ZVAL(&orig_ptr, *p);
 }
 /* }}} */

+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) (((parent_ce)->type != (ce)->type) ? 
zval_internal_ctor : zval_add_ref))
+#else
+# define zval_property_ctor(parent_ce, ce) \
+       ((void (*)(void *)) zval_add_ref)
+#endif
+
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry 
*parent_ce TSRMLS_DC) /* {{{ */
 {
        zend_property_info *property_info;
@@ -3201,7 +3204,19 @@
                for (i = 0; i < parent_ce->default_properties_count; i++) {
                        ce->default_properties_table[i] = 
parent_ce->default_properties_table[i];
                        if (ce->default_properties_table[i]) {
+#ifdef ZTS
+                               if (parent_ce->type != ce->type) {
+                                       zval *p;
+
+                                       ALLOC_ZVAL(p);
+                                       
MAKE_COPY_ZVAL(&ce->default_properties_table[i], p);
+                                       ce->default_properties_table[i] = p;
+                               } else {
+                                       
Z_ADDREF_P(ce->default_properties_table[i]);
+                               }
+#else
                                Z_ADDREF_P(ce->default_properties_table[i]);
+#endif
                        }
                }
                ce->default_properties_count += 
parent_ce->default_properties_count;
@@ -3263,7 +3278,7 @@

        zend_hash_merge_ex(&ce->properties_info, &parent_ce->properties_info, 
(copy_ctor_func_t) (ce->type & ZEND_INTERNAL_CLASS ? 
zend_duplicate_property_info_internal : zend_duplicate_property_info), 
sizeof(zend_property_info), (merge_checker_func_t) 
do_inherit_property_access_check, ce);

-       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
(void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0);
+       zend_hash_merge(&ce->constants_table, &parent_ce->constants_table, 
zval_property_ctor(parent_ce, ce), NULL, sizeof(zval *), 0);
        zend_hash_merge_ex(&ce->function_table, &parent_ce->function_table, 
(copy_ctor_func_t) do_inherit_method, sizeof(zend_function), 
(merge_checker_func_t) do_inherit_method_check, ce);
        do_inherit_parent_constructor(ce);


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to