lldb 0.2.0 → 0.3.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/CHANGELOG.md +43 -4
- data/README.md +86 -2
- data/Rakefile +36 -0
- data/bindings/constants.yml +137 -0
- data/bindings/surface.yml +3072 -0
- data/ext/lldb/discovery.rb +101 -0
- data/ext/lldb/extconf.rb +206 -88
- data/ext/lldb/lldb_wrapper.cpp +7934 -877
- data/ext/lldb/lldb_wrapper.h +596 -333
- data/lib/lldb/address.rb +81 -0
- data/lib/lldb/api_support.rb +23 -6
- data/lib/lldb/attach_info.rb +122 -0
- data/lib/lldb/block.rb +121 -0
- data/lib/lldb/breakpoint.rb +11 -6
- data/lib/lldb/breakpoint_location.rb +20 -5
- data/lib/lldb/broadcaster.rb +79 -0
- data/lib/lldb/command_interpreter.rb +9 -4
- data/lib/lldb/command_return_object.rb +24 -5
- data/lib/lldb/compile_unit.rb +64 -0
- data/lib/lldb/context.rb +81 -0
- data/lib/lldb/debugger.rb +55 -12
- data/lib/lldb/error.rb +50 -3
- data/lib/lldb/event.rb +109 -0
- data/lib/lldb/expression_options.rb +124 -0
- data/lib/lldb/ffi_bindings.rb +313 -31
- data/lib/lldb/file_spec.rb +90 -0
- data/lib/lldb/file_spec_list.rb +78 -0
- data/lib/lldb/frame.rb +109 -17
- data/lib/lldb/function.rb +121 -0
- data/lib/lldb/instruction.rb +83 -0
- data/lib/lldb/instruction_list.rb +68 -0
- data/lib/lldb/launch_info.rb +145 -19
- data/lib/lldb/line_entry.rb +75 -0
- data/lib/lldb/listener.rb +96 -0
- data/lib/lldb/memory_region_info.rb +8 -3
- data/lib/lldb/module.rb +46 -5
- data/lib/lldb/native.rb +36 -0
- data/lib/lldb/native_buffer.rb +32 -0
- data/lib/lldb/native_handle.rb +60 -0
- data/lib/lldb/native_lifecycle.rb +64 -0
- data/lib/lldb/native_string_array.rb +34 -0
- data/lib/lldb/process.rb +102 -40
- data/lib/lldb/symbol.rb +117 -0
- data/lib/lldb/symbol_context.rb +9 -4
- data/lib/lldb/target.rb +69 -67
- data/lib/lldb/thread.rb +51 -18
- data/lib/lldb/type.rb +40 -3
- data/lib/lldb/type_member.rb +67 -0
- data/lib/lldb/types.rb +69 -4
- data/lib/lldb/value.rb +27 -17
- data/lib/lldb/value_list.rb +9 -5
- data/lib/lldb/version.rb +1 -1
- data/lib/lldb/watchpoint.rb +26 -9
- data/lib/lldb.rb +78 -10
- data/lldb.gemspec +4 -1
- data/rbs_collection.yaml +1 -1
- data/script/check_bindings +259 -0
- data/script/guard_c_exports +139 -0
- data/sig/lldb/ffi_bindings.rbs +247 -21
- data/sig/lldb/weak_ref.rbs +7 -0
- metadata +30 -6
- data/ext/lldb/Makefile +0 -24
- data/ext/lldb/liblldb_wrapper.dylib +0 -0
- data/ext/lldb/lldb_wrapper.o +0 -0
- data/ext/lldb/mkmf.log +0 -24
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module LLDB
|
|
6
|
+
class CompileUnit
|
|
7
|
+
prepend NativeLifecycle
|
|
8
|
+
|
|
9
|
+
# @rbs target: Target?
|
|
10
|
+
# @rbs context: Context?
|
|
11
|
+
# @rbs return: void
|
|
12
|
+
def initialize(ptr, target: nil, context: nil)
|
|
13
|
+
@target = target
|
|
14
|
+
initialize_native_object(
|
|
15
|
+
ptr,
|
|
16
|
+
release: ->(released) { FFIBindings.lldb_compile_unit_destroy(released) },
|
|
17
|
+
context: context || target&.context
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @rbs return: bool
|
|
22
|
+
def valid?
|
|
23
|
+
!@ptr.null? && FFIBindings.lldb_compile_unit_is_valid(@ptr) != 0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @rbs return: FileSpec?
|
|
27
|
+
def file_spec
|
|
28
|
+
return nil unless valid?
|
|
29
|
+
|
|
30
|
+
ptr = FFIBindings.lldb_compile_unit_get_file_spec(@ptr)
|
|
31
|
+
return nil if ptr.nil? || ptr.null?
|
|
32
|
+
|
|
33
|
+
FileSpec.from_ptr(ptr, context: context)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @rbs return: Integer
|
|
37
|
+
def num_line_entries
|
|
38
|
+
return 0 unless valid?
|
|
39
|
+
|
|
40
|
+
FFIBindings.lldb_compile_unit_get_num_line_entries(@ptr)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @rbs index: Integer
|
|
44
|
+
# @rbs return: LineEntry?
|
|
45
|
+
def line_entry_at_index(index)
|
|
46
|
+
return nil unless valid?
|
|
47
|
+
|
|
48
|
+
ptr = FFIBindings.lldb_compile_unit_get_line_entry_at_index(@ptr, index)
|
|
49
|
+
return nil if ptr.nil? || ptr.null?
|
|
50
|
+
|
|
51
|
+
LineEntry.new(ptr, target: @target, context: context)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @rbs return: Array[LineEntry]
|
|
55
|
+
def line_entries
|
|
56
|
+
(0...num_line_entries).map { |index| line_entry_at_index(index) }.compact
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @rbs return: FFI::Pointer
|
|
60
|
+
def to_ptr
|
|
61
|
+
@ptr
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
data/lib/lldb/context.rb
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
require 'weakref'
|
|
6
|
+
|
|
7
|
+
module LLDB
|
|
8
|
+
class Context
|
|
9
|
+
OPEN = :open
|
|
10
|
+
CLOSING = :closing
|
|
11
|
+
CLOSED = :closed
|
|
12
|
+
|
|
13
|
+
# @rbs return: void
|
|
14
|
+
def initialize
|
|
15
|
+
@mutex = Mutex.new
|
|
16
|
+
@state = OPEN
|
|
17
|
+
@handles = [] # : Array[WeakRef]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @rbs handle: NativeHandle
|
|
21
|
+
# @rbs return: NativeHandle
|
|
22
|
+
def register(handle)
|
|
23
|
+
@mutex.synchronize do
|
|
24
|
+
raise LifecycleError, 'LLDB context is closed' unless @state == OPEN
|
|
25
|
+
|
|
26
|
+
@handles << WeakRef.new(handle)
|
|
27
|
+
end
|
|
28
|
+
handle
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @rbs return: ::Symbol
|
|
32
|
+
def state
|
|
33
|
+
@mutex.synchronize { @state }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @rbs return: bool
|
|
37
|
+
def open?
|
|
38
|
+
state == OPEN
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @rbs return: bool
|
|
42
|
+
def closing?
|
|
43
|
+
state == CLOSING
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @rbs return: bool
|
|
47
|
+
def closed?
|
|
48
|
+
state == CLOSED
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @rbs return: void
|
|
52
|
+
def ensure_open!
|
|
53
|
+
raise ClosedObjectError, 'LLDB context is closed' unless open?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @rbs except: NativeHandle?
|
|
57
|
+
# @rbs return: void
|
|
58
|
+
def close(except: nil)
|
|
59
|
+
handles = @mutex.synchronize do
|
|
60
|
+
next nil if @state == CLOSED || @state == CLOSING
|
|
61
|
+
|
|
62
|
+
@state = CLOSING
|
|
63
|
+
@handles.filter_map do |reference|
|
|
64
|
+
begin
|
|
65
|
+
handle = reference.__getobj__
|
|
66
|
+
handle unless handle.equal?(except)
|
|
67
|
+
rescue WeakRef::RefError
|
|
68
|
+
nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
return unless handles
|
|
73
|
+
|
|
74
|
+
begin
|
|
75
|
+
handles.each(&:close)
|
|
76
|
+
ensure
|
|
77
|
+
@mutex.synchronize { @state = CLOSED }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
data/lib/lldb/debugger.rb
CHANGED
|
@@ -4,21 +4,27 @@
|
|
|
4
4
|
|
|
5
5
|
module LLDB
|
|
6
6
|
class Debugger
|
|
7
|
+
prepend NativeLifecycle
|
|
8
|
+
|
|
7
9
|
# @rbs return: Debugger
|
|
8
|
-
def self.create
|
|
10
|
+
def self.create(source_init_files: false)
|
|
9
11
|
LLDB.ensure_initialized!
|
|
10
|
-
ptr = FFIBindings.
|
|
12
|
+
ptr = FFIBindings.lldb_debugger_create_with_source_init_files(source_init_files ? 1 : 0)
|
|
11
13
|
raise LLDBError, 'Failed to create debugger' if ptr.null?
|
|
12
14
|
|
|
13
|
-
new(ptr)
|
|
15
|
+
new(ptr, context: Context.new).tap { |debugger| LLDB.register_debugger(debugger) }
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
# @rbs ptr: FFI::Pointer
|
|
19
|
+
# @rbs context: Context
|
|
17
20
|
# @rbs return: void
|
|
18
|
-
def initialize(ptr)
|
|
19
|
-
@ptr = ptr # : FFI::Pointer
|
|
21
|
+
def initialize(ptr, context: Context.new)
|
|
20
22
|
@targets = [] # : Array[Target]
|
|
21
|
-
|
|
23
|
+
initialize_native_object(
|
|
24
|
+
ptr,
|
|
25
|
+
release: ->(released) { FFIBindings.lldb_debugger_destroy(released) },
|
|
26
|
+
context: context
|
|
27
|
+
)
|
|
22
28
|
end
|
|
23
29
|
|
|
24
30
|
# @rbs ptr: FFI::Pointer
|
|
@@ -32,6 +38,16 @@ module LLDB
|
|
|
32
38
|
!@ptr.null? && FFIBindings.lldb_debugger_is_valid(@ptr) != 0
|
|
33
39
|
end
|
|
34
40
|
|
|
41
|
+
# @rbs return: bool
|
|
42
|
+
def close
|
|
43
|
+
return false if closed?
|
|
44
|
+
|
|
45
|
+
context!.close(except: @native_handle)
|
|
46
|
+
@native_handle.close
|
|
47
|
+
@ptr = NativeHandle::NULL_POINTER
|
|
48
|
+
true
|
|
49
|
+
end
|
|
50
|
+
|
|
35
51
|
# @rbs filename: String
|
|
36
52
|
# @rbs arch: String?
|
|
37
53
|
# @rbs platform: String?
|
|
@@ -53,7 +69,7 @@ module LLDB
|
|
|
53
69
|
error.raise_if_error!
|
|
54
70
|
raise LLDBError, "Failed to create target for '#{filename}'" if target_ptr.nil? || target_ptr.null?
|
|
55
71
|
|
|
56
|
-
target = Target.new(target_ptr, debugger: self)
|
|
72
|
+
target = Target.new(target_ptr, debugger: self, context: context)
|
|
57
73
|
@targets << target
|
|
58
74
|
target
|
|
59
75
|
end
|
|
@@ -66,7 +82,7 @@ module LLDB
|
|
|
66
82
|
target_ptr = FFIBindings.lldb_debugger_create_target_simple(@ptr, filename.to_s)
|
|
67
83
|
raise LLDBError, "Failed to create target for '#{filename}'" if target_ptr.nil? || target_ptr.null?
|
|
68
84
|
|
|
69
|
-
target = Target.new(target_ptr, debugger: self)
|
|
85
|
+
target = Target.new(target_ptr, debugger: self, context: context)
|
|
70
86
|
@targets << target
|
|
71
87
|
target
|
|
72
88
|
end
|
|
@@ -86,7 +102,7 @@ module LLDB
|
|
|
86
102
|
target_ptr = FFIBindings.lldb_debugger_get_target_at_index(@ptr, index)
|
|
87
103
|
return nil if target_ptr.nil? || target_ptr.null?
|
|
88
104
|
|
|
89
|
-
Target.new(target_ptr, debugger: self)
|
|
105
|
+
Target.new(target_ptr, debugger: self, context: context)
|
|
90
106
|
end
|
|
91
107
|
|
|
92
108
|
# @rbs return: Target?
|
|
@@ -96,7 +112,7 @@ module LLDB
|
|
|
96
112
|
target_ptr = FFIBindings.lldb_debugger_get_selected_target(@ptr)
|
|
97
113
|
return nil if target_ptr.nil? || target_ptr.null?
|
|
98
114
|
|
|
99
|
-
Target.new(target_ptr, debugger: self)
|
|
115
|
+
Target.new(target_ptr, debugger: self, context: context)
|
|
100
116
|
end
|
|
101
117
|
|
|
102
118
|
# @rbs return: Array[Target]
|
|
@@ -145,7 +161,7 @@ module LLDB
|
|
|
145
161
|
target_ptr = FFIBindings.lldb_debugger_find_target_with_process_id(@ptr, pid)
|
|
146
162
|
return nil if target_ptr.nil? || target_ptr.null?
|
|
147
163
|
|
|
148
|
-
Target.new(target_ptr, debugger: self)
|
|
164
|
+
Target.new(target_ptr, debugger: self, context: context)
|
|
149
165
|
end
|
|
150
166
|
|
|
151
167
|
# @rbs return: String?
|
|
@@ -160,7 +176,27 @@ module LLDB
|
|
|
160
176
|
ci_ptr = FFIBindings.lldb_debugger_get_command_interpreter(@ptr)
|
|
161
177
|
raise LLDBError, 'Failed to get command interpreter' if ci_ptr.nil? || ci_ptr.null?
|
|
162
178
|
|
|
163
|
-
CommandInterpreter.new(ci_ptr, debugger: self)
|
|
179
|
+
CommandInterpreter.new(ci_ptr, debugger: self, context: context)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# @rbs return: Broadcaster
|
|
183
|
+
def broadcaster
|
|
184
|
+
raise InvalidObjectError, 'Debugger is not valid' unless valid?
|
|
185
|
+
|
|
186
|
+
broadcaster_ptr = FFIBindings.lldb_debugger_get_broadcaster(@ptr)
|
|
187
|
+
raise LLDBError, 'Failed to get debugger broadcaster' if broadcaster_ptr.nil? || broadcaster_ptr.null?
|
|
188
|
+
|
|
189
|
+
Broadcaster.from_ptr(broadcaster_ptr, context: context)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# @rbs return: Listener
|
|
193
|
+
def listener
|
|
194
|
+
raise InvalidObjectError, 'Debugger is not valid' unless valid?
|
|
195
|
+
|
|
196
|
+
listener_ptr = FFIBindings.lldb_debugger_get_listener(@ptr)
|
|
197
|
+
raise LLDBError, 'Failed to get debugger listener' if listener_ptr.nil? || listener_ptr.null?
|
|
198
|
+
|
|
199
|
+
Listener.from_ptr(listener_ptr, context: context)
|
|
164
200
|
end
|
|
165
201
|
|
|
166
202
|
# @rbs command: String
|
|
@@ -175,5 +211,12 @@ module LLDB
|
|
|
175
211
|
def to_ptr
|
|
176
212
|
@ptr
|
|
177
213
|
end
|
|
214
|
+
|
|
215
|
+
private
|
|
216
|
+
|
|
217
|
+
# @rbs return: void
|
|
218
|
+
def close_context
|
|
219
|
+
context!.close(except: @native_handle)
|
|
220
|
+
end
|
|
178
221
|
end
|
|
179
222
|
end
|
data/lib/lldb/error.rb
CHANGED
|
@@ -5,11 +5,45 @@
|
|
|
5
5
|
module LLDB
|
|
6
6
|
class LLDBError < StandardError; end
|
|
7
7
|
class InvalidObjectError < LLDBError; end
|
|
8
|
+
class ClosedObjectError < InvalidObjectError; end
|
|
9
|
+
class LifecycleError < LLDBError; end
|
|
8
10
|
class LaunchError < LLDBError; end
|
|
9
11
|
class AttachError < LLDBError; end
|
|
10
12
|
class BreakpointError < LLDBError; end
|
|
11
13
|
class EvaluationError < LLDBError; end
|
|
12
14
|
class UnsupportedAPIError < LLDBError; end
|
|
15
|
+
class UnsupportedPlatformError < LLDBError; end
|
|
16
|
+
class IncompatibleWrapperError < LLDBError; end
|
|
17
|
+
|
|
18
|
+
class OperationError < LLDBError
|
|
19
|
+
attr_reader :operation, :error, :code, :error_type
|
|
20
|
+
|
|
21
|
+
# @rbs operation: String
|
|
22
|
+
# @rbs error: Error
|
|
23
|
+
# @rbs return: void
|
|
24
|
+
def initialize(operation, error)
|
|
25
|
+
@operation = operation
|
|
26
|
+
@error = error
|
|
27
|
+
@code = error.code
|
|
28
|
+
@error_type = error.type
|
|
29
|
+
super("LLDB operation '#{operation}' failed (type=#{error.type_name}, code=#{error.code}): #{error.message}")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class InternalBindingError < LLDBError
|
|
34
|
+
attr_reader :operation, :native_message, :native_code
|
|
35
|
+
|
|
36
|
+
# @rbs operation: String
|
|
37
|
+
# @rbs native_message: String
|
|
38
|
+
# @rbs native_code: Integer
|
|
39
|
+
# @rbs return: void
|
|
40
|
+
def initialize(operation, native_message, native_code)
|
|
41
|
+
@operation = operation
|
|
42
|
+
@native_message = native_message
|
|
43
|
+
@native_code = native_code
|
|
44
|
+
super("Native wrapper operation '#{operation}' failed (code=#{native_code}): #{native_message}")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
13
47
|
|
|
14
48
|
class Error
|
|
15
49
|
# @rbs ptr: FFI::Pointer?
|
|
@@ -43,10 +77,22 @@ module LLDB
|
|
|
43
77
|
alias to_s message
|
|
44
78
|
|
|
45
79
|
# @rbs return: Integer
|
|
46
|
-
def
|
|
80
|
+
def code
|
|
47
81
|
FFIBindings.lldb_error_get_error(@ptr)
|
|
48
82
|
end
|
|
49
83
|
|
|
84
|
+
alias error_code code
|
|
85
|
+
|
|
86
|
+
# @rbs return: Integer
|
|
87
|
+
def type
|
|
88
|
+
FFIBindings.lldb_error_get_type(@ptr)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# @rbs return: String
|
|
92
|
+
def type_name
|
|
93
|
+
ErrorType::NAMES.fetch(type, 'unknown')
|
|
94
|
+
end
|
|
95
|
+
|
|
50
96
|
# @rbs return: void
|
|
51
97
|
def clear
|
|
52
98
|
FFIBindings.lldb_error_clear(@ptr)
|
|
@@ -63,9 +109,10 @@ module LLDB
|
|
|
63
109
|
@ptr
|
|
64
110
|
end
|
|
65
111
|
|
|
112
|
+
# @rbs operation: String
|
|
66
113
|
# @rbs return: void
|
|
67
|
-
def raise_if_error!
|
|
68
|
-
raise
|
|
114
|
+
def raise_if_error!(operation = 'native operation')
|
|
115
|
+
raise OperationError.new(operation, self) if fail?
|
|
69
116
|
end
|
|
70
117
|
end
|
|
71
118
|
end
|
data/lib/lldb/event.rb
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module LLDB
|
|
6
|
+
class Event
|
|
7
|
+
prepend NativeLifecycle
|
|
8
|
+
|
|
9
|
+
# @rbs context: Context?
|
|
10
|
+
# @rbs pointer: FFI::Pointer
|
|
11
|
+
# @rbs return: void
|
|
12
|
+
def initialize(pointer, context: nil)
|
|
13
|
+
initialize_native_object(
|
|
14
|
+
pointer,
|
|
15
|
+
release: ->(released) { FFIBindings.lldb_event_destroy(released) },
|
|
16
|
+
context: context
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @rbs ptr: FFI::Pointer
|
|
21
|
+
# @rbs context: Context?
|
|
22
|
+
# @rbs return: Event
|
|
23
|
+
def self.from_ptr(ptr, context: nil)
|
|
24
|
+
new(ptr, context: context)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @rbs return: bool
|
|
28
|
+
def valid?
|
|
29
|
+
!@ptr.null? && FFIBindings.lldb_event_is_valid(@ptr) != 0
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @rbs return: Integer
|
|
33
|
+
def type
|
|
34
|
+
return 0 unless valid?
|
|
35
|
+
|
|
36
|
+
FFIBindings.lldb_event_get_type(@ptr)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @rbs return: String?
|
|
40
|
+
def data_flavor
|
|
41
|
+
return nil unless valid?
|
|
42
|
+
|
|
43
|
+
FFIBindings.lldb_event_get_data_flavor(@ptr)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @rbs return: String?
|
|
47
|
+
def broadcaster_class
|
|
48
|
+
return nil unless valid?
|
|
49
|
+
|
|
50
|
+
FFIBindings.lldb_event_get_broadcaster_class(@ptr)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @rbs return: String
|
|
54
|
+
def description
|
|
55
|
+
return '' unless valid?
|
|
56
|
+
|
|
57
|
+
NativeBuffer.read_c_string do |buffer, length|
|
|
58
|
+
FFIBindings.lldb_event_get_description(@ptr, buffer, length)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @rbs return: Broadcaster?
|
|
63
|
+
def broadcaster
|
|
64
|
+
return nil unless valid?
|
|
65
|
+
|
|
66
|
+
broadcaster_ptr = FFIBindings.lldb_event_get_broadcaster(@ptr)
|
|
67
|
+
return nil if broadcaster_ptr.nil? || broadcaster_ptr.null?
|
|
68
|
+
|
|
69
|
+
Broadcaster.from_ptr(broadcaster_ptr, context: context)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @rbs return: bool
|
|
73
|
+
def process_event?
|
|
74
|
+
valid? && FFIBindings.lldb_event_is_process_event(@ptr) != 0
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# @rbs return: Integer
|
|
78
|
+
def process_state
|
|
79
|
+
return State::INVALID unless valid?
|
|
80
|
+
|
|
81
|
+
FFIBindings.lldb_event_get_process_state(@ptr)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @rbs return: Process?
|
|
85
|
+
def process
|
|
86
|
+
return nil unless process_event?
|
|
87
|
+
|
|
88
|
+
process_ptr = FFIBindings.lldb_event_get_process(@ptr)
|
|
89
|
+
return nil if process_ptr.nil? || process_ptr.null?
|
|
90
|
+
|
|
91
|
+
Process.new(process_ptr, target: nil, context: context)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @rbs return: bool
|
|
95
|
+
def restarted?
|
|
96
|
+
valid? && FFIBindings.lldb_event_get_restarted(@ptr) != 0
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @rbs return: bool
|
|
100
|
+
def interrupted?
|
|
101
|
+
valid? && FFIBindings.lldb_event_get_interrupted(@ptr) != 0
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @rbs return: FFI::Pointer
|
|
105
|
+
def to_ptr
|
|
106
|
+
@ptr
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# rbs_inline: enabled
|
|
4
|
+
|
|
5
|
+
module LLDB
|
|
6
|
+
module DynamicValue
|
|
7
|
+
NO_DYNAMIC = 0
|
|
8
|
+
CAN_RUN_TARGET = 1
|
|
9
|
+
DONT_RUN_TARGET = 2
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class ExpressionOptions
|
|
13
|
+
prepend NativeLifecycle
|
|
14
|
+
|
|
15
|
+
# @rbs context: Context?
|
|
16
|
+
# @rbs return: void
|
|
17
|
+
def initialize(context: nil)
|
|
18
|
+
ptr = FFIBindings.lldb_expression_options_create
|
|
19
|
+
initialize_native_object(
|
|
20
|
+
ptr,
|
|
21
|
+
release: ->(released) { FFIBindings.lldb_expression_options_destroy(released) },
|
|
22
|
+
context: context
|
|
23
|
+
)
|
|
24
|
+
@language = nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @rbs return: bool
|
|
28
|
+
def valid?
|
|
29
|
+
!@ptr.null?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @rbs return: Integer
|
|
33
|
+
def timeout
|
|
34
|
+
FFIBindings.lldb_expression_options_get_timeout(@ptr)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @rbs value: Integer
|
|
38
|
+
# @rbs return: void
|
|
39
|
+
def timeout=(value)
|
|
40
|
+
FFIBindings.lldb_expression_options_set_timeout(@ptr, value)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @rbs return: bool
|
|
44
|
+
def unwind_on_error?
|
|
45
|
+
FFIBindings.lldb_expression_options_get_unwind_on_error(@ptr) != 0
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @rbs value: bool
|
|
49
|
+
# @rbs return: void
|
|
50
|
+
def unwind_on_error=(value)
|
|
51
|
+
FFIBindings.lldb_expression_options_set_unwind_on_error(@ptr, value ? 1 : 0)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @rbs return: bool
|
|
55
|
+
def ignore_breakpoints?
|
|
56
|
+
FFIBindings.lldb_expression_options_get_ignore_breakpoints(@ptr) != 0
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @rbs value: bool
|
|
60
|
+
# @rbs return: void
|
|
61
|
+
def ignore_breakpoints=(value)
|
|
62
|
+
FFIBindings.lldb_expression_options_set_ignore_breakpoints(@ptr, value ? 1 : 0)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @rbs return: Integer
|
|
66
|
+
def fetch_dynamic_value
|
|
67
|
+
FFIBindings.lldb_expression_options_get_fetch_dynamic_value(@ptr)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# @rbs value: Integer
|
|
71
|
+
# @rbs return: void
|
|
72
|
+
def fetch_dynamic_value=(value)
|
|
73
|
+
FFIBindings.lldb_expression_options_set_fetch_dynamic_value(@ptr, value)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @rbs return: bool
|
|
77
|
+
def try_all_threads?
|
|
78
|
+
FFIBindings.lldb_expression_options_get_try_all_threads(@ptr) != 0
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @rbs value: bool
|
|
82
|
+
# @rbs return: void
|
|
83
|
+
def try_all_threads=(value)
|
|
84
|
+
FFIBindings.lldb_expression_options_set_try_all_threads(@ptr, value ? 1 : 0)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @rbs return: bool
|
|
88
|
+
def stop_others?
|
|
89
|
+
FFIBindings.lldb_expression_options_get_stop_others(@ptr) != 0
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @rbs value: bool
|
|
93
|
+
# @rbs return: void
|
|
94
|
+
def stop_others=(value)
|
|
95
|
+
FFIBindings.lldb_expression_options_set_stop_others(@ptr, value ? 1 : 0)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# @rbs return: Integer?
|
|
99
|
+
attr_reader :language
|
|
100
|
+
|
|
101
|
+
# @rbs value: Integer
|
|
102
|
+
# @rbs return: void
|
|
103
|
+
def language=(value)
|
|
104
|
+
@language = value
|
|
105
|
+
FFIBindings.lldb_expression_options_set_language(@ptr, value)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# @rbs return: bool
|
|
109
|
+
def suppress_persistent_result?
|
|
110
|
+
FFIBindings.lldb_expression_options_get_suppress_persistent_result(@ptr) != 0
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @rbs value: bool
|
|
114
|
+
# @rbs return: void
|
|
115
|
+
def suppress_persistent_result=(value)
|
|
116
|
+
FFIBindings.lldb_expression_options_set_suppress_persistent_result(@ptr, value ? 1 : 0)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @rbs return: FFI::Pointer
|
|
120
|
+
def to_ptr
|
|
121
|
+
@ptr
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|