diff options
author | Dmitry Stogov <dmitry@zend.com> | 2017-10-27 14:59:09 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2017-10-27 14:59:09 +0300 |
commit | 8203a0668d1ec4d667336f8f3be469873d740911 (patch) | |
tree | aff15fec48100625df5be1d87440f8f197a5ed97 | |
parent | 49ea143bbd8d0bfcd393d0b5308a5d7833fc087c (diff) | |
parent | cf67a421e986b1020dd390a694185039b131ba7c (diff) | |
download | php-git-8203a0668d1ec4d667336f8f3be469873d740911.tar.gz |
Merge branch 'master' into rc_debug
* master:
Use per-request heap instead of system one
Extend zend_register_class_alias_ex() with additional argument to allow creating persistent or per-request aliases
Makrk persistent resources and references with GC_PERSISTENT flag
-rw-r--r-- | Zend/zend_API.c | 6 | ||||
-rw-r--r-- | Zend/zend_API.h | 10 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 2 | ||||
-rw-r--r-- | Zend/zend_execute_API.c | 2 | ||||
-rw-r--r-- | Zend/zend_types.h | 6 | ||||
-rw-r--r-- | ext/standard/var.c | 4 | ||||
-rw-r--r-- | ext/standard/var_unserializer.c | 6 | ||||
-rw-r--r-- | ext/standard/var_unserializer.re | 6 | ||||
-rw-r--r-- | main/streams/filter.c | 2 | ||||
-rw-r--r-- | main/streams/streams.c | 2 | ||||
-rw-r--r-- | sapi/cli/php_cli.c | 6 |
11 files changed, 27 insertions, 25 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index fd1705149b..61b1829f78 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2762,15 +2762,15 @@ ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *or } /* }}} */ -ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce) /* {{{ */ +ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, int persistent) /* {{{ */ { zend_string *lcname; if (name[0] == '\\') { - lcname = zend_string_alloc(name_len-1, 1); + lcname = zend_string_alloc(name_len-1, persistent); zend_str_tolower_copy(ZSTR_VAL(lcname), name+1, name_len-1); } else { - lcname = zend_string_alloc(name_len, 1); + lcname = zend_string_alloc(name_len, persistent); zend_str_tolower_copy(ZSTR_VAL(lcname), name, name_len); } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index fdc26f3344..04706aca31 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -302,12 +302,12 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *cla ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *orig_class_entry); ZEND_API void zend_class_implements(zend_class_entry *class_entry, int num_interfaces, ...); -ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce); +ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, int persistent); -#define zend_register_class_alias(name, ce) \ - zend_register_class_alias_ex(name, sizeof(name)-1, ce) -#define zend_register_ns_class_alias(ns, name, ce) \ - zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce) +#define zend_register_class_alias(name, ce, persistent) \ + zend_register_class_alias_ex(name, sizeof(name)-1, ce, persistent) +#define zend_register_ns_class_alias(ns, name, ce, persistent) \ + zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce, persistent) ZEND_API int zend_disable_function(char *function_name, size_t function_name_length); ZEND_API int zend_disable_class(char *class_name, size_t class_name_length); diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 387e9f5e60..0d6cc442b6 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1529,7 +1529,7 @@ ZEND_FUNCTION(class_alias) if (ce) { if (ce->type == ZEND_USER_CLASS) { - if (zend_register_class_alias_ex(alias_name, alias_name_len, ce) == SUCCESS) { + if (zend_register_class_alias_ex(alias_name, alias_name_len, ce, 0) == SUCCESS) { RETURN_TRUE; } else { zend_error(E_WARNING, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), alias_name); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 2eb4d11920..cbdf6224fb 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1025,7 +1025,7 @@ ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char int retval; if (retval_ptr) { - ZVAL_NEW_STR(&pv, zend_string_alloc(str_len + sizeof("return ;")-1, 1)); + ZVAL_NEW_STR(&pv, zend_string_alloc(str_len + sizeof("return ;")-1, 0)); memcpy(Z_STRVAL(pv), "return ", sizeof("return ") - 1); memcpy(Z_STRVAL(pv) + sizeof("return ") - 1, str, str_len); Z_STRVAL(pv)[Z_STRLEN(pv) - 1] = ';'; diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 56217d579e..9b9c578e20 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -772,7 +772,8 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { (zend_resource *) malloc(sizeof(zend_resource)); \ zval *__z; \ GC_SET_REFCOUNT(_res, 1); \ - GC_TYPE_INFO(_res) = IS_RESOURCE; \ + GC_TYPE_INFO(_res) = IS_RESOURCE | \ + (GC_PERSISTENT << GC_FLAGS_SHIFT); \ _res->handle = (h); \ _res->type = (t); \ _res->ptr = (p); \ @@ -810,7 +811,8 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { zend_reference *_ref = \ (zend_reference *) malloc(sizeof(zend_reference)); \ GC_SET_REFCOUNT(_ref, 1); \ - GC_TYPE_INFO(_ref) = IS_REFERENCE; \ + GC_TYPE_INFO(_ref) = IS_REFERENCE | \ + (GC_PERSISTENT << GC_FLAGS_SHIFT); \ ZVAL_COPY_VALUE(&_ref->val, r); \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ diff --git a/ext/standard/var.c b/ext/standard/var.c index e28afe9177..3f5d2ffe40 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -761,7 +761,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt } priv_name = zend_mangle_property_name( - ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); + ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), ZSTR_VAL(name), ZSTR_LEN(name), 0); val = zend_hash_find(propers, priv_name); if (val != NULL) { if (Z_TYPE_P(val) == IS_INDIRECT) { @@ -780,7 +780,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt zend_string_free(priv_name); prot_name = zend_mangle_property_name( - "*", 1, ZSTR_VAL(name), ZSTR_LEN(name), ce->type & ZEND_INTERNAL_CLASS); + "*", 1, ZSTR_VAL(name), ZSTR_LEN(name), 0); val = zend_hash_find(propers, prot_name); if (val != NULL) { if (Z_TYPE_P(val) == IS_INDIRECT) { diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index d798b589fe..4a797e69c7 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -433,19 +433,19 @@ string_key: && (existing_propinfo->flags & ZEND_ACC_PPP_MASK)) { if (existing_propinfo->flags & ZEND_ACC_PROTECTED) { new_key = zend_mangle_property_name( - "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), 0); zend_string_release(unmangled); } else if (existing_propinfo->flags & ZEND_ACC_PRIVATE) { if (unmangled_class != NULL && strcmp(unmangled_class, "*") != 0) { new_key = zend_mangle_property_name( unmangled_class, strlen(unmangled_class), ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), - Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + 0); } else { new_key = zend_mangle_property_name( ZSTR_VAL(existing_propinfo->ce->name), ZSTR_LEN(existing_propinfo->ce->name), ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), - Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + 0); } zend_string_release(unmangled); } else { diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 3cf82b1e7a..90f13ae01a 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -437,19 +437,19 @@ string_key: && (existing_propinfo->flags & ZEND_ACC_PPP_MASK)) { if (existing_propinfo->flags & ZEND_ACC_PROTECTED) { new_key = zend_mangle_property_name( - "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + "*", 1, ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), 0); zend_string_release(unmangled); } else if (existing_propinfo->flags & ZEND_ACC_PRIVATE) { if (unmangled_class != NULL && strcmp(unmangled_class, "*") != 0) { new_key = zend_mangle_property_name( unmangled_class, strlen(unmangled_class), ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), - Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + 0); } else { new_key = zend_mangle_property_name( ZSTR_VAL(existing_propinfo->ce->name), ZSTR_LEN(existing_propinfo->ce->name), ZSTR_VAL(unmangled), ZSTR_LEN(unmangled), - Z_OBJCE_P(rval)->type & ZEND_INTERNAL_CLASS); + 0); } zend_string_release(unmangled); } else { diff --git a/main/streams/filter.c b/main/streams/filter.c index bb167c4409..6014a49661 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -59,7 +59,7 @@ PHPAPI int php_stream_filter_register_factory_volatile(const char *filterpattern { if (!FG(stream_filters)) { ALLOC_HASHTABLE(FG(stream_filters)); - zend_hash_init(FG(stream_filters), zend_hash_num_elements(&stream_filters_hash), NULL, NULL, 1); + zend_hash_init(FG(stream_filters), zend_hash_num_elements(&stream_filters_hash), NULL, NULL, 0); zend_hash_copy(FG(stream_filters), &stream_filters_hash, NULL); } diff --git a/main/streams/streams.c b/main/streams/streams.c index c46bf8328b..15cecff377 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1686,7 +1686,7 @@ PHPAPI int php_unregister_url_stream_wrapper(const char *protocol) static void clone_wrapper_hash(void) { ALLOC_HASHTABLE(FG(stream_wrappers)); - zend_hash_init(FG(stream_wrappers), zend_hash_num_elements(&url_stream_wrappers_hash), NULL, NULL, 1); + zend_hash_init(FG(stream_wrappers), zend_hash_num_elements(&url_stream_wrappers_hash), NULL, NULL, 0); zend_hash_copy(FG(stream_wrappers), &url_stream_wrappers_hash, NULL); } diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 52055c98c9..e7999febbb 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -593,17 +593,17 @@ static void cli_register_file_handles(void) /* {{{ */ php_stream_to_zval(s_err, &ec.value); ic.flags = CONST_CS; - ic.name = zend_string_init("STDIN", sizeof("STDIN")-1, 1); + ic.name = zend_string_init_interned("STDIN", sizeof("STDIN")-1, 0); ic.module_number = 0; zend_register_constant(&ic); oc.flags = CONST_CS; - oc.name = zend_string_init("STDOUT", sizeof("STDOUT")-1, 1); + oc.name = zend_string_init_interned("STDOUT", sizeof("STDOUT")-1, 0); oc.module_number = 0; zend_register_constant(&oc); ec.flags = CONST_CS; - ec.name = zend_string_init("STDERR", sizeof("STDERR")-1, 1); + ec.name = zend_string_init_interned("STDERR", sizeof("STDERR")-1, 0); ec.module_number = 0; zend_register_constant(&ec); } |