6 require Config; import Config;
7 if ($Config{'extensions'} !~ /\bDevel\/Peek\b/) {
8 print "1..0 # Skip: Devel::Peek was not built\n";
13 BEGIN { require "./test.pl"; }
20 open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!";
24 if (open(OUT,">peek$$")) {
25 open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
27 print STDERR "*****\n";
28 Dump($_[1]); # second dump to compare with the first to make sure nothing changed.
29 open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
31 if (open(IN, "peek$$")) {
33 $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
34 $pattern =~ s/\$FLOAT/(?:\\d*\\.\\d+(?:e[-+]\\d+)?|\\d+)/g;
35 # handle DEBUG_LEAKING_SCALARS prefix
36 $pattern =~ s/^(\s*)(SV =.* at )/(?:$1ALLOCATED at .*?\n)?$1$2/mg;
38 $pattern =~ s/^ *\$XSUB *\n/
39 ($] < 5.009) ? " XSUB = 0\n XSUBANY = 0\n" : '';
41 $pattern =~ s/^ *\$ROOT *\n/
42 ($] < 5.009) ? " ROOT = 0x0\n" : '';
44 $pattern =~ s/^ *\$IVNV *\n/
45 ($] < 5.009) ? " IV = 0\n NV = 0\n" : '';
48 ($] < 5.011) ? 'RV' : 'IV';
50 $pattern =~ s/^ *\$NV *\n/
51 ($] < 5.011) ? " NV = 0\n" : '';
54 print $pattern, "\n" if $DEBUG;
55 my ($dump, $dump2) = split m/\*\*\*\*\*\n/, scalar <IN>;
56 print $dump, "\n" if $DEBUG;
57 like( $dump, qr/\A$pattern\Z/ms );
59 local $TODO = $dump2 =~ /OOK/ ? "The hash iterator used in dump.c sets the OOK flag" : undef;
66 die "$0: failed to open peek$$: !\n";
69 die "$0: failed to create peek$$: $!\n";
79 1 while unlink("peek$$");
84 'SV = PV\\($ADDR\\) at $ADDR
86 FLAGS = \\(POK,pPOK\\)
94 'SV = PV\\($ADDR\\) at $ADDR
96 FLAGS = \\(.*POK,READONLY,pPOK\\)
103 'SV = IV\\($ADDR\\) at $ADDR
105 FLAGS = \\(IOK,pIOK\\)
110 'SV = IV\\($ADDR\\) at $ADDR
112 FLAGS = \\(.*IOK,READONLY,pIOK\\)
117 'SV = IV\\($ADDR\\) at $ADDR
119 FLAGS = \\(PADMY,IOK,pIOK\\)
122 # If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
123 # where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
124 # maths is done in floating point always, and this scalar will be an NV.
125 # ([NI]) captures the type, referred to by \1 in this regexp and $type for
126 # building subsequent regexps.
127 my $type = do_test( 6,
129 'SV = ([NI])V\\($ADDR\\) at $ADDR
131 FLAGS = \\(PADTMP,\1OK,p\1OK\\)
138 'SV = PVNV\\($ADDR\\) at $ADDR
140 FLAGS = \\(NOK,pNOK\\)
142 NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
149 'SV = IV\\($ADDR\\) at $ADDR
151 FLAGS = \\(.*IOK,READONLY,pIOK\\)
156 'SV = NULL\\(0x0\\) at $ADDR
162 'SV = $RV\\($ADDR\\) at $ADDR
166 SV = PV\\($ADDR\\) at $ADDR
168 FLAGS = \\(POK,pPOK\\)
176 SV = PVNV\\($ADDR\\) at $ADDR
178 FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
184 SV = IV\\($ADDR\\) at $ADDR
186 FLAGS = \\(IOK,pIOK\\)
191 'SV = $RV\\($ADDR\\) at $ADDR
195 SV = PVAV\\($ADDR\\) at $ADDR
204 SV = IV\\($ADDR\\) at $ADDR
206 FLAGS = \\(IOK,pIOK\\)
208 Elt No. 1' . $c_pattern);
212 'SV = $RV\\($ADDR\\) at $ADDR
216 SV = PVHV\\($ADDR\\) at $ADDR
218 FLAGS = \\(SHAREKEYS\\)
219 ARRAY = $ADDR \\(0:7, 1:1\\)
220 hash quality = 100.0%
226 Elt "123" HASH = $ADDR' . $c_pattern);
230 'SV = $RV\\($ADDR\\) at $ADDR
234 SV = PVCV\\($ADDR\\) at $ADDR
236 FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
239 COMP_STASH = $ADDR\\t"main"
240 START = $ADDR ===> \\d+
243 GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
244 FILE = ".*\\b(?i:peek\\.t)"
251 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
252 OUTSIDE = $ADDR \\(MAIN\\)');
256 'SV = $RV\\($ADDR\\) at $ADDR
260 SV = PVCV\\($ADDR\\) at $ADDR
264 COMP_STASH = $ADDR\\t"main"
265 START = $ADDR ===> \\d+
268 GVGV::GV = $ADDR\\t"main" :: "do_test"
269 FILE = ".*\\b(?i:peek\\.t)"
276 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
277 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
278 \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0
279 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
280 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2"
281 OUTSIDE = $ADDR \\(MAIN\\)');
286 'SV = $RV\\($ADDR\\) at $ADDR
290 SV = REGEXP\\($ADDR\\) at $ADDR
292 FLAGS = \\(OBJECT,POK,pPOK\\)
294 PV = $ADDR "\\(\\?-xism:tic\\)"\\\0
297 STASH = $ADDR\\t"Regexp"');
301 'SV = $RV\\($ADDR\\) at $ADDR
305 SV = PVMG\\($ADDR\\) at $ADDR
307 FLAGS = \\(OBJECT,SMG\\)
313 MG_TYPE = PERL_MAGIC_qr\(r\)
315 PAT = "\(\?-xism:tic\)"
317 STASH = $ADDR\\t"Regexp"');
322 'SV = $RV\\($ADDR\\) at $ADDR
326 SV = PVHV\\($ADDR\\) at $ADDR
328 FLAGS = \\(OBJECT,SHAREKEYS\\)
329 STASH = $ADDR\\t"Tac"
339 'SV = PVGV\\($ADDR\\) at $ADDR
341 FLAGS = \\(MULTI(?:,IN_PAD)?\\)
344 GvSTASH = $ADDR\\t"main"
355 FILE = ".*\\b(?i:peek\\.t)"
359 if (ord('A') == 193) {
361 chr(256).chr(0).chr(512),
362 'SV = PV\\($ADDR\\) at $ADDR
364 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
365 PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
370 chr(256).chr(0).chr(512),
371 'SV = PV\\($ADDR\\) at $ADDR
373 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
374 PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
379 if (ord('A') == 193) {
381 {chr(256)=>chr(512)},
382 'SV = $RV\\($ADDR\\) at $ADDR
386 SV = PVHV\\($ADDR\\) at $ADDR
388 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
389 ARRAY = $ADDR \\(0:7, 1:1\\)
390 hash quality = 100.0%
396 Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
397 SV = PV\\($ADDR\\) at $ADDR
399 FLAGS = \\(POK,pPOK,UTF8\\)
400 PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
405 {chr(256)=>chr(512)},
406 'SV = $RV\\($ADDR\\) at $ADDR
410 SV = PVHV\\($ADDR\\) at $ADDR
412 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
413 ARRAY = $ADDR \\(0:7, 1:1\\)
414 hash quality = 100.0%
420 Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
421 SV = PV\\($ADDR\\) at $ADDR
423 FLAGS = \\(POK,pPOK,UTF8\\)
424 PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
433 'SV = PVMG\\($ADDR\\) at $ADDR
435 FLAGS = \\(PADMY,SMG,POK,pPOK\\)
442 MG_VIRTUAL = &PL_vtbl_mglob
443 MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
448 # TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
449 # environment variables may be invisibly case-forced, hence the (?i:PATH)
450 # C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
451 # VMS is setting FAKE and READONLY flags. What VMS uses for storing
452 # ENV hashes is also not always null terminated.
455 $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value
456 'SV = PVMG\\($ADDR\\) at $ADDR
458 FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
465 MG_VIRTUAL = &PL_vtbl_envelem
466 MG_TYPE = PERL_MAGIC_envelem\\(e\\)
470 MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
471 SV = PV(?:IV)?\\($ADDR\\) at $ADDR
473 FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)?pPOK\\)
475 )? PV = $ADDR "(?i:PATH)"(?:\\\0)?
479 MG_VIRTUAL = &PL_vtbl_taint
480 MG_TYPE = PERL_MAGIC_taint\\(t\\)');
484 bless(\\undef, 'Foobar'),
485 'SV = $RV\\($ADDR\\) at $ADDR
489 SV = PVMG\\($ADDR\\) at $ADDR
491 FLAGS = \\(OBJECT,ROK\\)
495 SV = NULL\\(0x0\\) at $ADDR
497 FLAGS = \\(READONLY\\)
501 STASH = $ADDR\s+"Foobar"');
503 # Constant subroutines
511 'SV = $RV\\($ADDR\\) at $ADDR
515 SV = PVCV\\($ADDR\\) at $ADDR
517 FLAGS = \\(POK,pPOK,CONST\\)
523 XSUBANY = $ADDR \\(CONST SV\\)
524 SV = PV\\($ADDR\\) at $ADDR
526 FLAGS = \\(.*POK,READONLY,pPOK\\)
527 PV = $ADDR "Perl rules"\\\0
530 GVGV::GV = $ADDR\\t"main" :: "const"
531 FILE = ".*\\b(?i:peek\\.t)"
538 OUTSIDE = 0x0 \\(null\\)');
540 # isUV should show on PVMG
542 do { my $v = $1; $v = ~0; $v },
543 'SV = PVMG\\($ADDR\\) at $ADDR
545 FLAGS = \\(IOK,pIOK,IsUV\\)
552 'SV = $RV\\($ADDR\\) at $ADDR
556 SV = PVIO\\($ADDR\\) at $ADDR
561 STASH = $ADDR\s+"IO::Handle"