Module: Ruined

Includes:
WEBrick
Defined in:
lib/ruined/ruinmain.rb

Defined Under Namespace

Classes: Context, DebugServlet, Thread

Constant Summary collapse

RUINED_VERSION =
'0.0.9'
IGNORES =
[:$&, :$', :$+, :$_, :$`, :$~, :$KCODE, :$= ]

Class Method Summary collapse

Class Method Details

.add_unbreakable(t) ⇒ Object



273
274
275
276
277
# File 'lib/ruined/ruinmain.rb', line 273

def self.add_unbreakable(t)
  @monitor.synchronize {
    @unbreakable_threads << t
  }
end

.breakpointsObject



191
192
193
# File 'lib/ruined/ruinmain.rb', line 191

def self.breakpoints
  @breakpoints
end

.current_contextObject

Raises:

  • (RuntimeException)


186
187
188
189
# File 'lib/ruined/ruinmain.rb', line 186

def self.current_context
  raise RuntimeException.new('bug: no context !!') unless @current
  @current.to_hash
end

.global_varsObject



217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/ruined/ruinmain.rb', line 217

def self.global_vars
  script = <<EOD
(global_variables - Ruined::IGNORES).map do |v|
if v.to_s =~ /\\A\\$[1-9]/
  nil
else
  { :name => v.to_s, :value => eval(v.to_s) }
end
end - [nil]
EOD
  a = eval(script)
  if @current
    0.upto(a.size - 1) do |i|
      if @current.tlses.has_key?(a[i][:name])
        a[i][:value] = @current.tlses[a[i][:name]]
      end
    end
  end
  a
end

.local_call?(addr) ⇒ Boolean

Returns:

  • (Boolean)


291
292
293
# File 'lib/ruined/ruinmain.rb', line 291

def self.local_call?(addr)
  ['127.0.0.1', '::1'].include?(addr[3])
end

.local_varsObject



195
196
197
198
199
200
201
202
# File 'lib/ruined/ruinmain.rb', line 195

def self.local_vars
  script = <<EOD
local_variables.map do |_0|
(_0 == :_) ? nil : { :name => _0.to_s, :value => eval(_0.to_s) }
end - [nil]
EOD
  (@current) ? eval(script, @current.binding) : []
end

.loggerObject

.outputObject



261
262
263
264
265
266
267
268
269
270
271
# File 'lib/ruined/ruinmain.rb', line 261

def self.output
  return '' unless StringIO === $stdout
  out = $stdout
  $stdout = StringIO.new
  out.pos = 0
  ret = ''
  out.each_line do |x|
    ret << "#{HTMLUtils.escape(x.chomp)}<br/>"
  end
  ret
end

.release(t, obj = nil) ⇒ Object



252
253
254
255
256
257
258
259
# File 'lib/ruined/ruinmain.rb', line 252

def self.release(t, obj = nil)
  return unless @queue
  logger.debug("------------release #{t}")
  @monitor.synchronize {    
    @queue[t].push obj
  }
  logger.debug("------------release exit #{t}")
end

.remove_unbreakable(t) ⇒ Object



279
280
281
282
283
# File 'lib/ruined/ruinmain.rb', line 279

def self.remove_unbreakable(t)
  @monitor.synchronize {
    @unbreakable_threads.delete t
  }
end

.self_varsObject



204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/ruined/ruinmain.rb', line 204

def self.self_vars
  script = <<EOD
[{ :name => 'class', :value => self.class.to_s }] +
instance_variables.map do |v|
{ :name => v.to_s, :value => instance_eval(v.to_s) }
end +
self.class.class_variables.map do |v|
{ :name => v.to_s, :value => instance_eval(v.to_s) }
end
EOD
  (@current) ? eval(script, @current.binding) : []    
end

.set(var, val) ⇒ Object



238
239
240
# File 'lib/ruined/ruinmain.rb', line 238

def self.set(var, val)
  eval("#{var} = #{val}", @current.binding)
end

.status_to_s(s) ⇒ Object



307
308
309
310
311
312
313
314
315
# File 'lib/ruined/ruinmain.rb', line 307

def self.status_to_s(s)
  if s.nil?
    'aborted'
  elsif s == false
    'dead'
  else
    s
  end
end

.unbreakable?(t) ⇒ Boolean

Returns:

  • (Boolean)


285
286
287
288
289
# File 'lib/ruined/ruinmain.rb', line 285

def self.unbreakable?(t)
  @monitor.synchronize {
    @unbreakable_threads.include? t
  }
end

.user_threads(current) ⇒ Object



295
296
297
298
299
300
301
302
303
304
305
# File 'lib/ruined/ruinmain.rb', line 295

def self.user_threads(current)
  r = []
  @monitor.synchronize {                
    @user_threads.each do |t, c|
      r << [:file => File.basename(c.file), :line => c.line, 
            :self => (c == current),
            :status => status_to_s(t.status)]
    end
    r
  }
end

.wait(t) ⇒ Object



242
243
244
245
246
247
248
249
250
# File 'lib/ruined/ruinmain.rb', line 242

def self.wait(t)
  return unless @queue    
  logger.debug("------------wait #{t}")
  o = @queue[t].pop
  if t == 1
    @current = o
  end
  logger.debug("------------wait exit #{t}")
end