diff options
Diffstat (limited to 'Zend/zend.c')
-rw-r--r-- | Zend/zend.c | 116 |
1 files changed, 64 insertions, 52 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index d036152307..42cd65ed9c 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -31,6 +31,7 @@ #include "zend_vm.h" #include "zend_dtrace.h" #include "zend_virtual_cwd.h" +#include "zend_smart_str.h" #ifdef ZTS # define GLOBAL_FUNCTION_TABLE global_function_table @@ -159,7 +160,9 @@ static uint zend_version_info_length; #define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) 1998-2016 Zend Technologies\n" #define PRINT_ZVAL_INDENT 4 -static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent, zend_bool is_object) /* {{{ */ +static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent); + +static void print_hash(smart_str *buf, HashTable *ht, int indent, zend_bool is_object) /* {{{ */ { zval *tmp; zend_string *string_key; @@ -167,54 +170,46 @@ static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent, int i; for (i = 0; i < indent; i++) { - ZEND_PUTS_EX(" "); + smart_str_appendc(buf, ' '); } - ZEND_PUTS_EX("(\n"); + smart_str_appends(buf, "(\n"); indent += PRINT_ZVAL_INDENT; - ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, string_key, tmp) { - if (Z_TYPE_P(tmp) == IS_INDIRECT) { - tmp = Z_INDIRECT_P(tmp); - if (Z_TYPE_P(tmp) == IS_UNDEF) { - continue; - } - } + ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, string_key, tmp) { for (i = 0; i < indent; i++) { - ZEND_PUTS_EX(" "); + smart_str_appendc(buf, ' '); } - ZEND_PUTS_EX("["); + smart_str_appendc(buf, '['); if (string_key) { if (is_object) { const char *prop_name, *class_name; size_t prop_len; int mangled = zend_unmangle_property_name_ex(string_key, &class_name, &prop_name, &prop_len); - ZEND_WRITE_EX(prop_name, prop_len); + smart_str_appendl(buf, prop_name, prop_len); if (class_name && mangled == SUCCESS) { - if (class_name[0]=='*') { - ZEND_PUTS_EX(":protected"); + if (class_name[0] == '*') { + smart_str_appends(buf, ":protected"); } else { - ZEND_PUTS_EX(":"); - ZEND_PUTS_EX(class_name); - ZEND_PUTS_EX(":private"); + smart_str_appends(buf, ":"); + smart_str_appends(buf, class_name); + smart_str_appends(buf, ":private"); } } } else { - ZEND_WRITE_EX(ZSTR_VAL(string_key), ZSTR_LEN(string_key)); + smart_str_append(buf, string_key); } } else { - char key[25]; - snprintf(key, sizeof(key), ZEND_LONG_FMT, num_key); - ZEND_PUTS_EX(key); + smart_str_append_long(buf, num_key); } - ZEND_PUTS_EX("] => "); - zend_print_zval_r_ex(write_func, tmp, indent+PRINT_ZVAL_INDENT); - ZEND_PUTS_EX("\n"); + smart_str_appends(buf, "] => "); + zend_print_zval_r_to_buf(buf, tmp, indent+PRINT_ZVAL_INDENT); + smart_str_appends(buf, "\n"); } ZEND_HASH_FOREACH_END(); indent -= PRINT_ZVAL_INDENT; for (i = 0; i < indent; i++) { - ZEND_PUTS_EX(" "); + smart_str_appendc(buf, ' '); } - ZEND_PUTS_EX(")\n"); + smart_str_appends(buf, ")\n"); } /* }}} */ @@ -254,17 +249,11 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */ ZEND_API size_t zend_print_zval(zval *expr, int indent) /* {{{ */ { - return zend_print_zval_ex(zend_write, expr, indent); -} -/* }}} */ - -ZEND_API size_t zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int indent) /* {{{ */ -{ zend_string *str = zval_get_string(expr); size_t len = ZSTR_LEN(str); if (len != 0) { - write_func(ZSTR_VAL(str), len); + zend_write(ZSTR_VAL(str), len); } zend_string_release(str); @@ -319,25 +308,19 @@ ZEND_API void zend_print_flat_zval_r(zval *expr) /* {{{ */ } /* }}} */ -ZEND_API void zend_print_zval_r(zval *expr, int indent) /* {{{ */ -{ - zend_print_zval_r_ex(zend_write, expr, indent); -} -/* }}} */ - -ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent) /* {{{ */ +static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /* {{{ */ { ZVAL_DEREF(expr); switch (Z_TYPE_P(expr)) { case IS_ARRAY: - ZEND_PUTS_EX("Array\n"); + smart_str_appends(buf, "Array\n"); if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr)) && ++Z_ARRVAL_P(expr)->u.v.nApplyCount>1) { - ZEND_PUTS_EX(" *RECURSION*"); + smart_str_appends(buf, " *RECURSION*"); Z_ARRVAL_P(expr)->u.v.nApplyCount--; return; } - print_hash(write_func, Z_ARRVAL_P(expr), indent, 0); + print_hash(buf, Z_ARRVAL_P(expr), indent, 0); if (ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(expr))) { Z_ARRVAL_P(expr)->u.v.nApplyCount--; } @@ -348,12 +331,12 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int int is_temp; zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr)); - ZEND_PUTS_EX(ZSTR_VAL(class_name)); + smart_str_appends(buf, ZSTR_VAL(class_name)); zend_string_release(class_name); - ZEND_PUTS_EX(" Object\n"); + smart_str_appends(buf, " Object\n"); if (Z_OBJ_APPLY_COUNT_P(expr) > 0) { - ZEND_PUTS_EX(" *RECURSION*"); + smart_str_appends(buf, " *RECURSION*"); return; } if ((properties = Z_OBJDEBUG_P(expr, is_temp)) == NULL) { @@ -361,7 +344,7 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int } Z_OBJ_INC_APPLY_COUNT_P(expr); - print_hash(write_func, properties, indent, 1); + print_hash(buf, properties, indent, 1); Z_OBJ_DEC_APPLY_COUNT_P(expr); if (is_temp) { @@ -370,13 +353,37 @@ ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int } break; } + case IS_LONG: + smart_str_append_long(buf, Z_LVAL_P(expr)); + break; default: - zend_print_zval_ex(write_func, expr, indent); + { + zend_string *str = zval_get_string(expr); + smart_str_append(buf, str); + zend_string_release(str); + } break; } } /* }}} */ +ZEND_API zend_string *zend_print_zval_r_to_str(zval *expr, int indent) /* {{{ */ +{ + smart_str buf = {0}; + zend_print_zval_r_to_buf(&buf, expr, indent); + smart_str_0(&buf); + return buf.s; +} +/* }}} */ + +ZEND_API void zend_print_zval_r(zval *expr, int indent) /* {{{ */ +{ + zend_string *str = zend_print_zval_r_to_str(expr, indent); + zend_write(ZSTR_VAL(str), ZSTR_LEN(str)); + zend_string_release(str); +} +/* }}} */ + static FILE *zend_fopen_wrapper(const char *filename, zend_string **opened_path) /* {{{ */ { if (opened_path) { @@ -501,9 +508,11 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{ } compiler_globals->script_encoding_list = NULL; - zend_interned_empty_string_init(&compiler_globals->empty_string); + compiler_globals->empty_string = zend_zts_interned_string_init("", sizeof("")-1); memset(compiler_globals->one_char_string, 0, sizeof(compiler_globals->one_char_string)); + + zend_known_interned_strings_init(&compiler_globals->known_strings, &compiler_globals->known_strings_count); } /* }}} */ @@ -529,7 +538,10 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) /* {{ } compiler_globals->last_static_member = 0; - zend_interned_empty_string_free(&compiler_globals->empty_string); + zend_zts_interned_string_free(&compiler_globals->empty_string); + + compiler_globals->known_strings = NULL; + compiler_globals->known_strings_count = 0; } /* }}} */ @@ -622,7 +634,7 @@ static zend_bool php_auto_globals_create_globals(zend_string *name) /* {{{ */ zval globals; ZVAL_ARR(&globals, &EG(symbol_table)); - Z_TYPE_INFO_P(&globals) = IS_ARRAY | (IS_TYPE_SYMBOLTABLE << Z_TYPE_FLAGS_SHIFT); + Z_TYPE_INFO_P(&globals) = IS_ARRAY; ZVAL_NEW_REF(&globals, &globals); zend_hash_update(&EG(symbol_table), name, &globals); return 0; |