readapt 1.4.0 → 1.4.1
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/.gitignore +16 -16
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +91 -87
- 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 +59 -59
- 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 +13 -2
- data/ext/readapt/threads.h +2 -1
- data/lib/readapt.rb +21 -21
- 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 -228
- 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.rb +62 -62
- 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 +18 -18
- 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/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 -25
- data/lib/readapt/variable.rb +0 -0
- data/lib/readapt/version.rb +3 -3
- data/readapt.gemspec +39 -39
- metadata +3 -3
data/ext/readapt/threads.c
CHANGED
@@ -43,7 +43,8 @@ static VALUE thread_reference_new(VALUE thr)
|
|
43
43
|
data->depth = 0;
|
44
44
|
data->control = rb_intern("continue");
|
45
45
|
data->frames = stack_alloc(sizeof(frame_t), frame_free);
|
46
|
-
|
46
|
+
data->thread_object_id = NUM2LONG(rb_obj_id(thr));
|
47
|
+
next_id++;
|
47
48
|
return obj;
|
48
49
|
}
|
49
50
|
|
@@ -165,6 +166,15 @@ static VALUE frames_m(VALUE self)
|
|
165
166
|
return ary;
|
166
167
|
}
|
167
168
|
|
169
|
+
static VALUE thread_object_id_m(VALUE self)
|
170
|
+
{
|
171
|
+
thread_reference_t *data;
|
172
|
+
|
173
|
+
data = thread_reference_pointer(self);
|
174
|
+
return LONG2NUM(data->thread_object_id);
|
175
|
+
// return rb_hash_aref(ids, INT2NUM(data->id))->object_id;
|
176
|
+
}
|
177
|
+
|
168
178
|
void thread_reference_build_frames(thread_reference_t *ptr)
|
169
179
|
{
|
170
180
|
inspector_inspect(ptr);
|
@@ -184,7 +194,8 @@ void initialize_threads(VALUE m_Readapt)
|
|
184
194
|
rb_define_alloc_func(c_Thread, thread_allocate_s);
|
185
195
|
rb_define_method(c_Thread, "id", thread_id_m, 0);
|
186
196
|
rb_define_method(c_Thread, "frames", frames_m, 0);
|
187
|
-
|
197
|
+
rb_define_method(c_Thread, "thread_object_id", thread_object_id_m, 0);
|
198
|
+
rb_define_singleton_method(c_Thread, "all", thread_all_s, 0);
|
188
199
|
rb_define_singleton_method(c_Thread, "find", thread_find_s, 1);
|
189
200
|
rb_define_singleton_method(c_Thread, "include?", thread_include_s, 1);
|
190
201
|
|
data/ext/readapt/threads.h
CHANGED
data/lib/readapt.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require 'backport'
|
2
|
-
|
3
|
-
require 'readapt/version'
|
4
|
-
require 'readapt/readapt'
|
5
|
-
require 'readapt/references'
|
6
|
-
require 'readapt/breakpoint'
|
7
|
-
require 'readapt/thread'
|
8
|
-
require 'readapt/frame'
|
9
|
-
require 'readapt/monitor'
|
10
|
-
require 'readapt/snapshot'
|
11
|
-
require 'readapt/finder'
|
12
|
-
require 'readapt/debugger'
|
13
|
-
require 'readapt/message'
|
14
|
-
require 'readapt/variable'
|
15
|
-
require 'readapt/data_reader'
|
16
|
-
require 'readapt/server'
|
17
|
-
require 'readapt/adapter'
|
18
|
-
require 'readapt/input'
|
19
|
-
require 'readapt/output'
|
20
|
-
require 'readapt/error'
|
21
|
-
require 'readapt/shell'
|
1
|
+
require 'backport'
|
2
|
+
|
3
|
+
require 'readapt/version'
|
4
|
+
require 'readapt/readapt'
|
5
|
+
require 'readapt/references'
|
6
|
+
require 'readapt/breakpoint'
|
7
|
+
require 'readapt/thread'
|
8
|
+
require 'readapt/frame'
|
9
|
+
require 'readapt/monitor'
|
10
|
+
require 'readapt/snapshot'
|
11
|
+
require 'readapt/finder'
|
12
|
+
require 'readapt/debugger'
|
13
|
+
require 'readapt/message'
|
14
|
+
require 'readapt/variable'
|
15
|
+
require 'readapt/data_reader'
|
16
|
+
require 'readapt/server'
|
17
|
+
require 'readapt/adapter'
|
18
|
+
require 'readapt/input'
|
19
|
+
require 'readapt/output'
|
20
|
+
require 'readapt/error'
|
21
|
+
require 'readapt/shell'
|
data/lib/readapt/adapter.rb
CHANGED
@@ -1,98 +1,98 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
module Readapt
|
6
|
-
module Adapter
|
7
|
-
# @!parse include Backport::Adapter
|
8
|
-
|
9
|
-
@@debugger = nil
|
10
|
-
|
11
|
-
def self.host debugger
|
12
|
-
@@debugger = debugger
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.procid= pid
|
16
|
-
@@procid = pid
|
17
|
-
end
|
18
|
-
|
19
|
-
def procid
|
20
|
-
@@procid
|
21
|
-
end
|
22
|
-
|
23
|
-
def open_message
|
24
|
-
@@open_message ||= "<readapt-#{procid}>"
|
25
|
-
end
|
26
|
-
|
27
|
-
def close_message
|
28
|
-
@@close_message ||= "</readapt-#{procid}>"
|
29
|
-
end
|
30
|
-
|
31
|
-
def format result
|
32
|
-
write_line result.to_protocol.to_json
|
33
|
-
end
|
34
|
-
|
35
|
-
def opening
|
36
|
-
@@debugger.add_observer self
|
37
|
-
@data_reader = DataReader.new
|
38
|
-
@data_reader.set_message_handler do |message|
|
39
|
-
process message
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def closing
|
44
|
-
@@debugger.delete_observer(self)
|
45
|
-
end
|
46
|
-
|
47
|
-
def receiving data
|
48
|
-
@data_reader.receive data
|
49
|
-
end
|
50
|
-
|
51
|
-
def update event, data
|
52
|
-
obj = {
|
53
|
-
type: 'event',
|
54
|
-
event: event
|
55
|
-
}
|
56
|
-
obj[:body] = data unless data.nil?
|
57
|
-
json = obj.to_json
|
58
|
-
envelope = "#{open_message}Content-Length: #{json.bytesize}\r\n\r\n#{json}#{close_message}"
|
59
|
-
write envelope
|
60
|
-
write "#{open_message}__TERMINATE__#{close_message}" if event == 'terminated'
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
# @param data [Hash]
|
66
|
-
# @return [void]
|
67
|
-
def process data
|
68
|
-
message = Message.process(data, @@debugger)
|
69
|
-
if data['seq']
|
70
|
-
json = {
|
71
|
-
type: 'response',
|
72
|
-
request_seq: data['seq'],
|
73
|
-
success: true,
|
74
|
-
command: data['command'],
|
75
|
-
body: message.body
|
76
|
-
}.to_json
|
77
|
-
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
78
|
-
write "#{open_message}#{envelope}#{close_message}"
|
79
|
-
if data['command'] == 'disconnect'
|
80
|
-
@@debugger.disconnect
|
81
|
-
# @todo It does not appear necessary to close the adapter after
|
82
|
-
# disconnecting the debugger.
|
83
|
-
# close
|
84
|
-
end
|
85
|
-
return unless data['command'] == 'initialize'
|
86
|
-
json = {
|
87
|
-
type: 'event',
|
88
|
-
event: 'initialized'
|
89
|
-
}.to_json
|
90
|
-
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
91
|
-
write "#{open_message}#{envelope}#{close_message}"
|
92
|
-
end
|
93
|
-
rescue RuntimeError => e
|
94
|
-
STDERR.puts "[#{e.class}] #{e.message}"
|
95
|
-
STDERR.puts e.backtrace.join
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Readapt
|
6
|
+
module Adapter
|
7
|
+
# @!parse include Backport::Adapter
|
8
|
+
|
9
|
+
@@debugger = nil
|
10
|
+
|
11
|
+
def self.host debugger
|
12
|
+
@@debugger = debugger
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.procid= pid
|
16
|
+
@@procid = pid
|
17
|
+
end
|
18
|
+
|
19
|
+
def procid
|
20
|
+
@@procid
|
21
|
+
end
|
22
|
+
|
23
|
+
def open_message
|
24
|
+
@@open_message ||= "<readapt-#{procid}>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def close_message
|
28
|
+
@@close_message ||= "</readapt-#{procid}>"
|
29
|
+
end
|
30
|
+
|
31
|
+
def format result
|
32
|
+
write_line result.to_protocol.to_json
|
33
|
+
end
|
34
|
+
|
35
|
+
def opening
|
36
|
+
@@debugger.add_observer self
|
37
|
+
@data_reader = DataReader.new
|
38
|
+
@data_reader.set_message_handler do |message|
|
39
|
+
process message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def closing
|
44
|
+
@@debugger.delete_observer(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def receiving data
|
48
|
+
@data_reader.receive data
|
49
|
+
end
|
50
|
+
|
51
|
+
def update event, data
|
52
|
+
obj = {
|
53
|
+
type: 'event',
|
54
|
+
event: event
|
55
|
+
}
|
56
|
+
obj[:body] = data unless data.nil?
|
57
|
+
json = obj.to_json
|
58
|
+
envelope = "#{open_message}Content-Length: #{json.bytesize}\r\n\r\n#{json}#{close_message}"
|
59
|
+
write envelope
|
60
|
+
write "#{open_message}__TERMINATE__#{close_message}" if event == 'terminated'
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# @param data [Hash]
|
66
|
+
# @return [void]
|
67
|
+
def process data
|
68
|
+
message = Message.process(data, @@debugger)
|
69
|
+
if data['seq']
|
70
|
+
json = {
|
71
|
+
type: 'response',
|
72
|
+
request_seq: data['seq'],
|
73
|
+
success: true,
|
74
|
+
command: data['command'],
|
75
|
+
body: message.body
|
76
|
+
}.to_json
|
77
|
+
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
78
|
+
write "#{open_message}#{envelope}#{close_message}"
|
79
|
+
if data['command'] == 'disconnect'
|
80
|
+
@@debugger.disconnect
|
81
|
+
# @todo It does not appear necessary to close the adapter after
|
82
|
+
# disconnecting the debugger.
|
83
|
+
# close
|
84
|
+
end
|
85
|
+
return unless data['command'] == 'initialize'
|
86
|
+
json = {
|
87
|
+
type: 'event',
|
88
|
+
event: 'initialized'
|
89
|
+
}.to_json
|
90
|
+
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
91
|
+
write "#{open_message}#{envelope}#{close_message}"
|
92
|
+
end
|
93
|
+
rescue RuntimeError => e
|
94
|
+
STDERR.puts "[#{e.class}] #{e.message}"
|
95
|
+
STDERR.puts e.backtrace.join
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/readapt/breakpoint.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
module Readapt
|
2
|
-
class Breakpoint
|
3
|
-
attr_reader :source
|
4
|
-
attr_reader :line
|
5
|
-
attr_reader :condition
|
6
|
-
attr_reader :hit_condition
|
7
|
-
attr_writer :hit_cursor
|
8
|
-
|
9
|
-
def initialize source, line, condition, hit_condition
|
10
|
-
@source = source
|
11
|
-
@line = line
|
12
|
-
@condition = condition
|
13
|
-
@hit_condition = hit_condition
|
14
|
-
end
|
15
|
-
|
16
|
-
# @return [Integer]
|
17
|
-
def hit_cursor
|
18
|
-
@hit_cursor ||= 0
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
1
|
+
module Readapt
|
2
|
+
class Breakpoint
|
3
|
+
attr_reader :source
|
4
|
+
attr_reader :line
|
5
|
+
attr_reader :condition
|
6
|
+
attr_reader :hit_condition
|
7
|
+
attr_writer :hit_cursor
|
8
|
+
|
9
|
+
def initialize source, line, condition, hit_condition
|
10
|
+
@source = source
|
11
|
+
@line = line
|
12
|
+
@condition = condition
|
13
|
+
@hit_condition = hit_condition
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Integer]
|
17
|
+
def hit_cursor
|
18
|
+
@hit_cursor ||= 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/readapt/data_reader.rb
CHANGED
@@ -1,62 +1,62 @@
|
|
1
|
-
module Readapt
|
2
|
-
class DataReader
|
3
|
-
def initialize
|
4
|
-
@in_header = true
|
5
|
-
@content_length = 0
|
6
|
-
@buffer = String.new
|
7
|
-
end
|
8
|
-
|
9
|
-
# Declare a block to be executed for each message received from the
|
10
|
-
# client.
|
11
|
-
#
|
12
|
-
# @yieldparam [Hash] The message received from the client
|
13
|
-
def set_message_handler &block
|
14
|
-
@message_handler = block
|
15
|
-
end
|
16
|
-
|
17
|
-
# Process raw data received from the client. The data will be parsed
|
18
|
-
# into messages based on the JSON-RPC protocol. Each message will be
|
19
|
-
# passed to the block declared via set_message_handler. Incomplete data
|
20
|
-
# will be buffered and subsequent data will be appended to the buffer.
|
21
|
-
#
|
22
|
-
# @param data [String]
|
23
|
-
def receive data
|
24
|
-
data.each_char do |char|
|
25
|
-
@buffer.concat char
|
26
|
-
if @in_header
|
27
|
-
prepare_to_parse_message if @buffer.end_with?("\r\n\r\n")
|
28
|
-
else
|
29
|
-
parse_message_from_buffer if @buffer.bytesize == @content_length
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def prepare_to_parse_message
|
37
|
-
@in_header = false
|
38
|
-
@buffer.each_line do |line|
|
39
|
-
parts = line.split(':').map(&:strip)
|
40
|
-
if parts[0] == 'Content-Length'
|
41
|
-
@content_length = parts[1].to_i
|
42
|
-
break
|
43
|
-
end
|
44
|
-
end
|
45
|
-
@buffer.clear
|
46
|
-
end
|
47
|
-
|
48
|
-
def parse_message_from_buffer
|
49
|
-
begin
|
50
|
-
msg = JSON.parse(@buffer)
|
51
|
-
@message_handler.call msg unless @message_handler.nil?
|
52
|
-
rescue JSON::ParserError => e
|
53
|
-
Solargraph::Logging.logger.warn "Failed to parse request: #{e.message}"
|
54
|
-
Solargraph::Logging.logger.debug "Buffer: #{@buffer}"
|
55
|
-
ensure
|
56
|
-
@buffer.clear
|
57
|
-
@in_header = true
|
58
|
-
@content_length = 0
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
1
|
+
module Readapt
|
2
|
+
class DataReader
|
3
|
+
def initialize
|
4
|
+
@in_header = true
|
5
|
+
@content_length = 0
|
6
|
+
@buffer = String.new
|
7
|
+
end
|
8
|
+
|
9
|
+
# Declare a block to be executed for each message received from the
|
10
|
+
# client.
|
11
|
+
#
|
12
|
+
# @yieldparam [Hash] The message received from the client
|
13
|
+
def set_message_handler &block
|
14
|
+
@message_handler = block
|
15
|
+
end
|
16
|
+
|
17
|
+
# Process raw data received from the client. The data will be parsed
|
18
|
+
# into messages based on the JSON-RPC protocol. Each message will be
|
19
|
+
# passed to the block declared via set_message_handler. Incomplete data
|
20
|
+
# will be buffered and subsequent data will be appended to the buffer.
|
21
|
+
#
|
22
|
+
# @param data [String]
|
23
|
+
def receive data
|
24
|
+
data.each_char do |char|
|
25
|
+
@buffer.concat char
|
26
|
+
if @in_header
|
27
|
+
prepare_to_parse_message if @buffer.end_with?("\r\n\r\n")
|
28
|
+
else
|
29
|
+
parse_message_from_buffer if @buffer.bytesize == @content_length
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def prepare_to_parse_message
|
37
|
+
@in_header = false
|
38
|
+
@buffer.each_line do |line|
|
39
|
+
parts = line.split(':').map(&:strip)
|
40
|
+
if parts[0] == 'Content-Length'
|
41
|
+
@content_length = parts[1].to_i
|
42
|
+
break
|
43
|
+
end
|
44
|
+
end
|
45
|
+
@buffer.clear
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_message_from_buffer
|
49
|
+
begin
|
50
|
+
msg = JSON.parse(@buffer)
|
51
|
+
@message_handler.call msg unless @message_handler.nil?
|
52
|
+
rescue JSON::ParserError => e
|
53
|
+
Solargraph::Logging.logger.warn "Failed to parse request: #{e.message}"
|
54
|
+
Solargraph::Logging.logger.debug "Buffer: #{@buffer}"
|
55
|
+
ensure
|
56
|
+
@buffer.clear
|
57
|
+
@in_header = true
|
58
|
+
@content_length = 0
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|