File Coverage

blib/lib/YAML/XS.pm
Criterion Covered Total %
statement 56 72 77.7
branch 10 14 71.4
condition 1 3 33.3
subroutine 12 13 92.3
pod 0 2 0.0
total 79 104 75.9


line stmt bran cond sub pod time code
1 49     49   740757 use strict; use warnings;
  49     49   80  
  49         1463  
  49         205  
  49         66  
  49         3073  
2              
3             package YAML::XS;
4             our $VERSION = 'v0.905.1'; # TRIAL VERSION
5              
6 49     49   228 use base 'Exporter';
  49         69  
  49         2261  
7              
8             @YAML::XS::EXPORT = qw(Load Dump);
9             @YAML::XS::EXPORT_OK = qw(LoadFile DumpFile);
10             %YAML::XS::EXPORT_TAGS = (
11             all => [qw(Dump Load LoadFile DumpFile)],
12             );
13             our (
14             $Boolean,
15             $DumpCode,
16             $ForbidDuplicateKeys,
17             $Indent,
18             $LoadBlessed,
19             $LoadCode,
20             $UseCode,
21             );
22             $ForbidDuplicateKeys = 0;
23             # $YAML::XS::UseCode = 0;
24             # $YAML::XS::DumpCode = 0;
25             # $YAML::XS::LoadCode = 0;
26              
27             $YAML::XS::QuoteNumericStrings = 1;
28              
29 49     49   17560 use YAML::XS::LibYAML qw(Load Dump);
  49         129  
  49         4035  
30 49     49   343 use Scalar::Util qw/ openhandle /;
  49         75  
  49         42882  
31              
32             sub DumpFile {
33 4     4 0 296904 my $OUT;
34 4         65 my $filename = shift;
35 4 100       247 if (openhandle $filename) {
36 2         34 $OUT = $filename;
37             }
38             else {
39 2         2 my $mode = '>';
40 2 50       9 if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) {
41 0         0 ($mode, $filename) = ($1, $2);
42             }
43 2 50       302 open $OUT, $mode, $filename
44             or die "Can't open '$filename' for output:\n$!";
45             }
46 4         121 local $/ = "\n"; # reset special to "sane"
47 4         919 print $OUT YAML::XS::LibYAML::Dump(@_);
48             }
49              
50             sub LoadFile {
51 6     6 0 414643 my $IN;
52 6         51 my $filename = shift;
53 6 100       281 if (openhandle $filename) {
54 2         30 $IN = $filename;
55             }
56             else {
57 4 50       230 open $IN, '<', $filename
58             or die "Can't open '$filename' for input:\n$!";
59             }
60 6         26 return YAML::XS::LibYAML::Load(do { local $/; local $_ = <$IN> });
  6         118  
  6         3140  
61             }
62              
63              
64             # XXX The following code should be moved from Perl to C.
65             $YAML::XS::coderef2text = sub {
66             my $coderef = shift;
67             require B::Deparse;
68             my $deparse = B::Deparse->new();
69             my $text;
70             eval {
71             local $^W = 0;
72             $text = $deparse->coderef2text($coderef);
73             };
74             if ($@) {
75             warn "YAML::XS failed to dump code ref:\n$@";
76             return;
77             }
78             $text =~ s[BEGIN \{\$\{\^WARNING_BITS\} = "UUUUUUUUUUUU\\001"\}]
79             [use warnings;]g;
80              
81             return $text;
82             };
83              
84             $YAML::XS::glob2hash = sub {
85             my $hash = {};
86             for my $type (qw(PACKAGE NAME SCALAR ARRAY HASH CODE IO)) {
87             my $value = *{$_[0]}{$type};
88             $value = $$value if $type eq 'SCALAR';
89             if (defined $value) {
90             if ($type eq 'IO') {
91             my @stats = qw(device inode mode links uid gid rdev size
92             atime mtime ctime blksize blocks);
93             undef $value;
94             $value->{stat} = {};
95             map {$value->{stat}{shift @stats} = $_} stat(*{$_[0]});
96             $value->{fileno} = fileno(*{$_[0]});
97             {
98             local $^W;
99             $value->{tell} = tell(*{$_[0]});
100             }
101             }
102             $hash->{$type} = $value;
103             }
104             }
105             return $hash;
106             };
107              
108             use constant _QR_MAP => {
109 5         72 '' => sub { qr{$_[0]} },
110 0         0 x => sub { qr{$_[0]}x },
111 0         0 i => sub { qr{$_[0]}i },
112 0         0 s => sub { qr{$_[0]}s },
113 0         0 m => sub { qr{$_[0]}m },
114 0         0 ix => sub { qr{$_[0]}ix },
115 0         0 sx => sub { qr{$_[0]}sx },
116 0         0 mx => sub { qr{$_[0]}mx },
117 0         0 si => sub { qr{$_[0]}si },
118 1         13 mi => sub { qr{$_[0]}mi },
119 0         0 ms => sub { qr{$_[0]}sm },
120 0         0 six => sub { qr{$_[0]}six },
121 0         0 mix => sub { qr{$_[0]}mix },
122 0         0 msx => sub { qr{$_[0]}msx },
123 0         0 msi => sub { qr{$_[0]}msi },
124 2         54 msix => sub { qr{$_[0]}msix },
125 49     49   396 };
  49         68  
  49         17903  
126              
127             sub __qr_loader {
128 11 100   11   323516 if ($_[0] =~ /\A \(\? ([\^uixsm]*) (?:- (?:[ixsm]*))? : (.*) \) \z/x) {
129 8         29 my ($flags, $re) = ($1, $2);
130 8         23 $flags =~ s/^\^//;
131 8         15 $flags =~ tr/u//d;
132 8   33     23 my $sub = _QR_MAP->{$flags} || _QR_MAP->{''};
133 8         19 my $qr = &$sub($re);
134 8         62 return $qr;
135             }
136 3         66 return qr/$_[0]/;
137             }
138              
139             sub __code_loader {
140 2     2   1418 my ($string) = @_;
141 2     1   199 my $sub = eval "sub $string";
  1     1   9  
  1         3  
  1         91  
  1         8  
  1         2  
  1         48  
142 2 50       8 if ($@) {
143 0         0 warn "YAML::XS failed to load sub: $@";
144 0     0   0 return sub {};
145             }
146 2         33 return $sub;
147             }
148              
149             1;