ruined 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ChangeLog CHANGED
@@ -1,36 +1,45 @@
1
- Thu Oct 14 20:14:00 2010 arton
2
- * ruined/ruinmain.rb
3
- version 0.0.5 => 0.0.7
4
- fix caller check
5
- Wed Oct 13 22:39:00 2010 arton
6
- * ruined/ruinmain.rb
7
- version 0.0.5 => 0.0.6
8
- support multi-thread app (but very limited)
9
- Wed Oct 13 21:01:00 2010 arton
10
- * Rakefile
11
- add BSDL into gem
12
- * ruined/html/main.html
13
- escape modified value
14
- * ruined/ruinmain.rb
15
- version 0.0.4 => 0.0.5
16
- escape stdout
17
- unescape modified value
18
- Tue Oct 12 00:17:00 2010 arton
19
- * BSDL
20
- * readme.txt
21
- license changed to dual (BSDL or (GPLv3 or later))
22
- * ruined/html/main.html
23
- support variable modification
24
- * ruined/ruinmain.rb
25
- support variable modification
26
- Mon Oct 11 21:25:00 2010 arton
27
- * lib/ruined/ruinmain.rb
28
- fix local vairable confliction with 'v'
29
- change version => 0.0.3 for new gem
30
- Mon Oct 11 18:38:00 2010 arton
31
- * lib/ruined/ruinmain.rb
32
- change version => 0.0.2 for new gem
33
- Mon Oct 11 15:51:00 2010 arton
34
- start brwoser (suggested by knu and n0kada, thanks)
35
- Mon Oct 11 01:37:00 2010 arton
36
- initial release
1
+ Sun Oct 17 19:09:00 2010 arton
2
+ * ruined/ruinmain.rb
3
+ version 0.0.5 => 0.0.8
4
+ retuens thread-list
5
+ * ruined/css/ruin.css
6
+ move style from main.html to here
7
+ * ruined/html/main.html
8
+ add thread list pane.
9
+ adjust some styles.
10
+ Thu Oct 14 20:14:00 2010 arton
11
+ * ruined/ruinmain.rb
12
+ version 0.0.5 => 0.0.7
13
+ fix caller check
14
+ Wed Oct 13 22:39:00 2010 arton
15
+ * ruined/ruinmain.rb
16
+ version 0.0.5 => 0.0.6
17
+ support multi-thread app (but very limited)
18
+ Wed Oct 13 21:01:00 2010 arton
19
+ * Rakefile
20
+ add BSDL into gem
21
+ * ruined/html/main.html
22
+ escape modified value
23
+ * ruined/ruinmain.rb
24
+ version 0.0.4 => 0.0.5
25
+ escape stdout
26
+ unescape modified value
27
+ Tue Oct 12 00:17:00 2010 arton
28
+ * BSDL
29
+ * readme.txt
30
+ license changed to dual (BSDL or (GPLv3 or later))
31
+ * ruined/html/main.html
32
+ support variable modification
33
+ * ruined/ruinmain.rb
34
+ support variable modification
35
+ Mon Oct 11 21:25:00 2010 arton
36
+ * lib/ruined/ruinmain.rb
37
+ fix local vairable confliction with 'v'
38
+ change version => 0.0.3 for new gem
39
+ Mon Oct 11 18:38:00 2010 arton
40
+ * lib/ruined/ruinmain.rb
41
+ change version => 0.0.2 for new gem
42
+ Mon Oct 11 15:51:00 2010 arton
43
+ start brwoser (suggested by knu and n0kada, thanks)
44
+ Mon Oct 11 01:37:00 2010 arton
45
+ initial release
@@ -9,6 +9,10 @@ pre {
9
9
  margin-top: 0.5em;
10
10
  }
11
11
 
12
+ td.numtd {
13
+ text-align: right;
14
+ }
15
+
12
16
  table {
13
17
  border-spacing: 0;
14
18
  }
