mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 03:26:00 -07:00
167 lines
3.3 KiB
Ruby
167 lines
3.3 KiB
Ruby
module Rubinius
|
|
class Location
|
|
|
|
attr_reader :method
|
|
attr_reader :name
|
|
|
|
attr_reader :ip
|
|
attr_reader :variables
|
|
attr_reader :lexical_scope
|
|
|
|
def self.of_closest_ruby_method
|
|
Rubinius.primitive :location_of_closest_ruby_method
|
|
raise PrimitiveFailure, "Location.of_closest_ruby_method primitive failed"
|
|
end
|
|
|
|
def is_block
|
|
@flags & 1 == 1
|
|
end
|
|
|
|
def is_jit
|
|
@flags & 2 == 2
|
|
end
|
|
|
|
def ip_on_current?
|
|
@flags & 4 == 4
|
|
end
|
|
|
|
def inlined?
|
|
@name.nil?
|
|
end
|
|
|
|
def describe_receiver
|
|
# We can't call @receiver.class because it might be overriden (or in
|
|
# the case of Mocha, mocked out) and easily causes stack overflows
|
|
klass = Rubinius::Type.object_class @receiver
|
|
|
|
if @method_module.equal?(Kernel)
|
|
"Kernel."
|
|
elsif Rubinius::Type.object_kind_of?(@method_module, Class) and
|
|
ao = Rubinius::Type.singleton_class_object(@method_module)
|
|
"#{ao}."
|
|
elsif @method_module and @method_module != klass
|
|
"#{@method_module}(#{klass})#"
|
|
else
|
|
"#{klass}#"
|
|
end
|
|
end
|
|
|
|
def describe
|
|
if is_block
|
|
"{ } in #{describe_receiver}#{describe_method}"
|
|
else
|
|
"#{describe_receiver}#{describe_method}"
|
|
end
|
|
end
|
|
|
|
def inspect
|
|
"#<Rubinius::Location #{describe}>"
|
|
end
|
|
|
|
def describe_method
|
|
if is_block or @name == @method.name
|
|
@name.to_s
|
|
elsif !@name # inlined methods have no name
|
|
@method.name.to_s
|
|
else
|
|
"#{@name} (#{@method.name})"
|
|
end
|
|
end
|
|
|
|
# Current line being executed by the VM.
|
|
def line
|
|
return 0 unless @method
|
|
|
|
ip = @ip
|
|
ip -= 1 unless ip_on_current?
|
|
|
|
return @method.first_line unless ip > 0
|
|
|
|
@method.line_from_ip(ip)
|
|
end
|
|
|
|
def file(relative_to=nil)
|
|
path = @method.active_path
|
|
|
|
if relative_to
|
|
# Be sure we can bail out if something doesn't work and still
|
|
# show something.
|
|
begin
|
|
full = File.expand_path path
|
|
if full.prefix? relative_to
|
|
return full[relative_to.size+1..-1]
|
|
else
|
|
return path
|
|
end
|
|
rescue StandardError
|
|
return path
|
|
end
|
|
end
|
|
|
|
path
|
|
end
|
|
|
|
##
|
|
# Place in the source that this method was created at.
|
|
def position(relative_to=nil)
|
|
l = line()
|
|
|
|
if l == 0
|
|
if @ip < 0
|
|
file(relative_to)
|
|
else
|
|
"#{file(relative_to)}+#{@ip}"
|
|
end
|
|
else
|
|
"#{file(relative_to)}:#{l}"
|
|
end
|
|
end
|
|
|
|
# See Rubinius::Backtrace.backtrace
|
|
class Missing
|
|
def describe
|
|
"*** Missing backtrace! Did the VM not create one? ***"
|
|
end
|
|
|
|
def describe_receiver
|
|
"missing_backtrace_unknown_receiver"
|
|
end
|
|
|
|
def describe_method
|
|
"missing_backtrace_unknown_location"
|
|
end
|
|
|
|
def method
|
|
"missing_backtrace_unknown_location"
|
|
end
|
|
|
|
def line
|
|
"<no line>"
|
|
end
|
|
|
|
def position(dir=nil)
|
|
"<no file>"
|
|
end
|
|
|
|
def ip
|
|
0
|
|
end
|
|
|
|
def name
|
|
"missing_backtrace_unknown_name"
|
|
end
|
|
|
|
def is_block
|
|
false
|
|
end
|
|
|
|
def is_jit
|
|
false
|
|
end
|
|
|
|
def inlined?
|
|
false
|
|
end
|
|
end
|
|
end
|
|
end
|