@@ -1865,7 +1865,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
1865
1865
zend_string * function_name ;
1866
1866
zend_string * filename ;
1867
1867
zend_string * include_filename = NULL ;
1868
- zval stack_frame , tmp ;
1868
+ zval tmp ;
1869
+ HashTable * stack_frame ;
1869
1870
1870
1871
array_init (return_value );
1871
1872
@@ -1898,7 +1899,10 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
1898
1899
1899
1900
while (ptr && (limit == 0 || frameno < limit )) {
1900
1901
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 );
1902
1906
1903
1907
ptr = zend_generator_check_placeholder_frame (ptr );
1904
1908
@@ -1920,9 +1924,9 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
1920
1924
lineno = skip -> opline -> lineno ;
1921
1925
}
1922
1926
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 );
1924
1928
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 );
1926
1930
1927
1931
/* try to fetch args only if an FCALL was just made - elsewise we're in the middle of a function
1928
1932
* 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
1940
1944
}
1941
1945
if (prev -> func && ZEND_USER_CODE (prev -> func -> common .type )) {
1942
1946
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 );
1944
1948
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 );
1946
1950
break ;
1947
1951
}
1948
1952
prev_call = prev ;
@@ -1964,7 +1968,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
1964
1968
1965
1969
if (function_name ) {
1966
1970
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 );
1968
1972
1969
1973
if (object ) {
1970
1974
if (func -> common .scope ) {
@@ -1974,26 +1978,26 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
1974
1978
} else {
1975
1979
ZVAL_STR (& tmp , object -> handlers -> get_class_name (object ));
1976
1980
}
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 );
1978
1982
if ((options & DEBUG_BACKTRACE_PROVIDE_OBJECT ) != 0 ) {
1979
1983
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 );
1981
1985
}
1982
1986
1983
1987
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 );
1985
1989
} else if (func -> common .scope ) {
1986
1990
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 );
1988
1992
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 );
1990
1994
}
1991
1995
1992
1996
if ((options & DEBUG_BACKTRACE_IGNORE_ARGS ) == 0 &&
1993
1997
func -> type != ZEND_EVAL_CODE ) {
1994
1998
1995
1999
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 );
1997
2001
}
1998
2002
} else {
1999
2003
/* 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
2024
2028
default :
2025
2029
/* Skip dummy frame unless it is needed to preserve filename/lineno info. */
2026
2030
if (!filename ) {
2027
- zval_ptr_dtor ( & stack_frame );
2031
+ zend_array_destroy ( stack_frame );
2028
2032
goto skip_frame ;
2029
2033
}
2030
2034
@@ -2044,14 +2048,15 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
2044
2048
2045
2049
ZVAL_STR_COPY (& tmp , include_filename );
2046
2050
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 );
2048
2052
}
2049
2053
2050
2054
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 );
2052
2056
}
2053
2057
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 );
2055
2060
2056
2061
skip_frame :
2057
2062
include_filename = filename ;
0 commit comments