Module: Aws::Crt::Native
- Extended by:
- FFI::Library
- Defined in:
- lib/aws-crt/native.rb
Overview
FFI Bindings to native CRT functions
Defined Under Namespace
Classes: CrtBuf, PropertyList
Class Method Summary collapse
-
.array_to_native(array) ⇒ Object
Given a ruby array of strings, return a native array: char** and the FFI::MemoryPointers (these need to be pined for the length the native memory will be used to avoid GC).
-
.attach_function(c_name, params, returns, options = {}) ⇒ Object
Extends FFI::attach_function.
-
.hash_to_native_arrays(hash) ⇒ Object
Given a ruby hash (string -> string), return two native arrays: char** (:pointer) AND a list of all of the FFI::MemoryPointers that must be kept around to avoid GC.
Class Method Details
.array_to_native(array) ⇒ Object
Given a ruby array of strings, return a native array: char** and the FFI::MemoryPointers (these need to be pined for the length the native memory will be used to avoid GC)
62 63 64 65 66 67 68 69 |
# File 'lib/aws-crt/native.rb', line 62 def self.array_to_native(array) native = FFI::MemoryPointer.new(:pointer, array.size) pointers = array.map do |s| FFI::MemoryPointer.from_string(s.to_s) end native.write_array_of_pointer(pointers) [native, pointers] end |
.attach_function(c_name, params, returns, options = {}) ⇒ Object
Extends FFI::attach_function
-
Allows us to only supply the aws_crt C name and removes
the aws_crt.
-
Wraps the call in an error-raise checker (unless options
= false)
-
Creates a bang method that does not do automatic error checking.
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/aws-crt/native.rb', line 78 def self.attach_function(c_name, params, returns, = {}) ruby_name = c_name.to_s.sub('aws_crt_', '').to_sym raise_errors = .fetch(:raise, true) .delete(:raise) unless raise_errors return super(ruby_name, c_name, params, returns, ) end bang_name = "#{ruby_name}!" no_raise_name = "#{ruby_name}_no_raise" super(no_raise_name, c_name, params, returns, ) alias_method(bang_name, no_raise_name) define_method(ruby_name) do |*args, &block| res = public_send(bang_name, *args, &block) # functions that return void cannot fail return unless res # for functions that return int, non-zero indicates failure Errors.raise_last_error if res.is_a?(Integer) && res != 0 # for functions that return pointer, NULL indicates failure Errors.raise_last_error if res.is_a?(FFI::Pointer) && res.null? res end module_function ruby_name module_function bang_name end |
.hash_to_native_arrays(hash) ⇒ Object
Given a ruby hash (string -> string), return two native arrays: char** (:pointer) AND a list of all of the FFI::MemoryPointers that must be kept around to avoid GC
53 54 55 56 57 |
# File 'lib/aws-crt/native.rb', line 53 def self.hash_to_native_arrays(hash) key_array, keys_p = array_to_native(hash.keys) value_array, values_p = array_to_native(hash.values) [key_array, value_array, keys_p + values_p] end |