File Coverage

lib/ExtUtils/XSpp/Typemap/parsed.pm
Criterion Covered Total %
statement 40 41 97.5
branch 15 16 93.7
condition 12 18 66.6
subroutine 11 11 100.0
pod 5 8 62.5
total 83 94 88.3


line stmt bran cond sub pod time code
1             package ExtUtils::XSpp::Typemap::parsed;
2              
3 21     21   108 use base 'ExtUtils::XSpp::Typemap';
  21         32  
  21         1768  
4              
5 970 100 66 970   3938 sub _dl { return defined( $_[0] ) && length( $_[0] ) ? $_[0] : undef }
6              
7             sub init {
8 194     194 0 312 my $this = shift;
9 194         863 my %args = @_;
10              
11 194 50       593 if( my $base = $args{base} ) {
12 0         0 %args = ( cpp_type => $base->{CPP_TYPE},
13             call_function_code => $base->{CALL_FUNCTION_CODE},
14             output_code => $base->{OUTPUT_CODE},
15             cleanup_code => $base->{CLEANUP_CODE},
16             precall_code => $base->{PRECALL_CODE},
17             output_list => $base->{OUTPUT_LIST},
18             xs_type => $base->{XS_TYPE},
19             xs_input_code => $base->{XS_INPUT_CODE},
20             xs_output_code => $base->{XS_OUTPUT_CODE},
21             %args );
22             }
23              
24 194         686 $this->{TYPE} = $args{type};
25 194         1940 $this->{NAME} = $args{name};
26 194   66     1202 $this->{CPP_TYPE} = $args{cpp_type} || $args{arg1};
27 194   66     1050 $this->{CALL_FUNCTION_CODE} = _dl( $args{call_function_code} || $args{arg2} );
28 194   66     967 $this->{OUTPUT_CODE} = _dl( $args{output_code} || $args{arg3} );
29 194   66     1066 $this->{CLEANUP_CODE} = _dl( $args{cleanup_code} || $args{arg4} );
30 194   66     1021 $this->{PRECALL_CODE} = _dl( $args{precall_code} || $args{arg5} );
31 194         720 $this->{OUTPUT_LIST} = _dl( $args{output_list} );
32 194         579 $this->{XS_TYPE} = $args{xs_type};
33 194         525 $this->{XS_INPUT_CODE} = $args{xs_input_code};
34 194         755 $this->{XS_OUTPUT_CODE} = $args{xs_output_code};
35             }
36              
37 19 100   19 1 108 sub cpp_type { $_[0]->{CPP_TYPE} || $_[0]->{TYPE}->print }
38              
39             sub output_code {
40 7     7 1 13 my( $this, $pvar, $cvar ) = @_;
41 7 100       45 return unless defined $_[0]->{OUTPUT_CODE};
42 2         8 return _replace( $_[0]->{OUTPUT_CODE}, '$PerlVar' => $pvar, '$CVar' => $cvar );
43             }
44              
45             sub output_list {
46 13     13 0 21 my( $this, $cvar ) = @_;
47 13 100       89 return unless defined $_[0]->{OUTPUT_LIST};
48 3         8 return _replace( $_[0]->{OUTPUT_LIST}, '$CVar' => $cvar );
49             }
50              
51             sub cleanup_code {
52 7     7 1 13 my( $this, $pvar, $cvar ) = @_;
53 7 100       38 return unless defined $_[0]->{CLEANUP_CODE};
54 2         8 return _replace( $_[0]->{CLEANUP_CODE}, '$PerlVar' => $pvar, '$CVar' => $cvar );
55             }
56              
57 12     12 1 28 sub call_parameter_code { undef }
58              
59             sub call_function_code {
60 7     7 1 12 my( $this, $func, $var ) = @_;
61 7 100       44 return unless defined $this->{CALL_FUNCTION_CODE};
62 2         8 return _replace( $this->{CALL_FUNCTION_CODE},
63             '$CVar' => $var, '$Call' => $func,
64             # backward compatibility
65             '$1' => $func, '$$' => $var,
66             );
67             }
68              
69             sub precall_code {
70 12     12 0 23 my( $this, $pvar, $cvar ) = @_;
71 12 100       50 return unless defined $_[0]->{PRECALL_CODE};
72 2         10 return _replace( $this->{PRECALL_CODE},
73             '$PerlVar' => $pvar, '$CVar' => $cvar,
74             # backward compatibility
75             '$1' => $pvar, '$2' => $cvar,
76             );
77             }
78              
79             sub _replace {
80 11     11   20 my( $code ) = shift;
81 11         27 while( @_ ) {
82 27         44 my( $f, $t ) = ( shift, shift );
83 27         427 $code =~ s/\Q$f\E/$t/g;
84             }
85 11         54 return $code;
86             }
87              
88             1;