@@ -25,9 +29,11 @@ table.vars td {
25
29
  div.list-pane {
26
30
  float: left;
27
31
  width: 60%;
32
+ height: 60%;
28
33
  }
29
34
 
30
- div.vars-pnae {
35
+ div.vars-pane {
36
+ height: 60%;
31
37
  }
32
38
 
33
39
  div#button-panel {
@@ -52,7 +58,25 @@ div#vars {
52
58
  height: 520px;
53
59
  }
54
60
 
61
+ div.proc-pane {
62
+ clear: both;
63
+ height: 30%;
64
+ }
65
+
55
66
  div#output {
56
67
  overflow: scroll;
57
68
  height: 120px;
69
+ float: left;
70
+ width: 60%;
71
+ }
72
+
73
+ div#threads {
74
+ overflow: scroll;
75
+ height: 120px;
76
+ }
77
+
78
+ div.footer {
79
+ clear: both;
80
+ margin-bottom: 0;
81
+ height: 5%;
58
82
  }
@@ -1,231 +1,244 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html> <head>
3
- <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
4
- <meta http-equiv="content-style-type" content="text/css"/>
5
- <title></title>
6
- <link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.5.custom.css"></link>
7
- <link rel="stylesheet" href="../css/ruin.css"></link>
8
- <script type="text/javascript" src="../js/jquery-1.4.2.min.js"></script>
9
- <script type="text/javascript" src="../js/jquery-ui-1.8.5.custom.min.js"></script>
10
- <script type="text/javascript">
11
- var files = new Object();
12
- var priorLine = { line: null, index: null };
13
- var interval = 1000;
14
- var contTimer = null;
15
- function addFile(name, line, command) {
16
- var a = name.split('/');
17
- $('#lists').tabs('add' , '/debug/file/' + name , a[a.length - 1]);
18
- var index = $('#lists').tabs('length') - 1;
19
- $('#lists').tabs('select', index);
20
- $('td').bind('click', function(ev) {
21
- var sub = 'false';
22
- if (ev.currentTarget.style.backgroundColor == '') {
23
- sub = 'true';
24
- }
25
- var index = $('#lists').tabs('option', 'selected');
26
- var key, file;
27
- for (key in files) {
28
- if (files[key] == index) {
29
- file = key;
30
- break;
31
- }
32
- }
33
- if (file != null) {
34
- var line = 0;
35
- var list = $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td');
36
- for (var i = 0; i < list.length; i++) {
37
- if (list[i] == ev.currentTarget) {
38
- line = i + 1;
39
- break;
40
- }
41
- }
42
- $.get('/debug/break/' + sub + '/' + file + '/' + line, function() {
43
- var bgclr = '';
44
- var clr = '';
45
- if (sub == 'true') {
46
- bgclr = 'saddlebrown';
47
- clr = 'white';
48
- }
49
- ev.currentTarget.style.backgroundColor = bgclr;
50
- ev.currentTarget.style.color = clr;
51
- });
52
- }
53
- });
54
- return index;
55
- }
56
- function changeTab(index) {
57
- $('#lists').tabs('select', index);
58
- }
59
- function lineColor(command, brk) {
60
- if (command == 'cont' && !brk) {
61
- return 'aquamarine';
62
- }
63
- return 'yellow';
64
- }
65
- function stopRun() {
66
- clearTimeout(contTimer);
67
- contTimer = null;
68
- $('#run').button('option', 'label', 'run');
69
- }
70
- function setLine(index, line, command, brk) {
71
- if (line > 0) {
72
- --line;
73
- }
74
- if (priorLine.index != null) {
75
- var style = $('#ui-tabs-' + (priorLine.index * 2 + 2) + ' > table > tbody > tr > td')[priorLine.line].style;
76
- style.backgroundColor = priorLine.backgroundColor;
77
- style.color = priorLine.color;
78
- }
79
- var style = $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td')[line].style;
80
- priorLine.index = index;
81
- priorLine.line = line;
82
- priorLine.color = style.color;
83
- priorLine.backgroundColor = style.backgroundColor;
84
- style.backgroundColor = lineColor(command, brk);
85
- style.color = '';
86
- $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td')[line].scrollIntoView(true);
87
- }
88
- function stepProc(command) {
89
- $.getJSON('/debug/' + command, function(data) {
90
- if (data == null || data.file == null) {
91
- if (contTimer != null) stopRun();
92
- $('button').button('disable');
93
- return;
94
- }
95
- if (data['break'] || data['event'] == 'exit') {
96
- stopRun();
97
- if (data['event'] == 'exit') {
98
- $('button').button('disable');
99
- $('#vars').tabs({
100
- show: function(envet, ui) {
101
- alert('program terminated');
102
- }
103
- });
104
- alert('program exit');
105
- }
106
- }
107
- if (files[data.file] == null) {
108
- files[data.file] = addFile(data.file, data.line, command);
109
- } else {
110
- changeTab(files[data.file]);
111
- }
112
- setLine(files[data.file], data.line, command, data['break']);
113
- $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
114
- var span = document.createElement('span');
115
- span.innerHTML = data.stdout;
116
- $('#stdout')[0].appendChild(span);
117
- span = document.createElement('span');
118
- $('#stdout')[0].appendChild(span);
119
- span.scrollIntoView(true);
120
- });
121
- }
122
- function contProc(command) {
123
- stepProc(command);
124
- contTimer = setTimeout('contProc("' + command + '");', interval);
125
- }
126
- function initTabs(elm) {
127
- elm.tabs();
128
- elm.tabs({ajaxOptions: {async: false}});
129
- elm.tabs('option', 'cache', true);
130
- }
131
- $(document).ready(function() {
132
- initTabs($('#lists'));
133
- initTabs($('#vars'));
134
- $('#vars').tabs({
135
- show: function(envet, ui) {
136
- $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
137
- },
138
- load: function(event, ui) {
139
- $('.var-value').dblclick(function(e) {
140
- var v = e.currentTarget.innerHTML;
141
- e.currentTarget.innerHTML = '<input type="text" value="' + v + '"/>';
142
- setTimeout(function() {
143
- e.currentTarget.childNodes.item(0).focus();
144
- $(e.currentTarget.childNodes.item(0)).focusout(function(ev) {
145
- var loc = 'locals/';
146
- if ($('#vars').tabs('option', 'selected') == 1) {
147
- loc = 'self/';
148
- } else if ($('#vars').tabs('option', 'selected') == 2) {
149
- loc = 'globals/';
150
- }
151
- var url = '/debug/' + loc
152
- + encodeURIComponent(e.currentTarget.previousSibling.innerHTML)
153
- + '/' + encodeURIComponent(ev.currentTarget.value);
154
- e.currentTarget.innerHTML = ev.currentTarget.value;
155
- $.get(url, function() {
156
- $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
157
- });
158
- });
159
- }, 0);
160
- });
161
- }
162
- });
163
- $('#intval').slider();
164
- $('#intval').slider('option', 'value', 10);
165
- $('#intval').slider({
166
- change: function(e, ui) {
167
- interval = $('#intval').slider('option', 'value') * 100;
168
- }
169
- });
170
- $.ajaxSetup({cache: false});
171
-
172
- $('button').button();
173
- $('#run').click(function() {
174
- if (contTimer == null) {
175
- contProc('cont');
176
- $('#run').button('option', 'label', 'stop');
177
- } else {
178
- stopRun();
179
- }
180
- });
181
- $('#step').click(function() {
182
- stepProc('step');
183
- });
184
- $('#waiting').ajaxError(function() {
185
- if (contTimer != null) {
186
- stopRun();
187
- }
188
- });
189
- stepProc('stepping');
190
- });
191
- </script>
192
- </head>
193
- <body>
194
- <div class="list-pane">
195
- <div id="button-panel">
196
- <div class="console">
197
- <button id="step">Step</button>
198
- <button id="run">Run</button>
199
- </div>
200
- </div>
201
- <div id="speed-panel">
202
- <div id="intval"></div>
203
- <div style="float: left; width: 50%">fast &lt;----</div>
204
- <div style="float: right">----&gt; slow</div>
205
- </div>
206
- <div id="lists" style="clear: both">
207
- <ul></ul>
208
- </div>
209
- </div>
210
- <div class="vars-pane">
211
- <div id="vars">
212
- <ul>
213
- <li><a href="/debug/locals" title="Local Vars"><span>Local Vars</span></a></li>
214
- <li><a href="/debug/self" title="Self Vars"><span>Self Vars</span></a></li>
215
- <li><a href="/debug/globals" title="Global Vars"><span>Global Vars</span></a></li>
216
- </ul>
217
- <div id="Local_Vars"></div>
218
- <div id="Self_Vars"></div>
219
- <div id="Global_Vars"></div>
220
- </div>
221
- </div>
222
- <div style="clear: both;">
223
- <div id="output">
224
- <span id="stdout"></span>
225
- </div>
226
- <hr>
227
- <div id="waiting"></div>
228
- <address id="ruby-platform"></address>
229
- <!-- hhmts start --> Last modified: Wed Oct 13 11:09:42 +0900 2010 <!-- hhmts end -->
230
- </div>
231
- </body> </html>
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html> <head>
3
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
4
+ <meta http-equiv="content-style-type" content="text/css"/>
5
+ <title></title>
6
+ <link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.5.custom.css"></link>
7
+ <link rel="stylesheet" href="../css/ruin.css"></link>
8
+ <script type="text/javascript" src="../js/jquery-1.4.2.min.js"></script>
9
+ <script type="text/javascript" src="../js/jquery-ui-1.8.5.custom.min.js"></script>
10
+ <script type="text/javascript">
11
+ var files = new Object();
12
+ var priorLine = { line: null, index: null };
13
+ var interval = 1000;
14
+ var contTimer = null;
15
+ function addFile(name, line, command) {
16
+ var a = name.split('/');
17
+ $('#lists').tabs('add' , '/debug/file/' + name , a[a.length - 1]);
18
+ var index = $('#lists').tabs('length') - 1;
19
+ $('#lists').tabs('select', index);
20
+ $('td').bind('click', function(ev) {
21
+ var sub = 'false';
22
+ if (ev.currentTarget.style.backgroundColor == '') {
23
+ sub = 'true';
24
+ }
25
+ var index = $('#lists').tabs('option', 'selected');
26
+ var key, file;
27
+ for (key in files) {
28
+ if (files[key] == index) {
29
+ file = key;
30
+ break;
31
+ }
32
+ }
33
+ if (file != null) {
34
+ var line = 0;
35
+ var list = $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td');
36
+ for (var i = 0; i < list.length; i++) {
37
+ if (list[i] == ev.currentTarget) {
38
+ line = i + 1;
39
+ break;
40
+ }
41
+ }
42
+ $.get('/debug/break/' + sub + '/' + file + '/' + line, function() {
43
+ var bgclr = '';
44
+ var clr = '';
45
+ if (sub == 'true') {
46
+ bgclr = 'saddlebrown';
47
+ clr = 'white';
48
+ }
49
+ ev.currentTarget.style.backgroundColor = bgclr;
50
+ ev.currentTarget.style.color = clr;
51
+ });
52
+ }
53
+ });
54
+ return index;
55
+ }
56
+ function changeTab(index) {
57
+ $('#lists').tabs('select', index);
58
+ }
59
+ function lineColor(command, brk) {
60
+ if (command == 'cont' && !brk) {
61
+ return 'aquamarine';
62
+ }
63
+ return 'yellow';
64
+ }
65
+ function stopRun() {
66
+ clearTimeout(contTimer);
67
+ contTimer = null;
68
+ $('#run').button('option', 'label', 'run');
69
+ }
70
+ function setLine(index, line, command, brk) {
71
+ if (line > 0) {
72
+ --line;
73
+ }
74
+ if (priorLine.index != null) {
75
+ var style = $('#ui-tabs-' + (priorLine.index * 2 + 2) + ' > table > tbody > tr > td')[priorLine.line].style;
76
+ style.backgroundColor = priorLine.backgroundColor;
77
+ style.color = priorLine.color;
78
+ }
79
+ var style = $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td')[line].style;
80
+ priorLine.index = index;
81
+ priorLine.line = line;
82
+ priorLine.color = style.color;
83
+ priorLine.backgroundColor = style.backgroundColor;
84
+ style.backgroundColor = lineColor(command, brk);
85
+ style.color = '';
86
+ $('#ui-tabs-' + (index * 2 + 2) + ' > table > tbody > tr > td')[line].scrollIntoView(true);
87
+ }
88
+ function stepProc(command) {
89
+ $.getJSON('/debug/' + command, function(data) {
90
+ if (data == null || data.file == null) {
91
+ if (contTimer != null) stopRun();
92
+ $('button').button('disable');
93
+ return;
94
+ }
95
+ if (data['break'] || data['event'] == 'exit') {
96
+ stopRun();
97
+ if (data['event'] == 'exit') {
98
+ $('button').button('disable');
99
+ $('#vars').tabs({
100
+ show: function(envet, ui) {
101
+ alert('program terminated');
102
+ }
103
+ });
104
+ alert('program exit');
105
+ }
106
+ }
107
+ if (files[data.file] == null) {
108
+ files[data.file] = addFile(data.file, data.line, command);
109
+ } else {
110
+ changeTab(files[data.file]);
111
+ }
112
+ setLine(files[data.file], data.line, command, data['break']);
113
+ $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
114
+ var s = '<table class="vars"><tr><th>br</th><th>File</th><th>Line</th><th>Status</th></tr>';
115
+ for (var i = 0; i < data.threads.length; i++) {
116
+ if (data.threads.length > 1) {
117
+ }
118
+ var t = data.threads[i][0];
119
+ s += '<tr><td>' + (t.self ? '*' : '') + '</td><td>' + t.file + '</td><td class="numtd">' + t.line
120
+ + '</td><td>' + t.status + '</td></tr>';
121
+ }
122
+ $('#tlist')[0].innerHTML = s + '</table>';
123
+ var span = document.createElement('span');
124
+ span.innerHTML = data.stdout;
125
+ $('#stdout')[0].appendChild(span);
126
+ span = document.createElement('span');
127
+ $('#stdout')[0].appendChild(span);
128
+ span.scrollIntoView(true);
129
+ });
130
+ }
131
+ function contProc(command) {
132
+ stepProc(command);
133
+ contTimer = setTimeout('contProc("' + command + '");', interval);
134
+ }
135
+ function initTabs(elm) {
136
+ elm.tabs();
137
+ elm.tabs({ajaxOptions: {async: false}});
138
+ elm.tabs('option', 'cache', true);
139
+ }
140
+ $(document).ready(function() {
141
+ initTabs($('#lists'));
142
+ initTabs($('#vars'));
143
+ $('#vars').tabs({
144
+ show: function(envet, ui) {
145
+ $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
146
+ },
147
+ load: function(event, ui) {
148
+ $('.var-value').dblclick(function(e) {
149
+ var v = e.currentTarget.innerHTML;
150
+ e.currentTarget.innerHTML = '<input type="text" value="' + v + '"/>';
151
+ setTimeout(function() {
152
+ e.currentTarget.childNodes.item(0).focus();
153
+ $(e.currentTarget.childNodes.item(0)).focusout(function(ev) {
154
+ var loc = 'locals/';
155
+ if ($('#vars').tabs('option', 'selected') == 1) {
156
+ loc = 'self/';
157
+ } else if ($('#vars').tabs('option', 'selected') == 2) {
158
+ loc = 'globals/';
159
+ }
160
+ var url = '/debug/' + loc
161
+ + encodeURIComponent(e.currentTarget.previousSibling.innerHTML)
162
+ + '/' + encodeURIComponent(ev.currentTarget.value);
163
+ e.currentTarget.innerHTML = ev.currentTarget.value;
164
+ $.get(url, function() {
165
+ $('#vars').tabs('load', $('#vars').tabs('option', 'selected'));
166
+ });
167
+ });
168
+ }, 0);
169
+ });
170
+ }
171
+ });
172
+ $('#intval').slider();
173
+ $('#intval').slider('option', 'value', 10);
174
+ $('#intval').slider({
175
+ change: function(e, ui) {
176
+ interval = $('#intval').slider('option', 'value') * 100;
177
+ }
178
+ });
179
+ $.ajaxSetup({cache: false});
180
+
181
+ $('button').button();
182
+ $('#run').click(function() {
183
+ if (contTimer == null) {
184
+ contProc('cont');
185
+ $('#run').button('option', 'label', 'stop');
186
+ } else {
187
+ stopRun();
188
+ }
189
+ });
190
+ $('#step').click(function() {
191
+ stepProc('step');
192
+ });
193
+ $('#waiting').ajaxError(function() {
194
+ if (contTimer != null) {
195
+ stopRun();
196
+ }
197
+ });
198
+ stepProc('stepping');
199
+ });
200
+ </script>
201
+ </head>
202
+ <body>
203
+ <div class="list-pane">
204
+ <div id="button-panel">
205
+ <div class="console">
206
+ <button id="step">Step</button>
207
+ <button id="run">Run</button>
208
+ </div>
209
+ </div>
210
+ <div id="speed-panel">
211
+ <div id="intval"></div>
212
+ <div style="float: left; width: 50%">fast &lt;----</div>
213
+ <div style="float: right">----&gt; slow</div>
214
+ </div>
215
+ <div id="lists" style="clear: both">
216
+ <ul></ul>
217
+ </div>
218
+ </div>
219
+ <div class="vars-pane">
220
+ <div id="vars">
221
+ <ul>
222
+ <li><a href="/debug/locals" title="Local Vars"><span>Local Vars</span></a></li>
223
+ <li><a href="/debug/self" title="Self Vars"><span>Self Vars</span></a></li>
224
+ <li><a href="/debug/globals" title="Global Vars"><span>Global Vars</span></a></li>
225
+ </ul>
226
+ <div id="Local_Vars"></div>
227
+ <div id="Self_Vars"></div>
228
+ <div id="Global_Vars"></div>
229
+ </div>
230
+ </div>
231
+ <div class="proc-pane">
232
+ <div id="output">
233
+ <span id="stdout"></span>
234
+ </div>
235
+ <div id="threads">
236
+ <span id="tlist"></span>
237
+ </div>
238
+ <div class="footer">
239
+ <hr>
240
+ <div id="waiting"></div>
241
+ <address id="ruby-platform"></address>
242
+ <!-- hhmts start --> Last modified: Sun Oct 17 19:05:48 +0900 2010 <!-- hhmts end -->
243
+ </div>
244
+ </body> </html>
@@ -9,14 +9,15 @@ require 'monitor'
9
9
  require 'stringio'
