File Coverage

blib/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   109 use base 'ExtUtils::XSpp::Typemap';
  21         28  
  21         1358  
4              
5 970 100 66 970   2207 sub _dl { return defined( $_[0] ) && length( $_[0] ) ? $_[0] : undef }
6              
7             sub init {
8 194     194 0 326 my $this = shift;
9 194         648 my %args = @_;
10              
11 194 50       515 if( my $base = $args{base} ) {
12             %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 0         0 %args );
22             }
23              
24 194         420 $this->{TYPE} = $args{type};
25 194         304 $this->{NAME} = $args{name};
26 194   66     589 $this->{CPP_TYPE} = $args{cpp_type} || $args{arg1};
27 194   66     581 $this->{CALL_FUNCTION_CODE} = _dl( $args{call_function_code} || $args{arg2} );
28 194   66     512 $this->{OUTPUT_CODE} = _dl( $args{output_code} || $args{arg3} );
29 194   66     491 $this->{CLEANUP_CODE} = _dl( $args{cleanup_code} || $args{arg4} );
30 194   66     506 $this->{PRECALL_CODE} = _dl( $args{precall_code} || $args{arg5} );
31 194         556 $this->{OUTPUT_LIST} = _dl( $args{output_list} );
32 194         438 $this->{XS_TYPE} = $args{xs_type};
33 194         292 $this->{XS_INPUT_CODE} = $args{xs_input_code};
34 194         541 $this->{XS_OUTPUT_CODE} = $args{xs_output_code};
35             }
36              
37 19 100   19 1 52 sub cpp_type { $_[0]->{CPP_TYPE} || $_[0]->{TYPE}->print }
38              
39             sub output_code {
40 7     7 1 11 my( $this, $pvar, $cvar ) = @_;
41 7 100       19 return unless defined $_[0]->{OUTPUT_CODE};
42 2         6 return _replace( $_[0]->{OUTPUT_CODE}, '$PerlVar' => $pvar, '$CVar' => $cvar );
43             }
44              
45             sub output_list {
46 13     13 0 22 my( $this, $cvar ) = @_;
47 13 100       36 return unless defined $_[0]->{OUTPUT_LIST};
48 3         53 return _replace( $_[0]->{OUTPUT_LIST}, '$CVar' => $cvar );
49             }
50              
51             sub cleanup_code {
52 7     7 1 12 my( $this, $pvar, $cvar ) = @_;
53 7 100       19 return unless defined $_[0]->{CLEANUP_CODE};
54 2         5 return _replace( $_[0]->{CLEANUP_CODE}, '$PerlVar' => $pvar, '$CVar' => $cvar );
55             }
56              
57 12     12 1 17 sub call_parameter_code { undef }
58              
59             sub call_function_code {
60 7     7 1 11 my( $this, $func, $var ) = @_;
61 7 100       22 return unless defined $this->{CALL_FUNCTION_CODE};
62             return _replace( $this->{CALL_FUNCTION_CODE},
63 2         6 '$CVar' => $var, '$Call' => $func,
64             # backward compatibility
65             '$1' => $func, '$$' => $var,
66             );
67             }
68              
69             sub precall_code {
70 12     12 0 20 my( $this, $pvar, $cvar ) = @_;
71 12 100       29 return unless defined $_[0]->{PRECALL_CODE};
72             return _replace( $this->{PRECALL_CODE},
73 2         6 '$PerlVar' => $pvar, '$CVar' => $cvar,
74             # backward compatibility
75             '$1' => $pvar, '$2' => $cvar,
76             );
77             }
78              
79             sub _replace {
80 11     11   13 my( $code ) = shift;
81 11         17 while( @_ ) {
82 27         40 my( $f, $t ) = ( shift, shift );
83 27         294 $code =~ s/\Q$f\E/$t/g;
84             }
85 11         31 return $code;
86             }
87              
88             1;