#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
#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;
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");
}
/* }}} */
/* }}} */
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);
}
/* }}} */
-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--;
}
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) {
}
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) {
}
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) {