Imported File#ftype spec from rubyspecs.
[rbx.git] / lib / irb / frame.rb
blob2af3eabef9c6ec7baf5a4baa164bad2125fe7b45
2 #   frame.rb - 
3 #       $Release Version: 0.9$
4 #       $Revision: 11708 $
5 #       $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6 #       by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)
8 # --
10 #   
13 require "e2mmap"
15 module IRB
16   class Frame
17     extend Exception2MessageMapper
18     def_exception :FrameOverflow, "frame overflow"
19     def_exception :FrameUnderflow, "frame underflow"
21     INIT_STACK_TIMES = 3
22     CALL_STACK_OFFSET = 3
24     def initialize
25       @frames = [TOPLEVEL_BINDING] * INIT_STACK_TIMES
26     end
28     def trace_func(event, file, line, id, binding)
29       case event
30       when 'call', 'class'
31         @frames.push binding
32       when 'return', 'end'
33         @frames.pop
34       end
35     end
37     def top(n = 0)
38       bind = @frames[-(n + CALL_STACK_OFFSET)]
39       Fail FrameUnderflow unless bind
40       bind
41     end
43     def bottom(n = 0)
44       bind = @frames[n]
45       Fail FrameOverflow unless bind
46       bind
47     end
49     # singleton functions
50     def Frame.bottom(n = 0)
51       @backtrace.bottom(n)
52     end
54     def Frame.top(n = 0)
55       @backtrace.top(n)
56     end
58     def Frame.sender
59       eval "self", @backtrace.top
60     end
62     @backtrace = Frame.new
63     set_trace_func proc{|event, file, line, id, binding, klass|
64       @backtrace.trace_func(event, file, line, id, binding)
65     }
66   end
67 end