Graham Ollis 🔥🐉
and 7 contributors

NAME

FFI::Platypus::Legacy::Raw::MemPtr - FFI::Platypus::Legacy::Raw memory pointer type

VERSION

version 0.06

DESCRIPTION

FFI::Platypus::Legacy::Raw and friends are a fork of FFI::Raw that uses FFI::Platypus instead of FFI::Raw's own libffi implementation. It is intended for use when migrating from FFI::Raw to FFI::Platypus. The main reason one might have for switching from Raw to Platypus is because Platypus is actively maintained, provides a more powerful interface, can be much faster when functions are "attached", and works on more platforms than Raw. This module should be a drop in replacement for FFI::Raw, simply replace all instances of FFI::Raw to FFI::Platypus::Legacy::Raw. See also Alt::FFI::Raw::Platypus for a way to use this module without making any source code changes.

A FFI::Platypus::Legacy::Raw::MemPtr represents a memory pointer which can be passed to functions taking a FFI::Platypus::Legacy::Raw::ptr argument.

The allocated memory is automatically deallocated once the object is not in use anymore.

CONSTRUCTORS

new

 FFI::Platypus::Legacy::Raw::MemPtr->new( $length );

Allocate a new FFI::Platypus::Legacy::Raw::MemPtr of size $length bytes.

new_from_buf

 my $memptr = FFI::Platypus::Legacy::Raw::MemPtr->new_from_buf( $buffer, $length );

Allocate a new FFI::Platypus::Legacy::Raw::MemPtr of size $length bytes and copy $buffer into it. This can be used, for example, to pass a pointer to a function that takes a C struct pointer, by using pack() or the Convert::Binary::C module to create the actual struct content.

For example, consider the following C code

 struct some_struct {
   int some_int;
   char some_str[];
 };
 
 extern void take_one_struct(struct some_struct *arg) {
   if (arg->some_int == 42)
     puts(arg->some_str);
 }

It can be called using FFI::Platypus::Legacy::Raw as follows:

 use FFI::Platypus::Legacy::Raw;
 
 my $packed = pack('ix![p]p', 42, 'hello');
 my $arg = FFI::Platypus::Legacy::Raw::MemPtr->new_from_buf($packed, length $packed);
 
 my $take_one_struct = FFI::Platypus::Legacy::Raw->new(
   $shared, 'take_one_struct',
   FFI::Platypus::Legacy::Raw::void, FFI::Platypus::Legacy::Raw::ptr
 );
 
 $take_one_struct->($arg);

Which would print hello.

new_from_ptr

 my $memptr = FFI::Platypus::Legacy::Raw::MemPtr->new_from_ptr( $ptr );

Allocate a new FFI::Platypus::Legacy::Raw::MemPtr pointing to the $ptr, which can be either a FFI::Platypus::Legacy::Raw::MemPtr or a pointer returned by another function.

This is the FFI::Platypus::Legacy::Raw equivalent of a pointer to a pointer.

METHODS

to_perl_str

 my $memptr = FFI::Platypus::Legacy::Raw::MemPtr->to_perl_str;
 my $memptr = FFI::Platypus::Legacy::Raw::MemPtr->to_perl_str( $length );

Convert a FFI::Platypus::Legacy::Raw::MemPtr to a Perl string. If $length is not provided, the length of the string will be computed using strlen().

AUTHOR

Original author: Alessandro Ghedini (ghedo, ALEXBIO)

Current maintainer: Graham Ollis <plicease@cpan.org>

Contributors:

Bakkiaraj Murugesan (bakkiaraj)

Dylan Cali (CALID)

Brian Wightman (MidLifeXis, MLX)

David Steinbrunner (dsteinbrunner)

Olivier Mengué (DOLMEN)

COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Alessandro Ghedini.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.