10
10
 
11
11
  module Ruined
12
- RUINED_VERSION = '0.0.7'
12
+ RUINED_VERSION = '0.0.8'
13
13
 
14
14
  @queue = [Queue.new, Queue.new]
15
15
  @breakpoints = []
16
16
  @monitor = Monitor.new
17
17
  IGNORES = [:$&, :$', :$+, :$_, :$`, :$~, :$KCODE, :$= ]
18
18
  @unbreakable_threads = []
19
-
19
+ @user_threads = { }
20
+
20
21
  class <<Thread
21
22
  alias :_original_start :start
22
23
  def start(&proc)
@@ -48,7 +49,7 @@ module Ruined
48
49
  end
49
50
  def to_hash
50
51
  { :event => @event, :file => @file, :line => @line, :id => @iid, :break => @break,
51
- :stdout => @stdout }
52
+ :stdout => @stdout, :threads => Ruined.user_threads(self) }
52
53
  end
53
54
  attr_reader :tlses, :file, :line, :iid, :binding, :break
54
55
  attr_accessor :event, :stdout
@@ -183,7 +184,7 @@ module Ruined
183
184
  end
184
185
 
185
186
  def self.current_context
186
- # assert @current
187
+ raise RuntimeException.new('bug: no context !!') unless @current
187
188
  @current.to_hash
