[gforth] / gforth / backtrac.fs  

gforth: gforth/backtrac.fs


1 : anton 1.1 \ backtrace handling
2 :    
3 : anton 1.12 \ Copyright (C) 1999,2000,2003,2004 Free Software Foundation, Inc.
4 : anton 1.1
5 :     \ This file is part of Gforth.
6 :    
7 :     \ Gforth is free software; you can redistribute it and/or
8 :     \ modify it under the terms of the GNU General Public License
9 :     \ as published by the Free Software Foundation; either version 2
10 :     \ of the License, or (at your option) any later version.
11 :    
12 :     \ This program is distributed in the hope that it will be useful,
13 :     \ but WITHOUT ANY WARRANTY; without even the implied warranty of
14 :     \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 :     \ GNU General Public License for more details.
16 :    
17 :     \ You should have received a copy of the GNU General Public License
18 :     \ along with this program; if not, write to the Free Software
19 : anton 1.4 \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
20 : anton 1.1
21 :    
22 :     \ growing buffers that need not be full
23 :    
24 :     struct
25 :     cell% 0 * field buffer-descriptor \ addr u
26 :     cell% field buffer-length
27 :     cell% field buffer-address
28 :     cell% field buffer-maxlength \ >=length
29 :     end-struct buffer%
30 :    
31 :     : init-buffer ( addr -- )
32 :     buffer% %size erase ;
33 :    
34 :     : adjust-buffer ( u addr -- )
35 :     \G adjust buffer% at addr to length u
36 :     \ this may grow the allocated area, but never shrinks it
37 :     dup >r buffer-maxlength @ over <
38 :     if ( u )
39 :     r@ buffer-address @ over resize throw r@ buffer-address !
40 :     dup r@ buffer-maxlength !
41 :     then
42 :     r> buffer-length ! ;
43 :    
44 :     \ backtrace stuff
45 :    
46 : anton 1.9 create backtrace-rs-buffer buffer% %allot drop
47 :     \ copy of the return stack at throw
48 : anton 1.1
49 :     : init-backtrace ( -- )
50 :     backtrace-rs-buffer init-buffer ;
51 :    
52 :     init-backtrace
53 :    
54 :     :noname ( -- )
55 :     DEFERS 'cold
56 :     init-backtrace ;
57 :     IS 'cold
58 :    
59 :     : backtrace-return-stack ( -- addr u )
60 :     \ addr is the address of top element of return stack (the stack
61 :     \ grows downwards), u is the number of aus that interest us on the
62 :     \ stack.
63 :     rp@ in-return-stack?
64 :     if
65 :     rp@ [ 2 cells ]L +
66 :     else \ throw by signal handler with insufficient information
67 :     handler @ cell - \ beyond that we know nothing
68 :     then
69 :     backtrace-rp0 @ [ 2 cells ]L - over - 0 max ;
70 :    
71 :     :noname ( -- )
72 :     backtrace-empty @
73 :     if
74 :     backtrace-return-stack
75 :     dup backtrace-rs-buffer adjust-buffer
76 :     backtrace-rs-buffer buffer-address @ swap move
77 :     backtrace-empty off
78 :     then ;
79 :     IS store-backtrace
80 :    
81 : anton 1.5 : print-bt-entry ( return-stack-item -- )
82 :     cell - dup in-dictionary? over dup aligned = and
83 :     if
84 : anton 1.7 @ dup threaded>name dup if
85 : anton 1.5 .name drop
86 :     else
87 : anton 1.6 drop dup look if
88 :     .name drop
89 : anton 1.1 else
90 : anton 1.6 drop body> look \ !! check for "call" in cell before?
91 :     if
92 :     .name
93 :     else
94 :     drop
95 :     then
96 : anton 1.1 then
97 :     then
98 : anton 1.5 else
99 :     drop
100 :     then ;
101 :    
102 :     : print-backtrace ( addr1 addr2 -- )
103 :     \G print a backtrace for the return stack addr1..addr2
104 :     cr ." Backtrace:"
105 :     swap u+do
106 :     cr
107 :     i @ dup hex. ( return-addr? )
108 :     print-bt-entry
109 : anton 1.1 cell +loop ;
110 :    
111 :     :noname ( -- )
112 :     backtrace-rs-buffer 2@ over + print-backtrace ;
113 :     IS dobacktrace
114 : anton 1.10
115 : pazsan 1.11 [ifdef] defer-default
116 : anton 1.10 :noname
117 :     r@ >stderr cr ." deferred word " print-bt-entry ." is uninitialized" ;
118 :     is defer-default
119 : pazsan 1.11 [then]

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help