class Mrubyc::Debugger::Window
Public Class Methods
method_missing(method_name, *args)
click to toggle source
Calls superclass method
# File lib/mrubyc/debugger/window.rb, line 96 def method_missing(method_name, *args) if $debug_queues $debug_queues[Thread.current[:index]] << { level: :error, body: "method_missing: #{self.class}##{method_name}" } else super end end
setup_models(models, stubs)
click to toggle source
# File lib/mrubyc/debugger/window.rb, line 84 def setup_models(models, stubs) models.each do |model| load model class_name = File.basename(model, '.rb').split('_').map(&:capitalize).join Kernel.const_get(class_name).class_eval do if stubs["classes"] && stubs["classes"][class_name] && stubs["classes"][class_name]["instance_methods"] stubs["classes"][class_name]["instance_methods"].each do |m| define_method(m["name"]) do eval m["value"] end end end def method_missing(method_name, *args) if $debug_queues $debug_queues[Thread.current[:index]] << { level: :error, body: "method_missing: #{self.class}##{method_name}" } else super end end end end end
start(mrblibs, delay)
click to toggle source
# File lib/mrubyc/debugger/window.rb, line 12 def start(mrblibs, delay) loops = mrblibs[:loops] $breakpoints = [] $debug_queues = [] $event_queues = [] $sleep_queues = [] loops.size.times do $debug_queues << Queue.new $event_queues << Queue.new $sleep_queues << Queue.new end $threads = [] temp_loops = [] loops.each_with_index do |loop, index| tempfile = Tempfile.new temp_loops << tempfile.path tempfile.puts "using DebugQueue; sleep 2" tempfile.puts File.read(loop) tempfile.close $threads << Thread.new(index) do Thread.current[:index] = index load temp_loops[index] end $debug_queues[index] << { level: :info, body: "loop: #{File.basename(loop)} started" } end $threads << Thread.new do console = Mrubyc::Debugger::Console.new(temp_loops) console.run end @@mutex = Mutex.new trace(temp_loops, delay).enable do $threads.each do|thr| thr.join end end end
trace(loops, delay)
click to toggle source
# File lib/mrubyc/debugger/window.rb, line 52 def trace(loops, delay) TracePoint.new(:c_call, :call, :line) do |tp| number = nil caller_locations(1, 1).each do |caller_location| loops.each_with_index do |loop, index| if caller_location.to_s.include?(File.basename(loop)) number = index break end end if number @@mutex.lock event = { method_id: tp.method_id, lineno: tp.lineno, caller_location: caller_location, tp_binding: tp.binding } # breakpoint will be duplicated if method_id is not nil (== event is not :line) if tp.method_id.nil? && $breakpoints.any?{|bp| bp == [number, tp.lineno - 1]} event[:breakpoint] = true end $event_queues[number].push event sleep delay if tp.event == :line # should stop after push event and sleep Thread.stop if event[:breakpoint] == true @@mutex.unlock end end end end