readapt 1.4.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +38 -0
- data/.gitignore +16 -16
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +103 -100
- data/Gemfile +4 -4
- data/LICENSE.txt +21 -21
- data/README.md +37 -37
- data/Rakefile +14 -14
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/exe/readapt +5 -5
- data/ext/readapt/breakpoints.c +83 -83
- data/ext/readapt/breakpoints.h +11 -11
- data/ext/readapt/extconf.rb +0 -0
- data/ext/readapt/frame.c +137 -137
- data/ext/readapt/frame.h +17 -17
- data/ext/readapt/inspector.c +51 -51
- data/ext/readapt/inspector.h +8 -8
- data/ext/readapt/lookup_table.c +211 -211
- data/ext/readapt/lookup_table.h +30 -30
- data/ext/readapt/monitor.c +0 -0
- data/ext/readapt/monitor.h +0 -0
- data/ext/readapt/normalize.c +62 -62
- data/ext/readapt/normalize.h +7 -7
- data/ext/readapt/readapt.c +18 -18
- data/ext/readapt/stack.c +86 -86
- data/ext/readapt/stack.h +20 -20
- data/ext/readapt/threads.c +1 -1
- data/ext/readapt/threads.h +0 -0
- data/lib/readapt/adapter.rb +98 -98
- data/lib/readapt/breakpoint.rb +21 -21
- data/lib/readapt/data_reader.rb +62 -62
- data/lib/readapt/debugger.rb +227 -227
- data/lib/readapt/error.rb +63 -63
- data/lib/readapt/finder.rb +34 -34
- data/lib/readapt/frame.rb +40 -40
- data/lib/readapt/input.rb +7 -7
- data/lib/readapt/message/attach.rb +11 -11
- data/lib/readapt/message/base.rb +32 -32
- data/lib/readapt/message/configuration_done.rb +11 -11
- data/lib/readapt/message/continue.rb +15 -15
- data/lib/readapt/message/disconnect.rb +13 -13
- data/lib/readapt/message/evaluate.rb +19 -19
- data/lib/readapt/message/initialize.rb +21 -21
- data/lib/readapt/message/launch.rb +11 -11
- data/lib/readapt/message/next.rb +12 -12
- data/lib/readapt/message/pause.rb +11 -11
- data/lib/readapt/message/scopes.rb +26 -26
- data/lib/readapt/message/set_breakpoints.rb +25 -25
- data/lib/readapt/message/set_exception_breakpoints.rb +11 -11
- data/lib/readapt/message/stack_trace.rb +38 -38
- data/lib/readapt/message/step_in.rb +11 -11
- data/lib/readapt/message/step_out.rb +11 -11
- data/lib/readapt/message/threads.rb +18 -18
- data/lib/readapt/message/variables.rb +53 -53
- data/lib/readapt/message.rb +62 -62
- data/lib/readapt/monitor.rb +0 -0
- data/lib/readapt/output.rb +25 -25
- data/lib/readapt/references.rb +27 -27
- data/lib/readapt/server.rb +22 -22
- data/lib/readapt/shell.rb +104 -104
- data/lib/readapt/snapshot.rb +0 -0
- data/lib/readapt/thread.rb +20 -20
- data/lib/readapt/variable.rb +0 -0
- data/lib/readapt/version.rb +3 -3
- data/lib/readapt.rb +21 -21
- data/readapt.gemspec +39 -39
- metadata +8 -7
data/lib/readapt/frame.rb
CHANGED
@@ -1,40 +1,40 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
# @!method file
|
5
|
-
# @return [String]
|
6
|
-
# @!method line
|
7
|
-
# @return [Integer]
|
8
|
-
# @!method binding_id
|
9
|
-
# @return [Integer]
|
10
|
-
# @!method initialize(file, line, binding_id)
|
11
|
-
class Frame
|
12
|
-
def evaluate code
|
13
|
-
frame_binding.eval(code).inspect
|
14
|
-
rescue StandardError => e
|
15
|
-
"[#{e.class}] #{e.message}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def local_id
|
19
|
-
frame_binding.object_id
|
20
|
-
end
|
21
|
-
|
22
|
-
def locals
|
23
|
-
return [] if frame_binding.nil?
|
24
|
-
result = []
|
25
|
-
frame_binding.local_variables.sort.each do |sym|
|
26
|
-
var = frame_binding.local_variable_get(sym)
|
27
|
-
result.push Variable.new(sym, var)
|
28
|
-
end
|
29
|
-
result.push Variable.new(:self, frame_binding.receiver)
|
30
|
-
result
|
31
|
-
end
|
32
|
-
|
33
|
-
def local sym
|
34
|
-
return frame_binding.receiver if sym == :self
|
35
|
-
frame_binding.local_variable_get sym
|
36
|
-
end
|
37
|
-
|
38
|
-
NULL_FRAME = Frame.new("", 0, nil)
|
39
|
-
end
|
40
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
# @!method file
|
5
|
+
# @return [String]
|
6
|
+
# @!method line
|
7
|
+
# @return [Integer]
|
8
|
+
# @!method binding_id
|
9
|
+
# @return [Integer]
|
10
|
+
# @!method initialize(file, line, binding_id)
|
11
|
+
class Frame
|
12
|
+
def evaluate code
|
13
|
+
frame_binding.eval(code).inspect
|
14
|
+
rescue StandardError => e
|
15
|
+
"[#{e.class}] #{e.message}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def local_id
|
19
|
+
frame_binding.object_id
|
20
|
+
end
|
21
|
+
|
22
|
+
def locals
|
23
|
+
return [] if frame_binding.nil?
|
24
|
+
result = []
|
25
|
+
frame_binding.local_variables.sort.each do |sym|
|
26
|
+
var = frame_binding.local_variable_get(sym)
|
27
|
+
result.push Variable.new(sym, var)
|
28
|
+
end
|
29
|
+
result.push Variable.new(:self, frame_binding.receiver)
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
def local sym
|
34
|
+
return frame_binding.receiver if sym == :self
|
35
|
+
frame_binding.local_variable_get sym
|
36
|
+
end
|
37
|
+
|
38
|
+
NULL_FRAME = Frame.new("", 0, nil)
|
39
|
+
end
|
40
|
+
end
|
data/lib/readapt/input.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
module Readapt
|
2
|
-
module Input
|
3
|
-
def receiving data
|
4
|
-
print data
|
5
|
-
end
|
6
|
-
end
|
7
|
-
end
|
1
|
+
module Readapt
|
2
|
+
module Input
|
3
|
+
def receiving data
|
4
|
+
print data
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Attach < Base
|
6
|
-
def run
|
7
|
-
debugger.config arguments, :attach
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Attach < Base
|
6
|
+
def run
|
7
|
+
debugger.config arguments, :attach
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/readapt/message/base.rb
CHANGED
@@ -1,32 +1,32 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Base
|
6
|
-
# @return [Hash]
|
7
|
-
attr_reader :arguments
|
8
|
-
|
9
|
-
# @return [Debugger]
|
10
|
-
attr_reader :debugger
|
11
|
-
|
12
|
-
def initialize arguments, debugger
|
13
|
-
@arguments = arguments
|
14
|
-
@debugger = debugger
|
15
|
-
end
|
16
|
-
|
17
|
-
def run; end
|
18
|
-
|
19
|
-
def body
|
20
|
-
@body ||= {}
|
21
|
-
end
|
22
|
-
|
23
|
-
def set_body hash
|
24
|
-
@body = hash
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.run arguments, debugger
|
28
|
-
new(arguments, debugger).run
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Base
|
6
|
+
# @return [Hash]
|
7
|
+
attr_reader :arguments
|
8
|
+
|
9
|
+
# @return [Debugger]
|
10
|
+
attr_reader :debugger
|
11
|
+
|
12
|
+
def initialize arguments, debugger
|
13
|
+
@arguments = arguments
|
14
|
+
@debugger = debugger
|
15
|
+
end
|
16
|
+
|
17
|
+
def run; end
|
18
|
+
|
19
|
+
def body
|
20
|
+
@body ||= {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_body hash
|
24
|
+
@body = hash
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.run arguments, debugger
|
28
|
+
new(arguments, debugger).run
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class ConfigurationDone < Base
|
6
|
-
def run
|
7
|
-
debugger.start
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class ConfigurationDone < Base
|
6
|
+
def run
|
7
|
+
debugger.start
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Continue < Base
|
6
|
-
def run
|
7
|
-
thread = debugger.thread(arguments['threadId'])
|
8
|
-
thread.control = :continue
|
9
|
-
set_body({
|
10
|
-
allThreadsContinued: false
|
11
|
-
})
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Continue < Base
|
6
|
+
def run
|
7
|
+
thread = debugger.thread(arguments['threadId'])
|
8
|
+
thread.control = :continue
|
9
|
+
set_body({
|
10
|
+
allThreadsContinued: false
|
11
|
+
})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Disconnect < Base
|
6
|
-
def run
|
7
|
-
# The message only sets an empty body to acknowledge that the request
|
8
|
-
# was received. The adapter handles the actual disconnection process.
|
9
|
-
set_body({})
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Disconnect < Base
|
6
|
+
def run
|
7
|
+
# The message only sets an empty body to acknowledge that the request
|
8
|
+
# was received. The adapter handles the actual disconnection process.
|
9
|
+
set_body({})
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
module Readapt
|
6
|
-
module Message
|
7
|
-
class Evaluate < Base
|
8
|
-
def run
|
9
|
-
ref = arguments['frameId']
|
10
|
-
frame = debugger.frame(ref)
|
11
|
-
expression = arguments['expression']
|
12
|
-
result = ref ? frame.evaluate(expression) : eval(expression)
|
13
|
-
set_body(
|
14
|
-
result: result
|
15
|
-
)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Readapt
|
6
|
+
module Message
|
7
|
+
class Evaluate < Base
|
8
|
+
def run
|
9
|
+
ref = arguments['frameId']
|
10
|
+
frame = debugger.frame(ref)
|
11
|
+
expression = arguments['expression']
|
12
|
+
result = ref ? frame.evaluate(expression) : eval(expression)
|
13
|
+
set_body(
|
14
|
+
result: result
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Initialize < Base
|
6
|
-
def run
|
7
|
-
set_body({
|
8
|
-
supportsConfigurationDoneRequest: true,
|
9
|
-
exceptionBreakpointFilters: [
|
10
|
-
{
|
11
|
-
filter: 'raise',
|
12
|
-
label: 'Break on raised exceptions',
|
13
|
-
description: 'The debugger will break when an exception is raised, regardless of whether it is subsequently rescued.',
|
14
|
-
default: false
|
15
|
-
}
|
16
|
-
]
|
17
|
-
})
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Initialize < Base
|
6
|
+
def run
|
7
|
+
set_body({
|
8
|
+
supportsConfigurationDoneRequest: true,
|
9
|
+
exceptionBreakpointFilters: [
|
10
|
+
{
|
11
|
+
filter: 'raise',
|
12
|
+
label: 'Break on raised exceptions',
|
13
|
+
description: 'The debugger will break when an exception is raised, regardless of whether it is subsequently rescued.',
|
14
|
+
default: false
|
15
|
+
}
|
16
|
+
]
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Launch < Base
|
6
|
-
def run
|
7
|
-
debugger.config arguments, :launch
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Launch < Base
|
6
|
+
def run
|
7
|
+
debugger.config arguments, :launch
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/readapt/message/next.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Next < Base
|
6
|
-
def run
|
7
|
-
thread = debugger.thread(arguments['threadId'])
|
8
|
-
thread.control = :next
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Next < Base
|
6
|
+
def run
|
7
|
+
thread = debugger.thread(arguments['threadId'])
|
8
|
+
thread.control = :next
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Pause < Base
|
6
|
-
def run
|
7
|
-
Monitor.pause arguments['threadId']
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Pause < Base
|
6
|
+
def run
|
7
|
+
Monitor.pause arguments['threadId']
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class Scopes < Base
|
6
|
-
def run
|
7
|
-
frame = debugger.frame(arguments['frameId'])
|
8
|
-
set_body({
|
9
|
-
scopes: [
|
10
|
-
{
|
11
|
-
name: 'Local',
|
12
|
-
variablesReference: frame.local_id,
|
13
|
-
expensive: false
|
14
|
-
},
|
15
|
-
{
|
16
|
-
name: 'Global',
|
17
|
-
# @todo 1 is a magic number representing the toplevel binding
|
18
|
-
variablesReference: 1,
|
19
|
-
expensive: true
|
20
|
-
}
|
21
|
-
]
|
22
|
-
})
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class Scopes < Base
|
6
|
+
def run
|
7
|
+
frame = debugger.frame(arguments['frameId'])
|
8
|
+
set_body({
|
9
|
+
scopes: [
|
10
|
+
{
|
11
|
+
name: 'Local',
|
12
|
+
variablesReference: frame.local_id,
|
13
|
+
expensive: false
|
14
|
+
},
|
15
|
+
{
|
16
|
+
name: 'Global',
|
17
|
+
# @todo 1 is a magic number representing the toplevel binding
|
18
|
+
variablesReference: 1,
|
19
|
+
expensive: true
|
20
|
+
}
|
21
|
+
]
|
22
|
+
})
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,25 +1,25 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class SetBreakpoints < Base
|
6
|
-
def run
|
7
|
-
path = Readapt.normalize_path(arguments['source']['path'])
|
8
|
-
debugger.clear_breakpoints path
|
9
|
-
lines = []
|
10
|
-
set_body(
|
11
|
-
breakpoints: arguments['breakpoints'].map do |val|
|
12
|
-
debugger.set_breakpoint path, val['line'], val['condition'], val['hitCondition']
|
13
|
-
lines.push val['line']
|
14
|
-
{
|
15
|
-
verified: true, # @todo Verify
|
16
|
-
source: arguments['source'],
|
17
|
-
line: val['line']
|
18
|
-
}
|
19
|
-
end
|
20
|
-
)
|
21
|
-
Breakpoints.set(path, lines)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class SetBreakpoints < Base
|
6
|
+
def run
|
7
|
+
path = Readapt.normalize_path(arguments['source']['path'])
|
8
|
+
debugger.clear_breakpoints path
|
9
|
+
lines = []
|
10
|
+
set_body(
|
11
|
+
breakpoints: arguments['breakpoints'].map do |val|
|
12
|
+
debugger.set_breakpoint path, val['line'], val['condition'], val['hitCondition']
|
13
|
+
lines.push val['line']
|
14
|
+
{
|
15
|
+
verified: true, # @todo Verify
|
16
|
+
source: arguments['source'],
|
17
|
+
line: val['line']
|
18
|
+
}
|
19
|
+
end
|
20
|
+
)
|
21
|
+
Breakpoints.set(path, lines)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class SetExceptionBreakpoints < Base
|
6
|
-
def run
|
7
|
-
debugger.pause_on_raise = arguments['filters'] && arguments['filters'].include?('raise')
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class SetExceptionBreakpoints < Base
|
6
|
+
def run
|
7
|
+
debugger.pause_on_raise = arguments['filters'] && arguments['filters'].include?('raise')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,38 +1,38 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class StackTrace < Base
|
6
|
-
@@file_hash = {}
|
7
|
-
|
8
|
-
def run
|
9
|
-
frames = debugger.thread(arguments['threadId']).frames
|
10
|
-
set_body({
|
11
|
-
stackFrames: frames.map do |frm|
|
12
|
-
{
|
13
|
-
name: frame_code(frm.file, frm.line),
|
14
|
-
source: {
|
15
|
-
name: frm.file ? File.basename(frm.file) : nil,
|
16
|
-
path: frm.file
|
17
|
-
},
|
18
|
-
id: frm.local_id,
|
19
|
-
line: frm.line,
|
20
|
-
column: 0
|
21
|
-
}
|
22
|
-
end,
|
23
|
-
totalFrames: frames.length
|
24
|
-
})
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def read_file file
|
30
|
-
@@file_hash[file] ||= File.read(file)
|
31
|
-
end
|
32
|
-
|
33
|
-
def frame_code file, line
|
34
|
-
read_file(file).lines[line - 1].strip
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class StackTrace < Base
|
6
|
+
@@file_hash = {}
|
7
|
+
|
8
|
+
def run
|
9
|
+
frames = debugger.thread(arguments['threadId']).frames
|
10
|
+
set_body({
|
11
|
+
stackFrames: frames.map do |frm|
|
12
|
+
{
|
13
|
+
name: frame_code(frm.file, frm.line),
|
14
|
+
source: {
|
15
|
+
name: frm.file ? File.basename(frm.file) : nil,
|
16
|
+
path: frm.file
|
17
|
+
},
|
18
|
+
id: frm.local_id,
|
19
|
+
line: frm.line,
|
20
|
+
column: 0
|
21
|
+
}
|
22
|
+
end,
|
23
|
+
totalFrames: frames.length
|
24
|
+
})
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def read_file file
|
30
|
+
@@file_hash[file] ||= File.read(file)
|
31
|
+
end
|
32
|
+
|
33
|
+
def frame_code file, line
|
34
|
+
read_file(file).lines[line - 1].strip
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class StepIn < Base
|
6
|
-
def run
|
7
|
-
debugger.thread(arguments['threadId']).control = :step_in
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class StepIn < Base
|
6
|
+
def run
|
7
|
+
debugger.thread(arguments['threadId']).control = :step_in
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Readapt
|
4
|
-
module Message
|
5
|
-
class StepOut < Base
|
6
|
-
def run
|
7
|
-
debugger.thread(arguments['threadId']).control = :step_out
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Readapt
|
4
|
+
module Message
|
5
|
+
class StepOut < Base
|
6
|
+
def run
|
7
|
+
debugger.thread(arguments['threadId']).control = :step_out
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|