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