ffi_call#
Invoke a C function from an opened library and return its result.
Σύνοψη#
my $n = Peta::FFI::call($lib, "strlen", "(p)L", "hello"); # 5
my $r = Peta::FFI::call($lib, "sqrt", "(d)d", 2.0); # 1.4142...
my $s = Peta::FFI::call($lib, "getenv", "(p)p", "PATH"); # /usr/bin:...
Peta::FFI::call($lib, "srand", "(i)v", 42); # void return
Ορίσματα#
$lib- handle returned bydlopen.$func- symbol name to look up in the library.$sig- signature string(args)ret; see the module-level type-code table.the remaining arguments - one value per type code in
args, coerced to the matching C type before the call.
Τι επιστρέφεται#
A single scalar whose shape depends on the return code:
i/l/L- integer.d/f- float.p- the returnedconst char *copied into a Perl string;undefif the C function returnedNULL.v-1, so the call chains naturally in boolean contexts.P- pointer returned as a string (same rules asp).
Output buffers (P)#
When an argument position is P, call allocates a zeroed buffer sized from the scalar you pass in. If the scalar is a string, its byte length (minimum 16) is used; otherwise the numeric value of the scalar (minimum 16) is taken as the byte size. The callee receives a pointer to that buffer. The buffer is freed after the call returns - if you need to read bytes the C function wrote into it, wrap the call in a helper module such as Peta::FFI::UUID that knows how to recover the buffer contents.
Οριακές περιπτώσεις#
Wrong argument count - croaks with
Peta::FFI::call FNAME: expected N args, got M.Bad signature string - croaks with
FFI signature error: ...describing the offending character or missing).Symbol not found - croaks with
Peta::FFI::call: symbol not found: FNAMEor the message reported bydlerror.Incorrect type codes - calling a function with a signature that does not match its real prototype is undefined behaviour. Check the C header before writing the signature.
String argument contains a null byte - croaks with
Peta::FFI::call: CString error: ....