summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2017-10-27 14:59:09 +0300
committerDmitry Stogov <dmitry@zend.com>2017-10-27 14:59:09 +0300
commit8203a0668d1ec4d667336f8f3be469873d740911 (patch)
treeaff15fec48100625df5be1d87440f8f197a5ed97
parent49ea143bbd8d0bfcd393d0b5308a5d7833fc087c (diff)
parentcf67a421e986b1020dd390a694185039b131ba7c (diff)
downloadphp-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.c6
-rw-r--r--Zend/zend_API.h10
-rw-r--r--Zend/zend_builtin_functions.c2
-rw-r--r--Zend/zend_execute_API.c2
-rw-r--r--Zend/zend_types.h6
-rw-r--r--ext/standard/var.c4
-rw-r--r--ext/standard/var_unserializer.c6
-rw-r--r--ext/standard/var_unserializer.re6
-rw-r--r--main/streams/filter.c2
-rw-r--r--main/streams/streams.c2
-rw-r--r--sapi/cli/php_cli.c6
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);
}