Skip to content

Commit

Permalink
Add initial version of debugger support
Browse files Browse the repository at this point in the history
Use Rubinus::Debugger but provide some fancy-specific output on method
names / signatures etc.
  • Loading branch information
bakkdoor committed Jun 3, 2012
1 parent 483730d commit 23d7672
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/main.fy
Expand Up @@ -21,6 +21,7 @@ if: (ARGV size == 1) then: {
" -e 'command' One line of Fancy code that gets evaluated immediately", " -e 'command' One line of Fancy code that gets evaluated immediately",
" -c [filenames] Compile given files to Rubinius bytecode", " -c [filenames] Compile given files to Rubinius bytecode",
" -cv [filenames] Compile given files to Rubinius bytecode verbosely (outputting the generated bytecode)", " -cv [filenames] Compile given files to Rubinius bytecode verbosely (outputting the generated bytecode)",
" -debug Start the Rubinius Debugger with Fancy",
"", "",
"Fancy package management:", "Fancy package management:",
" install [packagename] Install a Fancy package with a given name to $FANCYPACK_DIR", " install [packagename] Install a Fancy package with a given name to $FANCYPACK_DIR",
Expand Down Expand Up @@ -65,6 +66,10 @@ ARGV for_option: "-cv" do: {
System exit System exit
} }


ARGV for_option: "-debug" do: {
require: "rbx/debugger"
}

ARGV for_option: "install" do: |package_name| { ARGV for_option: "install" do: |package_name| {
match package_name { match package_name {
case "--deps" -> Fancy Package install_dependencies case "--deps" -> Fancy Package install_dependencies
Expand Down
1 change: 1 addition & 0 deletions lib/rbx.fy
Expand Up @@ -42,3 +42,4 @@ require: "rbx/actor"
require: "rbx/mutex" require: "rbx/mutex"
require: "rbx/module" require: "rbx/module"
require: "rbx/proc" require: "rbx/proc"
require: "rbx/compiled_method"
14 changes: 14 additions & 0 deletions lib/rbx/compiled_method.fy
@@ -0,0 +1,14 @@
class Rubinius CompiledMethod {
forwards_unary_ruby_methods

def selectors_with_args {
local_names = local_names to_a
if: (required_args > 0) then: {
name to_s split: ":" . map_with_index: |sel i| {
"#{sel}: #{local_names[i]}"
} . join: " "
} else: {
name to_s rest
}
}
}
72 changes: 72 additions & 0 deletions lib/rbx/debugger.fy
@@ -0,0 +1,72 @@
require("rubinius/debugger")

class Rubinius Debugger {
forwards_unary_ruby_methods
metaclass forwards_unary_ruby_methods
}

class Rubinius Debugger Command SetBreakPoint {
def match_method: method_identifier {
match method_identifier {
case /##/ ->
class_name, method_name = method_identifier split: "##"
method_identifier = "#{class_name}::#{method_name message_name}"
case /#/ ->
class_name, method_name = method_identifier split: "#"
method_identifier = "#{class_name}##{method_name message_name}"
}

/([A-Z]\w*(?:::[A-Z]\w*)*)([.#]|::)([a-zA-Z0-9_\[\]:]+[!?=]?)(?:[:](\d+))?/ match: method_identifier
}

alias_method('match_method, 'match_method:)
}

class Rubinius Location {
forwards_unary_ruby_methods
}

class Rubinius Debugger Frame {
forwards_unary_ruby_methods

def describe {
arg_str = ""
recv = nil
signature = method selectors_with_args

loc = @location

if: (loc is_block) then: {
if: (method required_args == 0) then: {
recv = "{ } in #{loc describe_receiver}#{loc name}"
} else: {
block_args = method local_names join: ", "
recv = "|#{block_args}| { } in #{loc describe_receiver}#{loc name}"
}
} else: {
if: (method required_args == 0) then: {
recv = loc describe
} else: {
recv = "#{loc describe}"
}
}

recv = recv replace: "#:" with: "#"
recv = recv replace: ".:" with: "##"
recv = recv replace: "." with: "##"

str = "#{recv} at #{loc method active_path}:#{loc line} (#{loc ip})"
{ str << " (+#{loc ip})" } if: $ @debugger variables['show_ip]
str
}

alias_method('describe, ':describe)

def run: code {
Fancy eval: (code to_s) binding: binding
}

alias_method('run, 'run:)
}

Rubinius Debugger start

0 comments on commit 23d7672

Please sign in to comment.