1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | var Stack = module.exports = function Stack() {
|
15 | Array.apply(this, arguments);
|
16 | };
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | Stack.prototype.__proto__ = Array.prototype;
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | Stack.prototype.push = function(frame){
|
32 | frame.stack = this;
|
33 | frame.parent = this.currentFrame;
|
34 | return [].push.apply(this, arguments);
|
35 | };
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | Stack.prototype.__defineGetter__('currentFrame', function(){
|
45 | return this[this.length - 1];
|
46 | });
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | Stack.prototype.getBlockFrame = function(block){
|
57 | for (var i = 0; i < this.length; ++i) {
|
58 | if (block == this[i].block) {
|
59 | return this[i];
|
60 | }
|
61 | }
|
62 | };
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | Stack.prototype.lookup = function(name){
|
78 | var block = this.currentFrame.block
|
79 | , val
|
80 | , ret;
|
81 |
|
82 | do {
|
83 | var frame = this.getBlockFrame(block);
|
84 | if (frame && (val = frame.lookup(name))) {
|
85 | return val;
|
86 | }
|
87 | } while (block = block.parent);
|
88 | };
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | Stack.prototype.inspect = function(){
|
98 | return this.reverse().map(function(frame){
|
99 | return frame.inspect();
|
100 | }).join('\n');
|
101 | };
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 | Stack.prototype.toString = function(){
|
113 | var block
|
114 | , node
|
115 | , buf = []
|
116 | , location
|
117 | , len = this.length;
|
118 |
|
119 | while (len--) {
|
120 | block = this[len].block;
|
121 | if (node = block.node) {
|
122 | location = '(' + node.filename + ':' + (node.lineno + 1) + ':' + node.column + ')';
|
123 | switch (node.nodeName) {
|
124 | case 'function':
|
125 | buf.push(' at ' + node.name + '() ' + location);
|
126 | break;
|
127 | case 'group':
|
128 | buf.push(' at "' + node.nodes[0].val + '" ' + location);
|
129 | break;
|
130 | }
|
131 | }
|
132 | }
|
133 |
|
134 | return buf.join('\n');
|
135 | };
|