readapt 1.2.0 → 1.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -16
  3. data/.rspec +2 -2
  4. data/.travis.yml +19 -18
  5. data/CHANGELOG.md +97 -80
  6. data/Gemfile +4 -4
  7. data/LICENSE.txt +21 -21
  8. data/README.md +37 -37
  9. data/Rakefile +14 -14
  10. data/bin/console +14 -14
  11. data/bin/setup +8 -8
  12. data/exe/readapt +5 -5
  13. data/ext/readapt/breakpoints.c +83 -83
  14. data/ext/readapt/breakpoints.h +11 -11
  15. data/ext/readapt/extconf.rb +0 -0
  16. data/ext/readapt/frame.c +137 -137
  17. data/ext/readapt/frame.h +17 -17
  18. data/ext/readapt/inspector.c +51 -51
  19. data/ext/readapt/inspector.h +8 -8
  20. data/ext/readapt/lookup_table.c +211 -211
  21. data/ext/readapt/lookup_table.h +30 -30
  22. data/ext/readapt/monitor.c +2 -2
  23. data/ext/readapt/monitor.h +0 -0
  24. data/ext/readapt/normalize.c +62 -59
  25. data/ext/readapt/normalize.h +7 -7
  26. data/ext/readapt/readapt.c +18 -18
  27. data/ext/readapt/stack.c +86 -86
  28. data/ext/readapt/stack.h +20 -20
  29. data/ext/readapt/threads.c +13 -2
  30. data/ext/readapt/threads.h +2 -1
  31. data/lib/readapt.rb +21 -21
  32. data/lib/readapt/adapter.rb +98 -98
  33. data/lib/readapt/breakpoint.rb +21 -21
  34. data/lib/readapt/data_reader.rb +62 -62
  35. data/lib/readapt/debugger.rb +227 -220
  36. data/lib/readapt/error.rb +63 -63
  37. data/lib/readapt/finder.rb +34 -34
  38. data/lib/readapt/frame.rb +40 -40
  39. data/lib/readapt/input.rb +7 -7
  40. data/lib/readapt/message.rb +62 -62
  41. data/lib/readapt/message/attach.rb +11 -11
  42. data/lib/readapt/message/base.rb +32 -32
  43. data/lib/readapt/message/configuration_done.rb +11 -11
  44. data/lib/readapt/message/continue.rb +15 -15
  45. data/lib/readapt/message/disconnect.rb +13 -13
  46. data/lib/readapt/message/evaluate.rb +18 -18
  47. data/lib/readapt/message/initialize.rb +21 -13
  48. data/lib/readapt/message/launch.rb +11 -11
  49. data/lib/readapt/message/next.rb +12 -12
  50. data/lib/readapt/message/pause.rb +11 -11
  51. data/lib/readapt/message/scopes.rb +26 -26
  52. data/lib/readapt/message/set_breakpoints.rb +25 -25
  53. data/lib/readapt/message/set_exception_breakpoints.rb +11 -8
  54. data/lib/readapt/message/stack_trace.rb +38 -38
  55. data/lib/readapt/message/step_in.rb +11 -11
  56. data/lib/readapt/message/step_out.rb +11 -11
  57. data/lib/readapt/message/threads.rb +18 -18
  58. data/lib/readapt/message/variables.rb +53 -61
  59. data/lib/readapt/monitor.rb +0 -0
  60. data/lib/readapt/output.rb +25 -25
  61. data/lib/readapt/references.rb +27 -27
  62. data/lib/readapt/server.rb +22 -22
  63. data/lib/readapt/shell.rb +104 -104
  64. data/lib/readapt/snapshot.rb +0 -0
  65. data/lib/readapt/thread.rb +20 -25
  66. data/lib/readapt/variable.rb +0 -0
  67. data/lib/readapt/version.rb +3 -3
  68. data/readapt.gemspec +39 -39
  69. metadata +10 -10
@@ -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
- next_id++;
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
- rb_define_singleton_method(c_Thread, "all", thread_all_s, 0);
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
 
@@ -10,7 +10,8 @@ typedef struct thread_reference_struct {
10
10
  int cursor;
11
11
  int depth;
12
12
  ID control;
13
- readapt_stack_t *frames;
13
+ long thread_object_id;
14
+ readapt_stack_t *frames;
14
15
  } thread_reference_t;
15
16
 
16
17
  void initialize_threads(VALUE);
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'
@@ -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
@@ -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
@@ -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