diff options
author | Andi Gutmans <andi@php.net> | 2002-07-26 10:38:25 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2002-07-26 10:38:25 +0000 |
commit | 41e3f4f0c395d512efc71e437864dbedac901a23 (patch) | |
tree | 7da48b668e21c1046c4e81af070ccec84556b910 | |
parent | 8d73650be25b89d593fb1bfcb254867dfee2c9ef (diff) | |
download | php-git-41e3f4f0c395d512efc71e437864dbedac901a23.tar.gz |
- Fix problem with debug_backtrace() reported by Stig. We weren't reporting
- global function information because it wasn't available. We have to do
- an additional assignment per-function call so that it'll be available.
- Also don't define the global scope as function name _main_ but leave it
- empty so that frameworks like Pear can decide what they want to do.
-rw-r--r-- | Zend/zend.c | 9 | ||||
-rw-r--r-- | Zend/zend_builtin_functions.c | 42 | ||||
-rw-r--r-- | Zend/zend_compile.h | 1 | ||||
-rw-r--r-- | Zend/zend_execute.c | 1 |
4 files changed, 18 insertions, 35 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index a3d8d07069..8871ce00e8 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -813,13 +813,7 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co zend_file_handle *file_handle; zend_op_array *orig_op_array = EG(active_op_array); zval *local_retval=NULL; - zend_execute_data execute_data; - - EX(prev_execute_data) = NULL; - EG(current_execute_data) = &execute_data; - EX(object) = NULL; - EX(opline) = NULL; - + va_start(files, file_count); for (i=0; i<file_count; i++) { file_handle = va_arg(files, zend_file_handle *); @@ -829,7 +823,6 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co EG(active_op_array) = zend_compile_file(file_handle, ZEND_INCLUDE TSRMLS_CC); zend_destroy_file_handle(file_handle TSRMLS_CC); if (EG(active_op_array)) { - EX(function_state).function = (zend_function *) EG(active_op_array); EG(return_value_ptr_ptr) = retval ? retval : &local_retval; zend_execute(EG(active_op_array) TSRMLS_CC); if (EG(exception)) { diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 946bf008f2..b826c54991 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1201,10 +1201,11 @@ ZEND_FUNCTION(debug_backtrace) char *class_name; zend_uint class_name_length; zval *stack_frame; - zend_bool first_time = 1; ptr = EG(current_execute_data); - lineno = ptr->opline->lineno; + + /* Skip debug_backtrace() itself */ + ptr = ptr->prev_execute_data; array_init(return_value); @@ -1222,35 +1223,22 @@ ZEND_FUNCTION(debug_backtrace) class_name = ptr->function_state.function->common.scope->name; } function_name = ptr->function_state.function->common.function_name; - if (!function_name) { - function_name = "_main_"; - } - - ptr = ptr->prev_execute_data; - if (!ptr) { - zval_ptr_dtor(&stack_frame); - break; - } - - filename = ptr->function_state.function->op_array.filename; + + filename = ptr->op_array->filename; + lineno = ptr->opline->lineno; - if (!first_time) { /* Skip the first context which is debug_backtrace() itself */ + if (function_name) { add_assoc_string_ex(stack_frame, "function", sizeof("function"), function_name, 1); - if (class_name) { - add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 1); - } - add_assoc_string_ex(stack_frame, "file", sizeof("file"), filename, 1); - add_assoc_long_ex(stack_frame, "line", sizeof("line"), lineno); - /* add_assoc_stringl_ex(stack_frame, "class", sizeof("class")-1, class_name, class_name_length, 1); */ - - add_next_index_zval(return_value, stack_frame); - } else { - first_time = 0; } - - if (ptr->opline) { - lineno = ptr->opline->lineno; + if (class_name) { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 1); } + add_assoc_string_ex(stack_frame, "file", sizeof("file"), filename, 1); + add_assoc_long_ex(stack_frame, "line", sizeof("line"), lineno); + /* add_assoc_stringl_ex(stack_frame, "class", sizeof("class")-1, class_name, class_name_length, 1); */ + add_next_index_zval(return_value, stack_frame); + + ptr = ptr->prev_execute_data; } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index b51d576ff1..cb007bf779 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -188,6 +188,7 @@ typedef struct _zend_execute_data { zend_function_state function_state; zend_function *fbc; /* Function Being Called */ zend_function *fbc_constructor; + zend_op_array *op_array; zval *object; union _temp_variable *Ts; zend_bool original_in_execution; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index fca3ff2a36..af50e25725 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1110,6 +1110,7 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC) EX(fbc) = NULL; EX(object) = NULL; EX(Ts) = (temp_variable *) do_alloca(sizeof(temp_variable)*op_array->T); + EX(op_array) = op_array; EX(original_in_execution) = EG(in_execution); EX(prev_execute_data) = EG(current_execute_data); EG(current_execute_data) = &execute_data; |