6 require Config; import Config;
7 if ($Config{'extensions'} !~ /\bPeek\b/) {
8 print "1..0 # Skip: Devel::Peek was not built\n";
18 open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!";
22 if (open(OUT,">peek$$")) {
23 open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
25 open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
27 if (open(IN, "peek$$")) {
29 $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
30 $pattern =~ s/\$FLOAT/(?:\\d*\\.\\d+(?:e[-+]\\d+)?|\\d+)/g;
31 # handle DEBUG_LEAKING_SCALARS prefix
32 $pattern =~ s/^(\s*)(SV =.* at )/(?:$1ALLOCATED at .*?\n)?$1$2/mg;
33 print $pattern, "\n" if $DEBUG;
35 print $dump, "\n" if $DEBUG;
36 print "got:\n[\n$dump\n]\nexpected:\n[\n$pattern\n]\nnot "
37 unless $dump =~ /\A$pattern\Z/ms;
42 die "$0: failed to open peek$$: !\n";
45 die "$0: failed to create peek$$: $!\n";
56 'SV = PV\\($ADDR\\) at $ADDR
58 FLAGS = \\(POK,pPOK\\)
66 'SV = PV\\($ADDR\\) at $ADDR
68 FLAGS = \\(.*POK,READONLY,pPOK\\)
75 'SV = IV\\($ADDR\\) at $ADDR
77 FLAGS = \\(IOK,pIOK\\)
82 'SV = IV\\($ADDR\\) at $ADDR
84 FLAGS = \\(.*IOK,READONLY,pIOK\\)
89 'SV = IV\\($ADDR\\) at $ADDR
91 FLAGS = \\(PADMY,IOK,pIOK\\)
94 # If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
95 # where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
96 # maths is done in floating point always, and this scalar will be an NV.
97 # ([NI]) captures the type, referred to by \1 in this regexp and $type for
98 # building subsequent regexps.
99 my $type = do_test( 6,
101 'SV = ([NI])V\\($ADDR\\) at $ADDR
103 FLAGS = \\(PADTMP,\1OK,p\1OK\\)
110 'SV = PVNV\\($ADDR\\) at $ADDR
112 FLAGS = \\(NOK,pNOK\\)
114 NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
121 'SV = IV\\($ADDR\\) at $ADDR
123 FLAGS = \\(.*IOK,READONLY,pIOK\\)
128 'SV = NULL\\(0x0\\) at $ADDR
134 'SV = RV\\($ADDR\\) at $ADDR
138 SV = PV\\($ADDR\\) at $ADDR
140 FLAGS = \\(POK,pPOK\\)
148 SV = PVNV\\($ADDR\\) at $ADDR
150 FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
156 SV = IV\\($ADDR\\) at $ADDR
158 FLAGS = \\(IOK,pIOK\\)
163 'SV = RV\\($ADDR\\) at $ADDR
167 SV = PVAV\\($ADDR\\) at $ADDR
176 SV = IV\\($ADDR\\) at $ADDR
178 FLAGS = \\(IOK,pIOK\\)
180 Elt No. 1' . $c_pattern);
184 'SV = RV\\($ADDR\\) at $ADDR
188 SV = PVHV\\($ADDR\\) at $ADDR
190 FLAGS = \\(SHAREKEYS\\)
191 ARRAY = $ADDR \\(0:7, 1:1\\)
192 hash quality = 100.0%
198 Elt "123" HASH = $ADDR' . $c_pattern);
202 'SV = RV\\($ADDR\\) at $ADDR
206 SV = PVCV\\($ADDR\\) at $ADDR
208 FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
212 COMP_STASH = $ADDR\\t"main"
213 START = $ADDR ===> \\d+
217 GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
218 FILE = ".*\\b(?i:peek\\.t)"
225 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
226 OUTSIDE = $ADDR \\(MAIN\\)');
230 'SV = RV\\($ADDR\\) at $ADDR
234 SV = PVCV\\($ADDR\\) at $ADDR
239 COMP_STASH = $ADDR\\t"main"
240 START = $ADDR ===> \\d+
244 GVGV::GV = $ADDR\\t"main" :: "do_test"
245 FILE = ".*\\b(?i:peek\\.t)"
252 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
253 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
254 \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0
255 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
256 OUTSIDE = $ADDR \\(MAIN\\)');
260 'SV = RV\\($ADDR\\) at $ADDR
264 SV = PVMG\\($ADDR\\) at $ADDR
266 FLAGS = \\(OBJECT,SMG\\)
272 MG_TYPE = PERL_MAGIC_qr\(r\)
274 STASH = $ADDR\\t"Regexp"');
278 'SV = RV\\($ADDR\\) at $ADDR
282 SV = PVHV\\($ADDR\\) at $ADDR
284 FLAGS = \\(OBJECT,SHAREKEYS\\)
285 STASH = $ADDR\\t"Tac"
295 'SV = PVGV\\($ADDR\\) at $ADDR
297 FLAGS = \\(GMG,SMG,MULTI(?:,IN_PAD)?\\)
301 MG_VIRTUAL = &PL_vtbl_glob
302 MG_TYPE = PERL_MAGIC_glob\(\*\)
306 GvSTASH = $ADDR\\t"main"
317 FILE = ".*\\b(?i:peek\\.t)"
321 if (ord('A') == 193) {
323 chr(256).chr(0).chr(512),
324 'SV = PV\\($ADDR\\) at $ADDR
326 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
327 PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
332 chr(256).chr(0).chr(512),
333 'SV = PV\\($ADDR\\) at $ADDR
335 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
336 PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
341 if (ord('A') == 193) {
343 {chr(256)=>chr(512)},
344 'SV = RV\\($ADDR\\) at $ADDR
348 SV = PVHV\\($ADDR\\) at $ADDR
350 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
351 ARRAY = $ADDR \\(0:7, 1:1\\)
352 hash quality = 100.0%
358 Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
359 SV = PV\\($ADDR\\) at $ADDR
361 FLAGS = \\(POK,pPOK,UTF8\\)
362 PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
367 {chr(256)=>chr(512)},
368 'SV = RV\\($ADDR\\) at $ADDR
372 SV = PVHV\\($ADDR\\) at $ADDR
374 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
375 ARRAY = $ADDR \\(0:7, 1:1\\)
376 hash quality = 100.0%
382 Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
383 SV = PV\\($ADDR\\) at $ADDR
385 FLAGS = \\(POK,pPOK,UTF8\\)
386 PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
395 'SV = PVMG\\($ADDR\\) at $ADDR
397 FLAGS = \\(PADMY,SMG,POK,pPOK\\)
404 MG_VIRTUAL = &PL_vtbl_mglob
405 MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
410 # TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
411 # environment variables may be invisibly case-forced, hence the (?i:PATH)
412 # C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
413 # VMS is setting FAKE and READONLY flags. What VMS uses for storing
414 # ENV hashes is also not always null terminated.
417 $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value
418 'SV = PVMG\\($ADDR\\) at $ADDR
420 FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
427 MG_VIRTUAL = &PL_vtbl_envelem
428 MG_TYPE = PERL_MAGIC_envelem\\(e\\)
432 MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
433 SV = PV(?:IV)?\\($ADDR\\) at $ADDR
435 FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)pPOK\\)
437 )? PV = $ADDR "(?i:PATH)"(?:\\\0)?
441 MG_VIRTUAL = &PL_vtbl_taint
442 MG_TYPE = PERL_MAGIC_taint\\(t\\)');
445 1 while unlink("peek$$");
450 bless(\\undef, 'Foobar'),
451 'SV = RV\\($ADDR\\) at $ADDR
455 SV = PVMG\\($ADDR\\) at $ADDR
457 FLAGS = \\(OBJECT,ROK\\)
461 SV = NULL\\(0x0\\) at $ADDR
463 FLAGS = \\(READONLY\\)
467 STASH = $ADDR\s+"Foobar"');
469 # Constant subroutines
477 'SV = RV\\($ADDR\\) at $ADDR
481 SV = PVCV\\($ADDR\\) at $ADDR
483 FLAGS = \\(POK,pPOK,CONST\\)
490 XSUBANY = $ADDR \\(CONST SV\\)
491 SV = PV\\($ADDR\\) at $ADDR
493 FLAGS = \\(.*POK,READONLY,pPOK\\)
494 PV = $ADDR "Perl rules"\\\0
497 GVGV::GV = $ADDR\\t"main" :: "const"
498 FILE = ".*\\b(?i:peek\\.t)"
505 OUTSIDE = 0x0 \\(null\\)');