Browse Source

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
pull/2880/head
Dmitry Stogov 9 years ago
parent
commit
8203a0668d
  1. 6
      Zend/zend_API.c
  2. 10
      Zend/zend_API.h
  3. 2
      Zend/zend_builtin_functions.c
  4. 2
      Zend/zend_execute_API.c
  5. 6
      Zend/zend_types.h
  6. 4
      ext/standard/var.c
  7. 6
      ext/standard/var_unserializer.c
  8. 6
      ext/standard/var_unserializer.re
  9. 2
      main/streams/filter.c
  10. 2
      main/streams/streams.c
  11. 6
      sapi/cli/php_cli.c

6
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);
}

10
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);

2
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);

2
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] = ';';

6
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; \

4
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) {

6
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 {

6
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 {

2
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);
}

2
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);
}

6
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);
}

Loading…
Cancel
Save