Skip to content

Commit ffb1dd0

Browse files
committed
Use zend_hash_append*() in zend_fetch_debug_backtrace()
1 parent a13a1be commit ffb1dd0

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

Zend/zend_builtin_functions.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1865,7 +1865,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
18651865
zend_string *function_name;
18661866
zend_string *filename;
18671867
zend_string *include_filename = NULL;
1868-
zval stack_frame, tmp;
1868+
zval tmp;
1869+
HashTable *stack_frame;
18691870

18701871
array_init(return_value);
18711872

@@ -1898,7 +1899,10 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
18981899

18991900
while (ptr && (limit == 0 || frameno < limit)) {
19001901
frameno++;
1901-
array_init(&stack_frame);
1902+
1903+
/* We use _zend_hash_append*() and the array must be preallocated */
1904+
stack_frame = zend_new_array(8);
1905+
zend_hash_real_init_mixed(stack_frame);
19021906

19031907
ptr = zend_generator_check_placeholder_frame(ptr);
19041908

@@ -1920,9 +1924,9 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
19201924
lineno = skip->opline->lineno;
19211925
}
19221926
ZVAL_STR_COPY(&tmp, filename);
1923-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_FILE), &tmp);
1927+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FILE), &tmp, 1);
19241928
ZVAL_LONG(&tmp, lineno);
1925-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_LINE), &tmp);
1929+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_LINE), &tmp, 1);
19261930

19271931
/* try to fetch args only if an FCALL was just made - elsewise we're in the middle of a function
19281932
* and debug_baktrace() might have been called by the error_handler. in this case we don't
@@ -1940,9 +1944,9 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
19401944
}
19411945
if (prev->func && ZEND_USER_CODE(prev->func->common.type)) {
19421946
ZVAL_STR_COPY(&tmp, prev->func->op_array.filename);
1943-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_FILE), &tmp);
1947+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FILE), &tmp, 1);
19441948
ZVAL_LONG(&tmp, prev->opline->lineno);
1945-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_LINE), &tmp);
1949+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_LINE), &tmp, 1);
19461950
break;
19471951
}
19481952
prev_call = prev;
@@ -1964,7 +1968,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
19641968

19651969
if (function_name) {
19661970
ZVAL_STR_COPY(&tmp, function_name);
1967-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp);
1971+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp, 1);
19681972

19691973
if (object) {
19701974
if (func->common.scope) {
@@ -1974,26 +1978,26 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
19741978
} else {
19751979
ZVAL_STR(&tmp, object->handlers->get_class_name(object));
19761980
}
1977-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_CLASS), &tmp);
1981+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_CLASS), &tmp, 1);
19781982
if ((options & DEBUG_BACKTRACE_PROVIDE_OBJECT) != 0) {
19791983
ZVAL_OBJ_COPY(&tmp, object);
1980-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_OBJECT), &tmp);
1984+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_OBJECT), &tmp, 1);
19811985
}
19821986

19831987
ZVAL_INTERNED_STR(&tmp, ZSTR_KNOWN(ZEND_STR_OBJECT_OPERATOR));
1984-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_TYPE), &tmp);
1988+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_TYPE), &tmp, 1);
19851989
} else if (func->common.scope) {
19861990
ZVAL_STR_COPY(&tmp, func->common.scope->name);
1987-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_CLASS), &tmp);
1991+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_CLASS), &tmp, 1);
19881992
ZVAL_INTERNED_STR(&tmp, ZSTR_KNOWN(ZEND_STR_PAAMAYIM_NEKUDOTAYIM));
1989-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_TYPE), &tmp);
1993+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_TYPE), &tmp, 1);
19901994
}
19911995

19921996
if ((options & DEBUG_BACKTRACE_IGNORE_ARGS) == 0 &&
19931997
func->type != ZEND_EVAL_CODE) {
19941998

19951999
debug_backtrace_get_args(call, &tmp);
1996-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_ARGS), &tmp);
2000+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_ARGS), &tmp, 1);
19972001
}
19982002
} else {
19992003
/* i know this is kinda ugly, but i'm trying to avoid extra cycles in the main execution loop */
@@ -2024,7 +2028,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
20242028
default:
20252029
/* Skip dummy frame unless it is needed to preserve filename/lineno info. */
20262030
if (!filename) {
2027-
zval_ptr_dtor(&stack_frame);
2031+
zend_array_destroy(stack_frame);
20282032
goto skip_frame;
20292033
}
20302034

@@ -2044,14 +2048,15 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
20442048

20452049
ZVAL_STR_COPY(&tmp, include_filename);
20462050
zend_hash_next_index_insert_new(Z_ARRVAL(arg_array), &tmp);
2047-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_ARGS), &arg_array);
2051+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_ARGS), &arg_array, 1);
20482052
}
20492053

20502054
ZVAL_INTERNED_STR(&tmp, pseudo_function_name);
2051-
zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp);
2055+
_zend_hash_append_ex(stack_frame, ZSTR_KNOWN(ZEND_STR_FUNCTION), &tmp, 1);
20522056
}
20532057

2054-
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stack_frame);
2058+
ZVAL_ARR(&tmp, stack_frame);
2059+
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
20552060

20562061
skip_frame:
20572062
include_filename = filename;

0 commit comments

Comments
 (0)