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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -4
  3. data/README.md +86 -2
  4. data/Rakefile +36 -0
  5. data/bindings/constants.yml +137 -0
  6. data/bindings/surface.yml +3072 -0
  7. data/ext/lldb/discovery.rb +101 -0
  8. data/ext/lldb/extconf.rb +206 -88
  9. data/ext/lldb/lldb_wrapper.cpp +7934 -877
  10. data/ext/lldb/lldb_wrapper.h +596 -333
  11. data/lib/lldb/address.rb +81 -0
  12. data/lib/lldb/api_support.rb +23 -6
  13. data/lib/lldb/attach_info.rb +122 -0
  14. data/lib/lldb/block.rb +121 -0
  15. data/lib/lldb/breakpoint.rb +11 -6
  16. data/lib/lldb/breakpoint_location.rb +20 -5
  17. data/lib/lldb/broadcaster.rb +79 -0
  18. data/lib/lldb/command_interpreter.rb +9 -4
  19. data/lib/lldb/command_return_object.rb +24 -5
  20. data/lib/lldb/compile_unit.rb +64 -0
  21. data/lib/lldb/context.rb +81 -0
  22. data/lib/lldb/debugger.rb +55 -12
  23. data/lib/lldb/error.rb +50 -3
  24. data/lib/lldb/event.rb +109 -0
  25. data/lib/lldb/expression_options.rb +124 -0
  26. data/lib/lldb/ffi_bindings.rb +313 -31
  27. data/lib/lldb/file_spec.rb +90 -0
  28. data/lib/lldb/file_spec_list.rb +78 -0
  29. data/lib/lldb/frame.rb +109 -17
  30. data/lib/lldb/function.rb +121 -0
  31. data/lib/lldb/instruction.rb +83 -0
  32. data/lib/lldb/instruction_list.rb +68 -0
  33. data/lib/lldb/launch_info.rb +145 -19
  34. data/lib/lldb/line_entry.rb +75 -0
  35. data/lib/lldb/listener.rb +96 -0
  36. data/lib/lldb/memory_region_info.rb +8 -3
  37. data/lib/lldb/module.rb +46 -5
  38. data/lib/lldb/native.rb +36 -0
  39. data/lib/lldb/native_buffer.rb +32 -0
  40. data/lib/lldb/native_handle.rb +60 -0
  41. data/lib/lldb/native_lifecycle.rb +64 -0
  42. data/lib/lldb/native_string_array.rb +34 -0
  43. data/lib/lldb/process.rb +102 -40
  44. data/lib/lldb/symbol.rb +117 -0
  45. data/lib/lldb/symbol_context.rb +9 -4
  46. data/lib/lldb/target.rb +69 -67
  47. data/lib/lldb/thread.rb +51 -18
  48. data/lib/lldb/type.rb +40 -3
  49. data/lib/lldb/type_member.rb +67 -0
  50. data/lib/lldb/types.rb +69 -4
  51. data/lib/lldb/value.rb +27 -17
  52. data/lib/lldb/value_list.rb +9 -5
  53. data/lib/lldb/version.rb +1 -1
  54. data/lib/lldb/watchpoint.rb +26 -9
  55. data/lib/lldb.rb +78 -10
  56. data/lldb.gemspec +4 -1
  57. data/rbs_collection.yaml +1 -1
  58. data/script/check_bindings +259 -0
  59. data/script/guard_c_exports +139 -0
  60. data/sig/lldb/ffi_bindings.rbs +247 -21
  61. data/sig/lldb/weak_ref.rbs +7 -0
  62. metadata +30 -6
  63. data/ext/lldb/Makefile +0 -24
  64. data/ext/lldb/liblldb_wrapper.dylib +0 -0
  65. data/ext/lldb/lldb_wrapper.o +0 -0
  66. 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
@@ -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.lldb_debugger_create
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
- ObjectSpace.define_finalizer(self, self.class.release(@ptr))
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 error_code
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 LLDBError, message if fail?
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