Class: FFI::Function
- Inherits:
-
Pointer
- Object
- AbstractMemory
- Pointer
- FFI::Function
- Defined in:
- lib/ffi/function.rb,
ext/ffi_c/Function.c
Constant Summary
Constants inherited from Pointer
Instance Method Summary collapse
-
#attach(m, name) ⇒ self
Attach a Function to the Module
masname. -
#autorelease ⇒ Boolean
Get
autoreleaseattribute. -
#autorelease=(autorelease) ⇒ self
Set
autoreleaseattribute (See Pointer). -
#autorelease? ⇒ Boolean
Get
autoreleaseattribute. -
#call(*args) ⇒ FFI::Type
Call the function.
-
#free ⇒ self
Free memory allocated by Function.
-
#initialize(*args) ⇒ self
constructor
A new Function instance.
-
#initialize_copy(other) ⇒ nil
DO NOT CALL THIS METHOD.
-
#param_types ⇒ Array<FFI::Type>
Retrieve Array of parameter types.
-
#return_type ⇒ FFI::Type
Retrieve the return type of the function.
Methods inherited from Pointer
#+, #==, #address, #inspect, #null?, #order, #read, #read_array_of_type, #read_string, #read_string_length, #read_string_to_null, size, #slice, #to_ptr, #to_s, #type_size, #write, #write_array_of_type, #write_string, #write_string_length
Methods inherited from AbstractMemory
#[], #__copy_from__, #clear, #freeze, #get, #get_array_of_float32, #get_array_of_float64, #get_array_of_pointer, #get_array_of_string, #get_bytes, #get_float32, #get_float64, #get_pointer, #get_string, #put, #put_array_of_float32, #put_array_of_float64, #put_array_of_pointer, #put_bytes, #put_float32, #put_float64, #put_pointer, #put_string, #read_array_of_double, #read_array_of_float, #read_array_of_pointer, #read_array_of_string, #read_bytes, #read_double, #read_float, #read_pointer, #size_limit?, #total, #type_size, #write_array_of_double, #write_array_of_float, #write_array_of_pointer, #write_bytes, #write_double, #write_float, #write_pointer
Constructor Details
#initialize(return_type, param_types, options = {}) {|i| ... } ⇒ self #initialize(return_type, param_types, proc, options = {}) ⇒ self
A new Function instance.
Define a function from a Proc or a block.
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 |
# File 'ext/ffi_c/Function.c', line 346 static VALUE function_initialize(int argc, VALUE* argv, VALUE self) { VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil; VALUE rbFunctionInfo = Qnil; VALUE infoArgv[3]; int nargs; nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions); /* * Callback with block, * e.g. Function.new(:int, [ :int ]) { |i| blah } * or Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah } */ if (rb_block_given_p()) { if (nargs > 3) { rb_raise(rb_eArgError, "cannot create function with both proc/address and block"); } rbOptions = rbProc; rbProc = rb_block_proc(); } else { /* Callback with proc, or Function with address * e.g. Function.new(:int, [ :int ], Proc.new { |i| }) * Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall }) * Function.new(:int, [ :int ], addr) * Function.new(:int, [ :int ], addr, { :convention => :stdcall }) */ } infoArgv[0] = rbReturnType; infoArgv[1] = rbParamTypes; infoArgv[2] = rbOptions; rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass); function_init(self, rbFunctionInfo, rbProc); return self; } |
Instance Method Details
#attach(m, name) ⇒ self
Attach a Function to the Module m as name.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/ffi/function.rb', line 56 def attach(mod, name) this = self body = proc do |*args, &block| this.call(*args, &block) end mod.define_method(name, body) mod.define_singleton_method(name, body) # Store function Proc's for re-definition as Ractor-shareable in Library#freeze funcs = mod.instance_variable_get("@ffi_function_procs") unless funcs funcs = {} mod.instance_variable_set("@ffi_function_procs", funcs) end funcs[name] = self self end |
#autorelease ⇒ Boolean
Get autorelease attribute. Synonymous for #autorelease?.
561 562 563 564 565 566 567 568 569 |
# File 'ext/ffi_c/Function.c', line 561 static VALUE function_autorelease_p(VALUE self) { Function* fn; TypedData_Get_Struct(self, Function, &function_data_type, fn); return fn->autorelease ? Qtrue : Qfalse; } |
#autorelease=(autorelease) ⇒ self
Set autorelease attribute (See Pointer).
548 549 550 551 552 553 554 555 556 557 558 559 |
# File 'ext/ffi_c/Function.c', line 548 static VALUE function_set_autorelease(VALUE self, VALUE autorelease) { Function* fn; rb_check_frozen(self); TypedData_Get_Struct(self, Function, &function_data_type, fn); fn->autorelease = RTEST(autorelease); return self; } |
#autorelease? ⇒ Boolean
Get autorelease attribute.
561 562 563 564 565 566 567 568 569 |
# File 'ext/ffi_c/Function.c', line 561 static VALUE function_autorelease_p(VALUE self) { Function* fn; TypedData_Get_Struct(self, Function, &function_data_type, fn); return fn->autorelease ? Qtrue : Qfalse; } |
#call(*args) ⇒ FFI::Type
Call the function
493 494 495 496 497 498 499 500 501 |
# File 'ext/ffi_c/Function.c', line 493 static VALUE function_call(int argc, VALUE* argv, VALUE self) { Function* fn; TypedData_Get_Struct(self, Function, &function_data_type, fn); return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info); } |
#free ⇒ self
Free memory allocated by Function.
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 |
# File 'ext/ffi_c/Function.c', line 586 static VALUE function_release(VALUE self) { Function* fn; TypedData_Get_Struct(self, Function, &function_data_type, fn); if (fn->closure == NULL) { rb_raise(rb_eRuntimeError, "cannot free function which was not allocated"); } rbffi_Closure_Free(fn->closure); fn->closure = NULL; return self; } |
#initialize_copy(other) ⇒ nil
DO NOT CALL THIS METHOD
392 393 394 395 396 397 |
# File 'ext/ffi_c/Function.c', line 392 static VALUE function_initialize_copy(VALUE self, VALUE other) { rb_raise(rb_eRuntimeError, "cannot duplicate function instances"); return Qnil; } |
#param_types ⇒ Array<FFI::Type>
Retrieve Array of parameter types
This method returns an Array of FFI types accepted as function parameters.
49 50 51 |
# File 'lib/ffi/function.rb', line 49 def param_types type.param_types end |
#return_type ⇒ FFI::Type
Retrieve the return type of the function
This method returns FFI type returned by the function.
40 41 42 |
# File 'lib/ffi/function.rb', line 40 def return_type type.return_type end |