FFI-C
view release on metacpan or search on metacpan
lib/FFI/C/StructDef.pm view on Meta::CPAN
package FFI::C::StructDef;
use strict;
use warnings;
use 5.008001;
use FFI::C::Util;
use FFI::C::Struct;
use FFI::C::FFI ();
use FFI::Platypus 1.24;
use Ref::Util qw( is_blessed_ref is_plain_arrayref is_ref );
use Carp ();
use Sub::Install ();
use Sub::Util ();
use Scalar::Util qw( refaddr );
use constant _is_union => 0;
use base qw( FFI::C::Def );
our @CARP_NOT = qw( FFI::C::Util FFI::C );
# ABSTRACT: Structured data definition for FFI
our $VERSION = '0.15'; # VERSION
sub _is_kind
{
my($self, $name, $want) = @_;
my $kind = eval { $self->ffi->kindof($name) };
return undef unless defined $kind;
return $kind eq $want;
}
sub new
{
my $self = shift->SUPER::new(@_);
my %args = %{ delete $self->{args} };
$self->{trim_string} = delete $args{trim_string} ? 1 : 0;
my $offset = 0;
my $alignment = 0;
my $anon = 0;
if(my @members = @{ delete $args{members} || [] })
{
Carp::croak("Odd number of arguments in member spec") if scalar(@members) % 2;
while(@members)
{
my $name = shift @members;
my $spec = shift @members;
my %member;
if($name ne ':' && $self->{members}->{$name})
{
Carp::croak("More than one member with the name $name");
}
if($name eq ':')
{
$name .= (++$anon);
}
elsif($name !~ /^[A-Za-z_][A-Za-z_0-9]*$/)
{
Carp::croak("Illegal member name");
}
elsif($name eq 'new')
{
Carp::croak("new now allowed as a member name");
}
if(my $def = $self->ffi->def('FFI::C::Def', $spec))
( run in 0.377 second using v1.01-cache-2.11-cpan-39bf76dae61 )