188
189
  end
189
190
 
@@ -290,6 +291,28 @@ EOD
290
291
  def self.local_call?(addr)
291
292
  ['127.0.0.1', '::1'].include?(addr[3])
292
293
  end
294
+
295
+ def self.user_threads(current)
296
+ r = []
297
+ @monitor.synchronize {
298
+ @user_threads.each do |t, c|
299
+ r << [:file => File.basename(c.file), :line => c.line,
300
+ :self => (c == current),
301
+ :status => status_to_s(t.status)]
302
+ end
303
+ r
304
+ }
305
+ end
306
+
307
+ def self.status_to_s(s)
308
+ if s.nil?
309
+ 'dead'
310
+ elsif s == false
311
+ 'aborted'
312
+ else
313
+ s
314
+ end
315
+ end
293
316
 
294
317
  svr.mount('/debug', DebugServlet)
295
318
  svr.mount_proc('/quit') do |req, res|
@@ -328,7 +351,7 @@ EOD
328
351
  end
329
352
  b = breakpoints.include? [file, line]
330
353
  ctxt = @monitor.synchronize {
331
- Context.new(event, file, line, id, binding, b, output)
354
+ @user_threads[Thread.current] = Context.new(event, file, line, id, binding, b, output)
332
355
  }
333
356
  svr.logger.debug(ctxt.inspect)
334
357
  release 1, ctxt
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruined
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - arton
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-14 00:00:00 +09:00
18
+ date: 2010-10-17 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies: []
21
21