This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Better diagnostics by removing an && from an ok() and converting it to
[perl5.git] / ext / Devel / Peek / t / Peek.t
CommitLineData
99331854 1#!./perl -T
9ec58fb7
JH
2
3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
9ec58fb7 6 require Config; import Config;
e7ecf62c 7 if ($Config{'extensions'} !~ /\bDevel\/Peek\b/) {
9ec58fb7
JH
8 print "1..0 # Skip: Devel::Peek was not built\n";
9 exit 0;
10 }
11}
12
768fd157 13BEGIN { require "./test.pl"; }
e7ecf62c 14
9248c45a
JH
15use Devel::Peek;
16
e9569a7a 17plan(48);
9248c45a
JH
18
19our $DEBUG = 0;
277ddfaf 20open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!";
9248c45a
JH
21
22sub do_test {
23 my $pattern = pop;
277ddfaf
GS
24 if (open(OUT,">peek$$")) {
25 open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
9248c45a 26 Dump($_[1]);
e9569a7a
GG
27 print STDERR "*****\n";
28 Dump($_[1]); # second dump to compare with the first to make sure nothing changed.
277ddfaf
GS
29 open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
30 close(OUT);
9248c45a
JH
31 if (open(IN, "peek$$")) {
32 local $/;
33 $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
8aacddc1 34 $pattern =~ s/\$FLOAT/(?:\\d*\\.\\d+(?:e[-+]\\d+)?|\\d+)/g;
fd0854ff 35 # handle DEBUG_LEAKING_SCALARS prefix
d94a5950 36 $pattern =~ s/^(\s*)(SV =.* at )/(?:$1ALLOCATED at .*?\n)?$1$2/mg;
bf53b3a5 37
d04ba589
NC
38 $pattern =~ s/^ *\$XSUB *\n/
39 ($] < 5.009) ? " XSUB = 0\n XSUBANY = 0\n" : '';
bf53b3a5 40 /mge;
d04ba589
NC
41 $pattern =~ s/^ *\$ROOT *\n/
42 ($] < 5.009) ? " ROOT = 0x0\n" : '';
43 /mge;
c84c4652
NC
44 $pattern =~ s/^ *\$IVNV *\n/
45 ($] < 5.009) ? " IV = 0\n NV = 0\n" : '';
46 /mge;
d04ba589 47
9248c45a 48 print $pattern, "\n" if $DEBUG;
e9569a7a 49 my ($dump, $dump2) = split m/\*\*\*\*\*\n/, scalar <IN>;
9248c45a 50 print $dump, "\n" if $DEBUG;
e7ecf62c 51 like( $dump, qr/\A$pattern\Z/ms );
e9569a7a
GG
52
53 local $TODO = $dump2 =~ /OOK/ ? "The hash iterator used in dump.c sets the OOK flag" : undef;
54 is($dump2, $dump);
55
9248c45a 56 close(IN);
e9569a7a 57
59d8ce62 58 return $1;
9248c45a
JH
59 } else {
60 die "$0: failed to open peek$$: !\n";
61 }
62 } else {
63 die "$0: failed to create peek$$: $!\n";
64 }
65}
66
67our $a;
68our $b;
69my $c;
208edb77 70local $d = 0;
9248c45a 71
e7ecf62c
RGS
72END {
73 1 while unlink("peek$$");
74}
bf53b3a5 75
9248c45a
JH
76do_test( 1,
77 $a = "foo",
78'SV = PV\\($ADDR\\) at $ADDR
79 REFCNT = 1
80 FLAGS = \\(POK,pPOK\\)
81 PV = $ADDR "foo"\\\0
82 CUR = 3
1badabf5 83 LEN = \\d+'
9248c45a
JH
84 );
85
86do_test( 2,
87 "bar",
88'SV = PV\\($ADDR\\) at $ADDR
89 REFCNT = 1
7766e686 90 FLAGS = \\(.*POK,READONLY,pPOK\\)
9248c45a
JH
91 PV = $ADDR "bar"\\\0
92 CUR = 3
1badabf5 93 LEN = \\d+');
9248c45a
JH
94
95do_test( 3,
96 $b = 123,
97'SV = IV\\($ADDR\\) at $ADDR
98 REFCNT = 1
99 FLAGS = \\(IOK,pIOK\\)
100 IV = 123');
101
102do_test( 4,
103 456,
104'SV = IV\\($ADDR\\) at $ADDR
105 REFCNT = 1
7766e686 106 FLAGS = \\(.*IOK,READONLY,pIOK\\)
9248c45a
JH
107 IV = 456');
108
109do_test( 5,
110 $c = 456,
111'SV = IV\\($ADDR\\) at $ADDR
112 REFCNT = 1
235cc2e3 113 FLAGS = \\(PADMY,IOK,pIOK\\)
9248c45a
JH
114 IV = 456');
115
59d8ce62
NC
116# If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
117# where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
118# maths is done in floating point always, and this scalar will be an NV.
119# ([NI]) captures the type, referred to by \1 in this regexp and $type for
120# building subsequent regexps.
121my $type = do_test( 6,
9248c45a 122 $c + $d,
59d8ce62 123'SV = ([NI])V\\($ADDR\\) at $ADDR
9248c45a 124 REFCNT = 1
59d8ce62
NC
125 FLAGS = \\(PADTMP,\1OK,p\1OK\\)
126 \1V = 456');
9248c45a
JH
127
128($d = "789") += 0.1;
129
130do_test( 7,
131 $d,
132'SV = PVNV\\($ADDR\\) at $ADDR
133 REFCNT = 1
134 FLAGS = \\(NOK,pNOK\\)
78d00c47 135 IV = \d+
ac634a9a 136 NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
9248c45a
JH
137 PV = $ADDR "789"\\\0
138 CUR = 3
1badabf5 139 LEN = \\d+');
9248c45a
JH
140
141do_test( 8,
142 0xabcd,
143'SV = IV\\($ADDR\\) at $ADDR
144 REFCNT = 1
28e5dec8
JH
145 FLAGS = \\(.*IOK,READONLY,pIOK\\)
146 IV = 43981');
9248c45a
JH
147
148do_test( 9,
149 undef,
150'SV = NULL\\(0x0\\) at $ADDR
151 REFCNT = 1
152 FLAGS = \\(\\)');
153
154do_test(10,
155 \$a,
156'SV = RV\\($ADDR\\) at $ADDR
157 REFCNT = 1
158 FLAGS = \\(ROK\\)
159 RV = $ADDR
160 SV = PV\\($ADDR\\) at $ADDR
161 REFCNT = 2
162 FLAGS = \\(POK,pPOK\\)
163 PV = $ADDR "foo"\\\0
164 CUR = 3
1badabf5 165 LEN = \\d+');
9248c45a 166
59d8ce62
NC
167my $c_pattern;
168if ($type eq 'N') {
169 $c_pattern = '
170 SV = PVNV\\($ADDR\\) at $ADDR
171 REFCNT = 1
172 FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
173 IV = 456
174 NV = 456
175 PV = 0';
176} else {
177 $c_pattern = '
178 SV = IV\\($ADDR\\) at $ADDR
179 REFCNT = 1
180 FLAGS = \\(IOK,pIOK\\)
181 IV = 456';
182}
9248c45a
JH
183do_test(11,
184 [$b,$c],
185'SV = RV\\($ADDR\\) at $ADDR
186 REFCNT = 1
187 FLAGS = \\(ROK\\)
188 RV = $ADDR
189 SV = PVAV\\($ADDR\\) at $ADDR
78c72037 190 REFCNT = 1
9248c45a 191 FLAGS = \\(\\)
9248c45a
JH
192 ARRAY = $ADDR
193 FILL = 1
194 MAX = 1
195 ARYLEN = 0x0
196 FLAGS = \\(REAL\\)
197 Elt No. 0
198 SV = IV\\($ADDR\\) at $ADDR
199 REFCNT = 1
200 FLAGS = \\(IOK,pIOK\\)
201 IV = 123
59d8ce62 202 Elt No. 1' . $c_pattern);
9248c45a
JH
203
204do_test(12,
205 {$b=>$c},
206'SV = RV\\($ADDR\\) at $ADDR
207 REFCNT = 1
208 FLAGS = \\(ROK\\)
209 RV = $ADDR
210 SV = PVHV\\($ADDR\\) at $ADDR
78c72037 211 REFCNT = 1
9248c45a 212 FLAGS = \\(SHAREKEYS\\)
9248c45a 213 ARRAY = $ADDR \\(0:7, 1:1\\)
b8fa94d8 214 hash quality = 100.0%
9248c45a
JH
215 KEYS = 1
216 FILL = 1
217 MAX = 7
218 RITER = -1
219 EITER = 0x0
59d8ce62 220 Elt "123" HASH = $ADDR' . $c_pattern);
9248c45a
JH
221
222do_test(13,
223 sub(){@_},
224'SV = RV\\($ADDR\\) at $ADDR
225 REFCNT = 1
226 FLAGS = \\(ROK\\)
227 RV = $ADDR
228 SV = PVCV\\($ADDR\\) at $ADDR
229 REFCNT = 2
235cc2e3 230 FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
c84c4652 231 $IVNV
9248c45a
JH
232 PROTOTYPE = ""
233 COMP_STASH = $ADDR\\t"main"
234 START = $ADDR ===> \\d+
235 ROOT = $ADDR
d04ba589 236 $XSUB
208edb77 237 GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
084d946d 238 FILE = ".*\\b(?i:peek\\.t)"
9248c45a 239 DEPTH = 0
9856a127 240(?: MUTEXP = $ADDR
208edb77 241 OWNER = $ADDR
5b4563c8 242)? FLAGS = 0x90
a3985cdc 243 OUTSIDE_SEQ = \\d+
9248c45a 244 PADLIST = $ADDR
dd2155a4 245 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
9248c45a
JH
246 OUTSIDE = $ADDR \\(MAIN\\)');
247
248do_test(14,
249 \&do_test,
250'SV = RV\\($ADDR\\) at $ADDR
251 REFCNT = 1
252 FLAGS = \\(ROK\\)
253 RV = $ADDR
254 SV = PVCV\\($ADDR\\) at $ADDR
9856a127 255 REFCNT = (3|4)
9248c45a 256 FLAGS = \\(\\)
c84c4652 257 $IVNV
9248c45a
JH
258 COMP_STASH = $ADDR\\t"main"
259 START = $ADDR ===> \\d+
260 ROOT = $ADDR
d04ba589 261 $XSUB
9248c45a 262 GVGV::GV = $ADDR\\t"main" :: "do_test"
084d946d 263 FILE = ".*\\b(?i:peek\\.t)"
9248c45a 264 DEPTH = 1
9856a127 265(?: MUTEXP = $ADDR
208edb77
MG
266 OWNER = $ADDR
267)? FLAGS = 0x0
a3985cdc 268 OUTSIDE_SEQ = \\d+
9248c45a 269 PADLIST = $ADDR
dd2155a4 270 PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
ee6cee0c 271 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
b5c19bd7 272 \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0
ee6cee0c 273 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
e9569a7a 274 \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2"
9248c45a
JH
275 OUTSIDE = $ADDR \\(MAIN\\)');
276
277do_test(15,
278 qr(tic),
279'SV = RV\\($ADDR\\) at $ADDR
280 REFCNT = 1
281 FLAGS = \\(ROK\\)
282 RV = $ADDR
283 SV = PVMG\\($ADDR\\) at $ADDR
284 REFCNT = 1
faf82a0b 285 FLAGS = \\(OBJECT,SMG\\)
9248c45a
JH
286 IV = 0
287 NV = 0
288 PV = 0
289 MAGIC = $ADDR
290 MG_VIRTUAL = $ADDR
14befaf4 291 MG_TYPE = PERL_MAGIC_qr\(r\)
9248c45a 292 MG_OBJ = $ADDR
28d8d7f4
YO
293 PAT = "\(\?-xism:tic\)"
294 REFCNT = 2
9248c45a
JH
295 STASH = $ADDR\\t"Regexp"');
296
297do_test(16,
298 (bless {}, "Tac"),
299'SV = RV\\($ADDR\\) at $ADDR
300 REFCNT = 1
301 FLAGS = \\(ROK\\)
302 RV = $ADDR
303 SV = PVHV\\($ADDR\\) at $ADDR
78c72037 304 REFCNT = 1
9248c45a 305 FLAGS = \\(OBJECT,SHAREKEYS\\)
9248c45a
JH
306 STASH = $ADDR\\t"Tac"
307 ARRAY = 0x0
308 KEYS = 0
309 FILL = 0
310 MAX = 7
311 RITER = -1
312 EITER = 0x0');
313
314do_test(17,
315 *a,
316'SV = PVGV\\($ADDR\\) at $ADDR
317 REFCNT = 5
2e5b91de 318 FLAGS = \\(MULTI(?:,IN_PAD)?\\)
9248c45a
JH
319 NAME = "a"
320 NAMELEN = 1
321 GvSTASH = $ADDR\\t"main"
322 GP = $ADDR
323 SV = $ADDR
324 REFCNT = 1
325 IO = 0x0
326 FORM = 0x0
327 AV = 0x0
328 HV = 0x0
329 CV = 0x0
330 CVGEN = 0x0
9ec58fb7 331 LINE = \\d+
084d946d 332 FILE = ".*\\b(?i:peek\\.t)"
e39917cc 333 FLAGS = $ADDR
9248c45a
JH
334 EGV = $ADDR\\t"a"');
335
cdb2dd7b
JH
336if (ord('A') == 193) {
337do_test(18,
338 chr(256).chr(0).chr(512),
339'SV = PV\\($ADDR\\) at $ADDR
340 REFCNT = 1
235cc2e3 341 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
cdb2dd7b
JH
342 PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
343 CUR = 5
1badabf5 344 LEN = \\d+');
cdb2dd7b 345} else {
e6abe6d8
JH
346do_test(18,
347 chr(256).chr(0).chr(512),
348'SV = PV\\($ADDR\\) at $ADDR
349 REFCNT = 1
235cc2e3 350 FLAGS = \\((?:PADTMP,)?POK,READONLY,pPOK,UTF8\\)
98c991d1 351 PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
e6abe6d8 352 CUR = 5
1badabf5 353 LEN = \\d+');
cdb2dd7b 354}
e6abe6d8 355
cdb2dd7b
JH
356if (ord('A') == 193) {
357do_test(19,
358 {chr(256)=>chr(512)},
359'SV = RV\\($ADDR\\) at $ADDR
360 REFCNT = 1
361 FLAGS = \\(ROK\\)
362 RV = $ADDR
363 SV = PVHV\\($ADDR\\) at $ADDR
78c72037 364 REFCNT = 1
b2caaddd 365 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
cdb2dd7b
JH
366 ARRAY = $ADDR \\(0:7, 1:1\\)
367 hash quality = 100.0%
368 KEYS = 1
369 FILL = 1
370 MAX = 7
371 RITER = -1
372 EITER = $ADDR
6cbfa5b4 373 Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
cdb2dd7b
JH
374 SV = PV\\($ADDR\\) at $ADDR
375 REFCNT = 1
376 FLAGS = \\(POK,pPOK,UTF8\\)
377 PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
378 CUR = 2
1badabf5 379 LEN = \\d+');
cdb2dd7b 380} else {
98c991d1
JH
381do_test(19,
382 {chr(256)=>chr(512)},
383'SV = RV\\($ADDR\\) at $ADDR
384 REFCNT = 1
385 FLAGS = \\(ROK\\)
386 RV = $ADDR
387 SV = PVHV\\($ADDR\\) at $ADDR
78c72037 388 REFCNT = 1
19692e8d 389 FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
98c991d1
JH
390 ARRAY = $ADDR \\(0:7, 1:1\\)
391 hash quality = 100.0%
392 KEYS = 1
393 FILL = 1
394 MAX = 7
395 RITER = -1
396 EITER = $ADDR
397 Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
398 SV = PV\\($ADDR\\) at $ADDR
399 REFCNT = 1
400 FLAGS = \\(POK,pPOK,UTF8\\)
401 PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
402 CUR = 2
1badabf5 403 LEN = \\d+');
cdb2dd7b 404}
98c991d1 405
99331854
YST
406my $x="";
407$x=~/.??/g;
408do_test(20,
409 $x,
410'SV = PVMG\\($ADDR\\) at $ADDR
411 REFCNT = 1
235cc2e3 412 FLAGS = \\(PADMY,SMG,POK,pPOK\\)
99331854
YST
413 IV = 0
414 NV = 0
415 PV = $ADDR ""\\\0
416 CUR = 0
1936d2a7 417 LEN = \d+
99331854
YST
418 MAGIC = $ADDR
419 MG_VIRTUAL = &PL_vtbl_mglob
420 MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
421 MG_FLAGS = 0x01
422 MINMATCH');
423
f24fdb76
HS
424#
425# TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
426# environment variables may be invisibly case-forced, hence the (?i:PATH)
5e836f43 427# C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
d9baf692
JM
428# VMS is setting FAKE and READONLY flags. What VMS uses for storing
429# ENV hashes is also not always null terminated.
f24fdb76 430#
99331854
YST
431do_test(21,
432 $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value
433'SV = PVMG\\($ADDR\\) at $ADDR
434 REFCNT = 1
435 FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
436 IV = 0
437 NV = 0
438 PV = $ADDR "0"\\\0
439 CUR = 1
440 LEN = \d+
441 MAGIC = $ADDR
442 MG_VIRTUAL = &PL_vtbl_envelem
443 MG_TYPE = PERL_MAGIC_envelem\\(e\\)
d25a523c 444(?: MG_FLAGS = 0x01
99331854 445 TAINTEDDIR
143a3e5e
CB
446)? MG_LEN = -?\d+
447 MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
5e836f43 448 SV = PV(?:IV)?\\($ADDR\\) at $ADDR
143a3e5e 449 REFCNT = \d+
11e2783c 450 FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)?pPOK\\)
f0fabfd7 451(?: IV = 0
d9baf692 452)? PV = $ADDR "(?i:PATH)"(?:\\\0)?
143a3e5e
CB
453 CUR = \d+
454 LEN = \d+)
99331854
YST
455 MAGIC = $ADDR
456 MG_VIRTUAL = &PL_vtbl_taint
457 MG_TYPE = PERL_MAGIC_taint\\(t\\)');
458
6bf47b08
SR
459# blessed refs
460do_test(22,
461 bless(\\undef, 'Foobar'),
462'SV = RV\\($ADDR\\) at $ADDR
463 REFCNT = 1
464 FLAGS = \\(ROK\\)
465 RV = $ADDR
466 SV = PVMG\\($ADDR\\) at $ADDR
467 REFCNT = 2
468 FLAGS = \\(OBJECT,ROK\\)
7957ad98
MB
469 IV = -?\d+
470 NV = $FLOAT
6bf47b08
SR
471 RV = $ADDR
472 SV = NULL\\(0x0\\) at $ADDR
473 REFCNT = \d+
474 FLAGS = \\(READONLY\\)
475 PV = $ADDR ""
476 CUR = 0
477 LEN = 0
478 STASH = $ADDR\s+"Foobar"');
b1886099
NC
479
480# Constant subroutines
481
482sub const () {
483 "Perl rules";
484}
485
486do_test(23,
487 \&const,
488'SV = RV\\($ADDR\\) at $ADDR
489 REFCNT = 1
490 FLAGS = \\(ROK\\)
491 RV = $ADDR
492 SV = PVCV\\($ADDR\\) at $ADDR
493 REFCNT = (2)
494 FLAGS = \\(POK,pPOK,CONST\\)
c84c4652 495 $IVNV
b1886099
NC
496 PROTOTYPE = ""
497 COMP_STASH = 0x0
d04ba589 498 $ROOT
b1886099
NC
499 XSUB = $ADDR
500 XSUBANY = $ADDR \\(CONST SV\\)
501 SV = PV\\($ADDR\\) at $ADDR
502 REFCNT = 1
503 FLAGS = \\(.*POK,READONLY,pPOK\\)
504 PV = $ADDR "Perl rules"\\\0
505 CUR = 10
506 LEN = \\d+
507 GVGV::GV = $ADDR\\t"main" :: "const"
508 FILE = ".*\\b(?i:peek\\.t)"
509 DEPTH = 0
510(?: MUTEXP = $ADDR
511 OWNER = $ADDR
f73ef291 512)? FLAGS = 0xc00
b1886099
NC
513 OUTSIDE_SEQ = 0
514 PADLIST = 0x0
515 OUTSIDE = 0x0 \\(null\\)');
2e94196c
NC
516
517# isUV should show on PVMG
518do_test(24,
519 do { my $v = $1; $v = ~0; $v },
520'SV = PVMG\\($ADDR\\) at $ADDR
521 REFCNT = 1
522 FLAGS = \\(IOK,pIOK,IsUV\\)
523 UV = \d+
524 NV = 0
525 PV = 0');