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" : '';
47 $pattern =~ s/\$RV/IV/g if $] >= 5.011;
49 print $pattern, "\n" if $DEBUG;
50 my ($dump, $dump2) = split m/\*\*\*\*\*\n/, scalar <IN>;
51 print $dump, "\n" if $DEBUG;
52 like( $dump, qr/\A$pattern\Z/ms );
54 local $TODO = $dump2 =~ /OOK/ ? "The hash iterator used in dump.c sets the OOK flag" : undef;
61 die "$0: failed to open peek$$: !\n";
64 die "$0: failed to create peek$$: $!\n";
74 1 while unlink("peek$$");
79 'SV = PV\\($ADDR\\) at $ADDR
81 FLAGS = \\(POK,pPOK\\)
89 'SV = PV\\($ADDR\\) at $ADDR
91 FLAGS = \\(.*POK,READONLY,pPOK\\)
98 'SV = IV\\($ADDR\\) at $ADDR
100 FLAGS = \\(IOK,pIOK\\)
105 'SV = IV\\($ADDR\\) at $ADDR
107 FLAGS = \\(.*IOK,READONLY,pIOK\\)
112 'SV = IV\\($ADDR\\) at $ADDR
114 FLAGS = \\(PADMY,IOK,pIOK\\)
117 # If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
118 # where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
119 # maths is done in floating point always, and this scalar will be an NV.
120 # ([NI]) captures the type, referred to by \1 in this regexp and $type for
121 # building subsequent regexps.
122 my $type = do_test( 6,
124 'SV = ([NI])V\\($ADDR\\) at $ADDR
126 FLAGS = \\(PADTMP,\1OK,p\1OK\\)
133 'SV = PVNV\\($ADDR\\) at $ADDR
135 FLAGS = \\(NOK,pNOK\\)
137 NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
144 'SV = IV\\($ADDR\\) at $ADDR
146 FLAGS = \\(.*IOK,READONLY,pIOK\\)
151 'SV = NULL\\(0x0\\) at $ADDR
157 'SV = $RV\\($ADDR\\) at $ADDR
161 SV = PV\\($ADDR\\) at $ADDR
163 FLAGS = \\(POK,pPOK\\)
171 SV = PVNV\\($ADDR\\) at $ADDR
173 FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
179 SV = IV\\($ADDR\\) at $ADDR
181 FLAGS = \\(IOK,pIOK\\)
186 'SV = $RV\\($ADDR\\) at $ADDR
190 SV = PVAV\\($ADDR\\) at $ADDR
199 SV = IV\\($ADDR\\) at $ADDR
201 FLAGS = \\(IOK,pIOK\\)
203 Elt No. 1' . $c_pattern);
207 'SV = $RV\\($ADDR\\) at $ADDR
211 SV = PVHV\\($ADDR\\) at $ADDR
213 FLAGS = \\(SHAREKEYS\\)
214 ARRAY = $ADDR \\(0:7, 1:1\\)
215 hash quality = 100.0%
221 Elt "123" HASH = $ADDR' . $c_pattern);
225 'SV = $RV\\($ADDR\\) at $ADDR
229 SV = PVCV\\($ADDR\\) at $ADDR
231 FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
234 COMP_STASH = $ADDR\\t"main"
235 START = $ADDR ===> \\d+
238 GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
239 FILE = ".*\\b(?i:peek\\.t)"
246 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
247 OUTSIDE = $ADDR \\(MAIN\\)');
251 'SV = $RV\\($ADDR\\) at $ADDR
255 SV = PVCV\\($ADDR\\) at $ADDR
259 COMP_STASH = $ADDR\\t"main"
260 START = $ADDR ===> \\d+
263 GVGV::GV = $ADDR\\t"main" :: "do_test"
264 FILE = ".*\\b(?i:peek\\.t)"
271 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
272 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
273 \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0
274 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
275 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2"
276 OUTSIDE = $ADDR \\(MAIN\\)');
281 'SV = $RV\\($ADDR\\) at $ADDR
285 SV = REGEXP\\($ADDR\\) at $ADDR
294 'SV = $RV\\($ADDR\\) at $ADDR
298 SV = PVMG\\($ADDR\\) at $ADDR
300 FLAGS = \\(OBJECT,SMG\\)
306 MG_TYPE = PERL_MAGIC_qr\(r\)
308 PAT = "\(\?-xism:tic\)"
310 STASH = $ADDR\\t"Regexp"');
315 'SV = $RV\\($ADDR\\) at $ADDR
319 SV = PVHV\\($ADDR\\) at $ADDR
321 FLAGS = \\(OBJECT,SHAREKEYS\\)
322 STASH = $ADDR\\t"Tac"
332 'SV = PVGV\\($ADDR\\) at $ADDR
334 FLAGS = \\(MULTI(?:,IN_PAD)?\\)
337 GvSTASH = $ADDR\\t"main"
348 FILE = ".*\\b(?i:peek\\.t)"
352 if (ord('A') == 193) {
354 chr(256).chr(0).chr(512),
355 'SV = PV\\($ADDR\\) at $ADDR
357 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
358 PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
363 chr(256).chr(0).chr(512),
364 'SV = PV\\($ADDR\\) at $ADDR
366 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
367 PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
372 if (ord('A') == 193) {
374 {chr(256)=>chr(512)},
375 'SV = $RV\\($ADDR\\) at $ADDR
379 SV = PVHV\\($ADDR\\) at $ADDR
381 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
382 ARRAY = $ADDR \\(0:7, 1:1\\)
383 hash quality = 100.0%
389 Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
390 SV = PV\\($ADDR\\) at $ADDR
392 FLAGS = \\(POK,pPOK,UTF8\\)
393 PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
398 {chr(256)=>chr(512)},
399 'SV = $RV\\($ADDR\\) at $ADDR
403 SV = PVHV\\($ADDR\\) at $ADDR
405 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
406 ARRAY = $ADDR \\(0:7, 1:1\\)
407 hash quality = 100.0%
413 Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
414 SV = PV\\($ADDR\\) at $ADDR
416 FLAGS = \\(POK,pPOK,UTF8\\)
417 PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
426 'SV = PVMG\\($ADDR\\) at $ADDR
428 FLAGS = \\(PADMY,SMG,POK,pPOK\\)
435 MG_VIRTUAL = &PL_vtbl_mglob
436 MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
441 # TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
442 # environment variables may be invisibly case-forced, hence the (?i:PATH)
443 # C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
444 # VMS is setting FAKE and READONLY flags. What VMS uses for storing
445 # ENV hashes is also not always null terminated.
448 $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value
449 'SV = PVMG\\($ADDR\\) at $ADDR
451 FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
458 MG_VIRTUAL = &PL_vtbl_envelem
459 MG_TYPE = PERL_MAGIC_envelem\\(e\\)
463 MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
464 SV = PV(?:IV)?\\($ADDR\\) at $ADDR
466 FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)?pPOK\\)
468 )? PV = $ADDR "(?i:PATH)"(?:\\\0)?
472 MG_VIRTUAL = &PL_vtbl_taint
473 MG_TYPE = PERL_MAGIC_taint\\(t\\)');
477 bless(\\undef, 'Foobar'),
478 'SV = $RV\\($ADDR\\) at $ADDR
482 SV = PVMG\\($ADDR\\) at $ADDR
484 FLAGS = \\(OBJECT,ROK\\)
488 SV = NULL\\(0x0\\) at $ADDR
490 FLAGS = \\(READONLY\\)
494 STASH = $ADDR\s+"Foobar"');
496 # Constant subroutines
504 'SV = $RV\\($ADDR\\) at $ADDR
508 SV = PVCV\\($ADDR\\) at $ADDR
510 FLAGS = \\(POK,pPOK,CONST\\)
516 XSUBANY = $ADDR \\(CONST SV\\)
517 SV = PV\\($ADDR\\) at $ADDR
519 FLAGS = \\(.*POK,READONLY,pPOK\\)
520 PV = $ADDR "Perl rules"\\\0
523 GVGV::GV = $ADDR\\t"main" :: "const"
524 FILE = ".*\\b(?i:peek\\.t)"
531 OUTSIDE = 0x0 \\(null\\)');
533 # isUV should show on PVMG
535 do { my $v = $1; $v = ~0; $v },
536 'SV = PVMG\\($ADDR\\) at $ADDR
538 FLAGS = \\(IOK,pIOK,IsUV\\)