]> granicus.if.org Git - php/commitdiff
- More debug backtrace work. It still doesn't work very well...
authorAndi Gutmans <andi@php.net>
Tue, 7 May 2002 18:42:13 +0000 (18:42 +0000)
committerAndi Gutmans <andi@php.net>
Tue, 7 May 2002 18:42:13 +0000 (18:42 +0000)
Zend/zend.c
Zend/zend_builtin_functions.c
Zend/zend_compile.h
Zend/zend_execute.c

index 6c6815bd3f348bccb36c640b3e2039bcc92397aa..188de6ef6fb1573ae162f274f95907e7ecb7e2dd 100644 (file)
@@ -812,6 +812,12 @@ 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++) {
@@ -822,6 +828,7 @@ 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)) {
index 0f30efb30e64c6bc87843b57482e31969fa0a6f3..fc5bd14584e5d3ec667d70ac983db26a07e1cca7 100644 (file)
@@ -1188,23 +1188,33 @@ ZEND_FUNCTION(debug_backtrace)
 {
        zend_execute_data *ptr;
        int lineno;
-
+       char *function_name;
+       char *filename;
 
        ptr = EG(current_execute_data);
        lineno = ptr->opline->lineno;
-
-       ptr = ptr->prev_execute_data;
-
+       
        while (ptr) {
                if (ptr->object) {
                        printf("%s::", Z_OBJCE(*ptr->object)->name);
                }
-               printf("%s() [%s:%d]\n", ptr->function_state.function->common.function_name, ptr->function_state.function->op_array.filename, lineno);
-               lineno = ptr->opline->lineno;
+               function_name = ptr->function_state.function->common.function_name;
+               if (!function_name) {
+                       function_name = "main";
+               }
+
                ptr = ptr->prev_execute_data;
+               if (!ptr) {
+                       break;
+               }
+               
+               filename = ptr->function_state.function->op_array.filename;
+               
+               printf("%s() [%s:%d]\n", function_name, filename, lineno);
+               if (ptr->opline) {
+                       lineno = ptr->opline->lineno;
+               }
        }
-
-       printf("main() [...:%d]\n", lineno);
        RETURN_TRUE;
 }
 
index d5a0b8a11fa3190d517903b8ffc0b9a0ce337577..8e523c9df4f5a33b24c29524e96f50cc800afca2 100644 (file)
@@ -195,6 +195,8 @@ typedef struct _zend_execute_data {
        struct _zend_execute_data *prev_execute_data;
 } zend_execute_data;
 
+#define EX(element) execute_data.element
+
 
 #define IS_CONST       (1<<0)
 #define IS_TMP_VAR     (1<<1)
index bd3c35c3ae2fe8ea0fe90a55f23826cee9bc807c..27a818f8a78f6c82ab2650993b2596fcd7343743 100644 (file)
@@ -1130,8 +1130,6 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)
        EG(current_execute_data) = EX(prev_execute_data);                                               \
        return;
 
-#define EX(element) execute_data.element
-
 ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
 {
        zend_execute_data execute_data;
@@ -2805,7 +2803,7 @@ send_by_ref:
                                                        zend_error(E_ERROR, "Cannot delete non-existing object");
                                                }
                                                if (Z_TYPE_PP(object) != IS_OBJECT) {
-                                               zend_error(E_ERROR, "Cannot call delete on non-object type");
+                                                       zend_error(E_ERROR, "Cannot call delete on non-object type");
                                                }
                                                Z_OBJ_HT_PP(object)->delete_obj(*object TSRMLS_CC);
                                        }