File Coverage

blib/lib/ExtUtils/Typemaps/OpaqueObj.pm
Criterion Covered Total %
statement 9 16 56.2
branch n/a
condition n/a
subroutine 3 4 75.0
pod 1 1 100.0
total 13 21 61.9


line stmt bran cond sub pod time code
1             package ExtUtils::Typemaps::OpaqueObj;
2             $ExtUtils::Typemaps::OpaqueObj::VERSION = '0.004';
3 2     2   260995 use strict;
  2         4  
  2         80  
4 2     2   10 use warnings;
  2         4  
  2         117  
5              
6 2     2   15 use parent 'ExtUtils::Typemaps';
  2         4  
  2         12  
7              
8             sub new {
9 0     0 1   my $class = shift;
10              
11 0           my $self = $class->SUPER::new(@_);
12              
13 0           $self->add_inputmap(xstype => 'T_OPAQUEOBJ', code => <<'END');
14             {
15             SV * sv = $arg;
16             if (SvROK(sv) && SvPOK(SvRV(sv)) && SvCUR(SvRV(sv)) == sizeof(*$var))
17             $var = ($type)SvPV_nolen(SvRV(sv));
18             else
19             croak(\"%s: %s is not of type %s\", ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, \"$var\", \"$ntype\");
20             }
21             END
22              
23 0           $self->add_inputmap(xstype => 'T_OPAQUEOBJ_MAYBE', code => <<'END');
24             {
25             SV * sv = $arg;
26             if (SvOK(sv)) {
27             if (SvROK(sv) && SvPOK(SvRV(sv)) && SvCUR(SvRV(sv)) == sizeof(*$var))
28             $var = ($type)SvPV_nolen(SvRV(sv));
29             else
30             croak(\"%s: %s is not of type %s\", ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, \"$var\", \"$ntype\");
31             } else
32             $var = NULL;
33             }
34             END
35              
36 0           $self->add_outputmap(xstype => 'T_OPAQUEOBJ', code => <<'END');
37             {
38             sv_usepvn(newSVrv($arg, \"$ntype\"), (char*)$var, sizeof(*$var));
39             SvREADONLY_on(SvRV($arg));
40             }
41             END
42              
43 0           $self->add_outputmap(xstype => 'T_OPAQUEOBJ_MAYBE', code => <<'END');
44             if (SvOK($var)) {
45             sv_usepvn(newSVrv($arg, \"$ntype\"), (char*)$var, sizeof(*$var));
46             SvREADONLY_on(SvRV($arg));
47             }
48             END
49              
50              
51 0           return $self;
52             }
53              
54             1;
55              
56             # ABSTRACT: Typemap for storing objects as a string reference
57              
58             __END__