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: $!";
23 if (open(OUT,">peek$$")) {
24 open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
26 open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
28 if (open(IN, "peek$$")) {
30 $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
31 $pattern =~ s/\$FLOAT/(?:\\d*\\.\\d+(?:e[-+]\\d+)?|\\d+)/g;
32 # handle DEBUG_LEAKING_SCALARS prefix
33 $pattern =~ s/^(\s*)(SV =.* at )/(?:$1ALLOCATED at .*?\n)?$1$2/mg;
35 $pattern =~ s/^ *\$XSUB *\n/
36 ($] < 5.009) ? " XSUB = 0\n XSUBANY = 0\n" : '';
38 $pattern =~ s/^ *\$ROOT *\n/
39 ($] < 5.009) ? " ROOT = 0x0\n" : '';
44 print $pattern, "\n" if $DEBUG;
46 print $dump, "\n" if $DEBUG;
47 print "got:\n[\n$dump\n]\nexpected:\n[\n$pattern\n]\nnot "
48 unless $dump =~ /\A$pattern\Z/ms;
53 die "$0: failed to open peek$$: !\n";
56 die "$0: failed to create peek$$: $!\n";
68 'SV = PV\\($ADDR\\) at $ADDR
70 FLAGS = \\(POK,pPOK\\)
78 'SV = PV\\($ADDR\\) at $ADDR
80 FLAGS = \\(.*POK,READONLY,pPOK\\)
87 'SV = IV\\($ADDR\\) at $ADDR
89 FLAGS = \\(IOK,pIOK\\)
94 'SV = IV\\($ADDR\\) at $ADDR
96 FLAGS = \\(.*IOK,READONLY,pIOK\\)
101 'SV = IV\\($ADDR\\) at $ADDR
103 FLAGS = \\(PADMY,IOK,pIOK\\)
106 # If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
107 # where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
108 # maths is done in floating point always, and this scalar will be an NV.
109 # ([NI]) captures the type, referred to by \1 in this regexp and $type for
110 # building subsequent regexps.
111 my $type = do_test( 6,
113 'SV = ([NI])V\\($ADDR\\) at $ADDR
115 FLAGS = \\(PADTMP,\1OK,p\1OK\\)
122 'SV = PVNV\\($ADDR\\) at $ADDR
124 FLAGS = \\(NOK,pNOK\\)
126 NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
133 'SV = IV\\($ADDR\\) at $ADDR
135 FLAGS = \\(.*IOK,READONLY,pIOK\\)
140 'SV = NULL\\(0x0\\) at $ADDR
146 'SV = RV\\($ADDR\\) at $ADDR
150 SV = PV\\($ADDR\\) at $ADDR
152 FLAGS = \\(POK,pPOK\\)
160 SV = PVNV\\($ADDR\\) at $ADDR
162 FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
168 SV = IV\\($ADDR\\) at $ADDR
170 FLAGS = \\(IOK,pIOK\\)
175 'SV = RV\\($ADDR\\) at $ADDR
179 SV = PVAV\\($ADDR\\) at $ADDR
188 SV = IV\\($ADDR\\) at $ADDR
190 FLAGS = \\(IOK,pIOK\\)
192 Elt No. 1' . $c_pattern);
196 'SV = RV\\($ADDR\\) at $ADDR
200 SV = PVHV\\($ADDR\\) at $ADDR
202 FLAGS = \\(SHAREKEYS\\)
203 ARRAY = $ADDR \\(0:7, 1:1\\)
204 hash quality = 100.0%
210 Elt "123" HASH = $ADDR' . $c_pattern);
214 'SV = RV\\($ADDR\\) at $ADDR
218 SV = PVCV\\($ADDR\\) at $ADDR
220 FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
224 COMP_STASH = $ADDR\\t"main"
225 START = $ADDR ===> \\d+
228 GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
229 FILE = ".*\\b(?i:peek\\.t)"
236 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
237 OUTSIDE = $ADDR \\(MAIN\\)');
241 'SV = RV\\($ADDR\\) at $ADDR
245 SV = PVCV\\($ADDR\\) at $ADDR
250 COMP_STASH = $ADDR\\t"main"
251 START = $ADDR ===> \\d+
254 GVGV::GV = $ADDR\\t"main" :: "do_test"
255 FILE = ".*\\b(?i:peek\\.t)"
262 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
263 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
264 \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0
265 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
266 OUTSIDE = $ADDR \\(MAIN\\)');
270 'SV = RV\\($ADDR\\) at $ADDR
274 SV = PVMG\\($ADDR\\) at $ADDR
276 FLAGS = \\(OBJECT,SMG\\)
282 MG_TYPE = PERL_MAGIC_qr\(r\)
284 STASH = $ADDR\\t"Regexp"');
288 'SV = RV\\($ADDR\\) at $ADDR
292 SV = PVHV\\($ADDR\\) at $ADDR
294 FLAGS = \\(OBJECT,SHAREKEYS\\)
295 STASH = $ADDR\\t"Tac"
305 'SV = PVGV\\($ADDR\\) at $ADDR
307 FLAGS = \\(GMG,SMG,MULTI(?:,IN_PAD)?\\)
311 MG_VIRTUAL = &PL_vtbl_glob
312 MG_TYPE = PERL_MAGIC_glob\(\*\)
316 GvSTASH = $ADDR\\t"main"
327 FILE = ".*\\b(?i:peek\\.t)"
331 if (ord('A') == 193) {
333 chr(256).chr(0).chr(512),
334 'SV = PV\\($ADDR\\) at $ADDR
336 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
337 PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
342 chr(256).chr(0).chr(512),
343 'SV = PV\\($ADDR\\) at $ADDR
345 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
346 PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
351 if (ord('A') == 193) {
353 {chr(256)=>chr(512)},
354 'SV = RV\\($ADDR\\) at $ADDR
358 SV = PVHV\\($ADDR\\) at $ADDR
360 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
361 ARRAY = $ADDR \\(0:7, 1:1\\)
362 hash quality = 100.0%
368 Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
369 SV = PV\\($ADDR\\) at $ADDR
371 FLAGS = \\(POK,pPOK,UTF8\\)
372 PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
377 {chr(256)=>chr(512)},
378 'SV = RV\\($ADDR\\) at $ADDR
382 SV = PVHV\\($ADDR\\) at $ADDR
384 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
385 ARRAY = $ADDR \\(0:7, 1:1\\)
386 hash quality = 100.0%
392 Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
393 SV = PV\\($ADDR\\) at $ADDR
395 FLAGS = \\(POK,pPOK,UTF8\\)
396 PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
405 'SV = PVMG\\($ADDR\\) at $ADDR
407 FLAGS = \\(PADMY,SMG,POK,pPOK\\)
414 MG_VIRTUAL = &PL_vtbl_mglob
415 MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
420 # TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
421 # environment variables may be invisibly case-forced, hence the (?i:PATH)
422 # C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
423 # VMS is setting FAKE and READONLY flags. What VMS uses for storing
424 # ENV hashes is also not always null terminated.
427 $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value
428 'SV = PVMG\\($ADDR\\) at $ADDR
430 FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
437 MG_VIRTUAL = &PL_vtbl_envelem
438 MG_TYPE = PERL_MAGIC_envelem\\(e\\)
442 MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
443 SV = PV(?:IV)?\\($ADDR\\) at $ADDR
445 FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)?pPOK\\)
447 )? PV = $ADDR "(?i:PATH)"(?:\\\0)?
451 MG_VIRTUAL = &PL_vtbl_taint
452 MG_TYPE = PERL_MAGIC_taint\\(t\\)');
455 1 while unlink("peek$$");
460 bless(\\undef, 'Foobar'),
461 'SV = RV\\($ADDR\\) at $ADDR
465 SV = PVMG\\($ADDR\\) at $ADDR
467 FLAGS = \\(OBJECT,ROK\\)
471 SV = NULL\\(0x0\\) at $ADDR
473 FLAGS = \\(READONLY\\)
477 STASH = $ADDR\s+"Foobar"');
479 # Constant subroutines
487 'SV = RV\\($ADDR\\) at $ADDR
491 SV = PVCV\\($ADDR\\) at $ADDR
493 FLAGS = \\(POK,pPOK,CONST\\)
500 XSUBANY = $ADDR \\(CONST SV\\)
501 SV = PV\\($ADDR\\) at $ADDR
503 FLAGS = \\(.*POK,READONLY,pPOK\\)
504 PV = $ADDR "Perl rules"\\\0
507 GVGV::GV = $ADDR\\t"main" :: "const"
508 FILE = ".*\\b(?i:peek\\.t)"
515 OUTSIDE = 0x0 \\(null\\)');