Class: DEBUGGER__::FrameInfo

Inherits:
Struct
  • Object
show all
Defined in:
lib/debug/frame_info.rb,
lib/debug/frame_info.rb

Constant Summary collapse

HOME =
ENV['HOME'] ? (ENV['HOME'] + '/') : nil
BLOCK_LABL_REGEXP =
/\Ablock( \(\d+ levels\))* in (.+)\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#_calleeObject

Returns the value of attribute _callee

Returns:

  • (Object)

    the current value of _callee



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def _callee
  @_callee
end

#_local_variablesObject

Returns the value of attribute _local_variables

Returns:

  • (Object)

    the current value of _local_variables



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def _local_variables
  @_local_variables
end

#bindingObject

Returns the value of attribute binding

Returns:

  • (Object)

    the current value of binding



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def binding
  @binding
end

#classObject

Returns the value of attribute class

Returns:

  • (Object)

    the current value of class



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def class
  @class
end

#dupped_bindingObject

Returns the value of attribute dupped_binding

Returns:

  • (Object)

    the current value of dupped_binding



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def dupped_binding
  @dupped_binding
end

#frame_depthObject

Returns the value of attribute frame_depth

Returns:

  • (Object)

    the current value of frame_depth



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def frame_depth
  @frame_depth
end

#has_raised_exceptionObject

Returns the value of attribute has_raised_exception

Returns:

  • (Object)

    the current value of has_raised_exception



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def has_raised_exception
  @has_raised_exception
end

#has_return_valueObject

Returns the value of attribute has_return_value

Returns:

  • (Object)

    the current value of has_return_value



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def has_return_value
  @has_return_value
end

#iseqObject

Returns the value of attribute iseq

Returns:

  • (Object)

    the current value of iseq



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def iseq
  @iseq
end

#locationObject

Returns the value of attribute location

Returns:

  • (Object)

    the current value of location



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def location
  @location
end

#raised_exceptionObject

Returns the value of attribute raised_exception

Returns:

  • (Object)

    the current value of raised_exception



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def raised_exception
  @raised_exception
end

#return_valueObject

Returns the value of attribute return_value

Returns:

  • (Object)

    the current value of return_value



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def return_value
  @return_value
end

#selfObject

Returns the value of attribute self

Returns:

  • (Object)

    the current value of self



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def self
  @self
end

#show_lineObject

Returns the value of attribute show_line

Returns:

  • (Object)

    the current value of show_line



4
5
6
# File 'lib/debug/frame_info.rb', line 4

def show_line
  @show_line
end

Class Method Details

.pretty_path(path) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/debug/frame_info.rb', line 30

def self.pretty_path path
  return '#<none>' unless path
  use_short_path = CONFIG[:use_short_path]

  case
  when use_short_path && path.start_with?(dir = RbConfig::CONFIG["rubylibdir"] + '/')
    path.sub(dir, '$(rubylibdir)/')
  when use_short_path && Gem.path.any? do |gp|
      path.start_with?(dir = gp + '/gems/')
    end
    path.sub(dir, '$(Gem)/')
  when HOME && path.start_with?(HOME)
    path.sub(HOME, '~/')
  else
    path
  end
end

Instance Method Details

#block_identifierObject



87
88
89
90
91
# File 'lib/debug/frame_info.rb', line 87

def block_identifier
  return unless frame_type == :block
  _, level, block_loc = location.label.match(BLOCK_LABL_REGEXP).to_a
  [level || "", block_loc]
end

#c_identifierObject



98
99
100
101
# File 'lib/debug/frame_info.rb', line 98

def c_identifier
  return unless frame_type == :c
  "[C] #{klass_sig}#{location.base_label}"
end

#calleeObject



108
109
110
111
112
113
114
# File 'lib/debug/frame_info.rb', line 108

def callee
  self._callee ||= begin
                     self.binding&.eval('__callee__')
                   rescue NameError # BasicObject
                     nil
                   end
end

#eval_bindingObject



131
132
133
134
135
136
137
138
# File 'lib/debug/frame_info.rb', line 131

def eval_binding
  if b = self.dupped_binding
    b
  else
    b = self.binding || TOPLEVEL_BINDING
    self.dupped_binding = b.dup
  end
end

#file_linesObject



67
68
69
# File 'lib/debug/frame_info.rb', line 67

def file_lines
  SESSION.source(self.iseq)
end

#frame_typeObject



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/debug/frame_info.rb', line 71

def frame_type
  if self.local_variables && iseq
    if iseq.type == :block
      :block
    elsif callee
      :method
    else
      :other
    end
  else
    :c
  end
end

#iseq_parameters_infoObject



150
151
152
153
154
155
156
157
# File 'lib/debug/frame_info.rb', line 150

def iseq_parameters_info
  case frame_type
  when :block, :method
    parameters_info
  else
    nil
  end
end

#local_variablesObject



140
141
142
143
144
145
146
147
148
# File 'lib/debug/frame_info.rb', line 140

def local_variables
  if lvars = self._local_variables
    lvars
  elsif b = self.binding
    b.local_variables.map{|var|
      [var, b.local_variable_get(var)]
    }.to_h
  end
end

#location_strObject



127
128
129
# File 'lib/debug/frame_info.rb', line 127

def location_str
  "#{pretty_path}:#{location.lineno}"
end

#matchable_locationObject



122
123
124
125
# File 'lib/debug/frame_info.rb', line 122

def matchable_location
  # realpath can sometimes be nil so we can't use it here
  "#{path}:#{location.lineno}"
end

#method_identifierObject



93
94
95
96
# File 'lib/debug/frame_info.rb', line 93

def method_identifier
  return unless frame_type == :method
  "#{klass_sig}#{callee}"
end

#nameObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/debug/frame_info.rb', line 52

def name
  # p frame_type: frame_type, self: self
  case frame_type
  when :block
    level, block_loc = block_identifier
    "block in #{block_loc}#{level}"
  when :method
    method_identifier
  when :c
    c_identifier
  when :other
    other_identifier
  end
end

#other_identifierObject



103
104
105
106
# File 'lib/debug/frame_info.rb', line 103

def other_identifier
  return unless frame_type == :other
  location.label
end

#parameters_infoObject



159
160
161
162
163
164
165
166
167
168
# File 'lib/debug/frame_info.rb', line 159

def parameters_info
  vars = iseq.parameters_symbols
  vars.map{|var|
    begin
      { name: var, value: DEBUGGER__.safe_inspect(local_variable_get(var), short: true) }
    rescue NameError, TypeError
      nil
    end
  }.compact
end

#pathObject



22
23
24
# File 'lib/debug/frame_info.rb', line 22

def path
  location.path
end

#pretty_pathObject



48
49
50
# File 'lib/debug/frame_info.rb', line 48

def pretty_path
  FrameInfo.pretty_path path
end

#realpathObject



26
27
28
# File 'lib/debug/frame_info.rb', line 26

def realpath
  location.absolute_path
end

#return_strObject



116
117
118
119
120
# File 'lib/debug/frame_info.rb', line 116

def return_str
  if self.binding && iseq && has_return_value
    DEBUGGER__.safe_inspect(return_value, short: true)
  end
end