Peek.t revision 1.1
1#!./perl -T
2
3BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6    require Config; import Config;
7    if ($Config{'extensions'} !~ /\bDevel\/Peek\b/) {
8        print "1..0 # Skip: Devel::Peek was not built\n";
9        exit 0;
10    }
11}
12
13BEGIN { require "./test.pl"; }
14
15use Devel::Peek;
16
17plan(52);
18
19our $DEBUG = 0;
20open(SAVERR, ">&STDERR") or die "Can't dup STDERR: $!";
21
22# If I reference any lexicals in this, I get the entire outer subroutine (or
23# MAIN) dumped too, which isn't really what I want, as it's a lot of faff to
24# maintain that.
25format PIE =
26Pie     @<<<<<
27$::type
28Good    @>>>>>
29$::mmmm
30.
31
32sub do_test {
33    my $todo = $_[3];
34    my $repeat_todo = $_[4];
35    my $pattern = $_[2];
36    if (open(OUT,">peek$$")) {
37	open(STDERR, ">&OUT") or die "Can't dup OUT: $!";
38	Dump($_[1]);
39        print STDERR "*****\n";
40        Dump($_[1]); # second dump to compare with the first to make sure nothing changed.
41	open(STDERR, ">&SAVERR") or die "Can't restore STDERR: $!";
42	close(OUT);
43	if (open(IN, "peek$$")) {
44	    local $/;
45	    $pattern =~ s/\$ADDR/0x[[:xdigit:]]+/g;
46	    $pattern =~ s/\$FLOAT/(?:\\d*\\.\\d+(?:e[-+]\\d+)?|\\d+)/g;
47	    # handle DEBUG_LEAKING_SCALARS prefix
48	    $pattern =~ s/^(\s*)(SV =.* at )/(?:$1ALLOCATED at .*?\n)?$1$2/mg;
49
50	    # Need some clear generic mechanism to eliminate (or add) lines
51	    # of dump output dependant on perl version. The (previous) use of
52	    # things like $IVNV gave the illusion that the string passed in was
53	    # a regexp into which variables were interpolated, but this wasn't
54	    # actually true as those 'variables' actually also ate the
55	    # whitspace on the line. So it seems better to mark lines that
56	    # need to be eliminated. I considered (?# ... ) and (?{ ... }),
57	    # but whilst embedded code or comment syntax would keep it as a
58	    # legitimate regexp, it still isn't true. Seems easier and clearer
59	    # things that look like comments.
60
61	    # Could do this is in a s///mge but seems clearer like this:
62	    $pattern = join '', map {
63		# If we identify the version condition, take *it* out whatever
64		s/\s*# (\$] [<>]=? 5\.\d\d\d)$//
65		    ? (eval $1 ? $_ : '')
66		    : $_ # Didn't match, so this line is in
67	    } split /^/, $pattern;
68	    
69	    $pattern =~ s/\$PADMY/
70		($] < 5.009) ? 'PADBUSY,PADMY' : 'PADMY';
71	    /mge;
72	    $pattern =~ s/\$PADTMP/
73		($] < 5.009) ? 'PADBUSY,PADTMP' : 'PADTMP';
74	    /mge;
75	    $pattern =~ s/\$RV/
76		($] < 5.011) ? 'RV' : 'IV';
77	    /mge;
78
79	    print $pattern, "\n" if $DEBUG;
80	    my ($dump, $dump2) = split m/\*\*\*\*\*\n/, scalar <IN>;
81	    print $dump, "\n"    if $DEBUG;
82	    like( $dump, qr/\A$pattern\Z/ms );
83
84            local $TODO = $repeat_todo;
85            is($dump2, $dump);
86
87	    close(IN);
88
89            return $1;
90	} else {
91	    die "$0: failed to open peek$$: !\n";
92	}
93    } else {
94	die "$0: failed to create peek$$: $!\n";
95    }
96}
97
98our   $a;
99our   $b;
100my    $c;
101local $d = 0;
102
103END {
104    1 while unlink("peek$$");
105}
106
107do_test( 1,
108	$a = "foo",
109'SV = PV\\($ADDR\\) at $ADDR
110  REFCNT = 1
111  FLAGS = \\(POK,pPOK\\)
112  PV = $ADDR "foo"\\\0
113  CUR = 3
114  LEN = \\d+'
115       );
116
117do_test( 2,
118        "bar",
119'SV = PV\\($ADDR\\) at $ADDR
120  REFCNT = 1
121  FLAGS = \\(.*POK,READONLY,pPOK\\)
122  PV = $ADDR "bar"\\\0
123  CUR = 3
124  LEN = \\d+');
125
126do_test( 3,
127        $b = 123,
128'SV = IV\\($ADDR\\) at $ADDR
129  REFCNT = 1
130  FLAGS = \\(IOK,pIOK\\)
131  IV = 123');
132
133do_test( 4,
134        456,
135'SV = IV\\($ADDR\\) at $ADDR
136  REFCNT = 1
137  FLAGS = \\(.*IOK,READONLY,pIOK\\)
138  IV = 456');
139
140do_test( 5,
141        $c = 456,
142'SV = IV\\($ADDR\\) at $ADDR
143  REFCNT = 1
144  FLAGS = \\($PADMY,IOK,pIOK\\)
145  IV = 456');
146
147# If perl is built with PERL_PRESERVE_IVUV then maths is done as integers
148# where possible and this scalar will be an IV. If NO_PERL_PRESERVE_IVUV then
149# maths is done in floating point always, and this scalar will be an NV.
150# ([NI]) captures the type, referred to by \1 in this regexp and $type for
151# building subsequent regexps.
152my $type = do_test( 6,
153        $c + $d,
154'SV = ([NI])V\\($ADDR\\) at $ADDR
155  REFCNT = 1
156  FLAGS = \\(PADTMP,\1OK,p\1OK\\)
157  \1V = 456');
158
159($d = "789") += 0.1;
160
161do_test( 7,
162       $d,
163'SV = PVNV\\($ADDR\\) at $ADDR
164  REFCNT = 1
165  FLAGS = \\(NOK,pNOK\\)
166  IV = \d+
167  NV = 789\\.(?:1(?:000+\d+)?|0999+\d+)
168  PV = $ADDR "789"\\\0
169  CUR = 3
170  LEN = \\d+');
171
172do_test( 8,
173        0xabcd,
174'SV = IV\\($ADDR\\) at $ADDR
175  REFCNT = 1
176  FLAGS = \\(.*IOK,READONLY,pIOK\\)
177  IV = 43981');
178
179do_test( 9,
180        undef,
181'SV = NULL\\(0x0\\) at $ADDR
182  REFCNT = 1
183  FLAGS = \\(\\)');
184
185do_test(10,
186        \$a,
187'SV = $RV\\($ADDR\\) at $ADDR
188  REFCNT = 1
189  FLAGS = \\(ROK\\)
190  RV = $ADDR
191  SV = PV\\($ADDR\\) at $ADDR
192    REFCNT = 2
193    FLAGS = \\(POK,pPOK\\)
194    PV = $ADDR "foo"\\\0
195    CUR = 3
196    LEN = \\d+');
197
198my $c_pattern;
199if ($type eq 'N') {
200  $c_pattern = '
201    SV = PVNV\\($ADDR\\) at $ADDR
202      REFCNT = 1
203      FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
204      IV = 456
205      NV = 456
206      PV = 0';
207} else {
208  $c_pattern = '
209    SV = IV\\($ADDR\\) at $ADDR
210      REFCNT = 1
211      FLAGS = \\(IOK,pIOK\\)
212      IV = 456';
213}
214do_test(11,
215       [$b,$c],
216'SV = $RV\\($ADDR\\) at $ADDR
217  REFCNT = 1
218  FLAGS = \\(ROK\\)
219  RV = $ADDR
220  SV = PVAV\\($ADDR\\) at $ADDR
221    REFCNT = 1
222    FLAGS = \\(\\)
223    IV = 0					# $] < 5.009
224    NV = 0					# $] < 5.009
225    ARRAY = $ADDR
226    FILL = 1
227    MAX = 1
228    ARYLEN = 0x0
229    FLAGS = \\(REAL\\)
230    Elt No. 0
231    SV = IV\\($ADDR\\) at $ADDR
232      REFCNT = 1
233      FLAGS = \\(IOK,pIOK\\)
234      IV = 123
235    Elt No. 1' . $c_pattern);
236
237do_test(12,
238       {$b=>$c},
239'SV = $RV\\($ADDR\\) at $ADDR
240  REFCNT = 1
241  FLAGS = \\(ROK\\)
242  RV = $ADDR
243  SV = PVHV\\($ADDR\\) at $ADDR
244    REFCNT = 1
245    FLAGS = \\(SHAREKEYS\\)
246    IV = 1					# $] < 5.009
247    NV = $FLOAT					# $] < 5.009
248    ARRAY = $ADDR  \\(0:7, 1:1\\)
249    hash quality = 100.0%
250    KEYS = 1
251    FILL = 1
252    MAX = 7
253    RITER = -1
254    EITER = 0x0
255    Elt "123" HASH = $ADDR' . $c_pattern,
256	'',
257	$] > 5.009 && 'The hash iterator used in dump.c sets the OOK flag');
258
259do_test(13,
260        sub(){@_},
261'SV = $RV\\($ADDR\\) at $ADDR
262  REFCNT = 1
263  FLAGS = \\(ROK\\)
264  RV = $ADDR
265  SV = PVCV\\($ADDR\\) at $ADDR
266    REFCNT = 2
267    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
268    IV = 0					# $] < 5.009
269    NV = 0					# $] < 5.009
270    PROTOTYPE = ""
271    COMP_STASH = $ADDR\\t"main"
272    START = $ADDR ===> \\d+
273    ROOT = $ADDR
274    XSUB = 0x0					# $] < 5.009
275    XSUBANY = 0					# $] < 5.009
276    GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
277    FILE = ".*\\b(?i:peek\\.t)"
278    DEPTH = 0(?:
279    MUTEXP = $ADDR
280    OWNER = $ADDR)?
281    FLAGS = 0x404				# $] < 5.009
282    FLAGS = 0x90				# $] >= 5.009
283    OUTSIDE_SEQ = \\d+
284    PADLIST = $ADDR
285    PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
286    OUTSIDE = $ADDR \\(MAIN\\)');
287
288do_test(14,
289        \&do_test,
290'SV = $RV\\($ADDR\\) at $ADDR
291  REFCNT = 1
292  FLAGS = \\(ROK\\)
293  RV = $ADDR
294  SV = PVCV\\($ADDR\\) at $ADDR
295    REFCNT = (3|4)
296    FLAGS = \\(\\)
297    IV = 0					# $] < 5.009
298    NV = 0					# $] < 5.009
299    COMP_STASH = $ADDR\\t"main"
300    START = $ADDR ===> \\d+
301    ROOT = $ADDR
302    XSUB = 0x0					# $] < 5.009
303    XSUBANY = 0					# $] < 5.009
304    GVGV::GV = $ADDR\\t"main" :: "do_test"
305    FILE = ".*\\b(?i:peek\\.t)"
306    DEPTH = 1
307(?:    MUTEXP = $ADDR
308    OWNER = $ADDR
309)?    FLAGS = 0x0
310    OUTSIDE_SEQ = \\d+
311    PADLIST = $ADDR
312    PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
313       \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$todo"
314       \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$repeat_todo"
315       \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$pattern"
316      \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG"			# $] < 5.009
317      \\d+\\. $ADDR<\\d+> FAKE "\\$DEBUG" flags=0x0 index=0	# $] >= 5.009
318      \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump"
319      \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2"
320    OUTSIDE = $ADDR \\(MAIN\\)');
321
322if ($] >= 5.011) {
323do_test(15,
324        qr(tic),
325'SV = $RV\\($ADDR\\) at $ADDR
326  REFCNT = 1
327  FLAGS = \\(ROK\\)
328  RV = $ADDR
329  SV = REGEXP\\($ADDR\\) at $ADDR
330    REFCNT = 2
331    FLAGS = \\(OBJECT,POK,pPOK\\)
332    IV = 0
333    PV = $ADDR "\\(\\?-xism:tic\\)"\\\0
334    CUR = 12
335    LEN = \\d+
336    STASH = $ADDR\\t"Regexp"');
337} else {
338do_test(15,
339        qr(tic),
340'SV = $RV\\($ADDR\\) at $ADDR
341  REFCNT = 1
342  FLAGS = \\(ROK\\)
343  RV = $ADDR
344  SV = PVMG\\($ADDR\\) at $ADDR
345    REFCNT = 1
346    FLAGS = \\(OBJECT,SMG\\)
347    IV = 0
348    NV = 0
349    PV = 0
350    MAGIC = $ADDR
351      MG_VIRTUAL = $ADDR
352      MG_TYPE = PERL_MAGIC_qr\(r\)
353      MG_OBJ = $ADDR
354        PAT = "\(\?-xism:tic\)"			# $] >= 5.009
355        REFCNT = 2				# $] >= 5.009
356    STASH = $ADDR\\t"Regexp"');
357}
358
359do_test(16,
360        (bless {}, "Tac"),
361'SV = $RV\\($ADDR\\) at $ADDR
362  REFCNT = 1
363  FLAGS = \\(ROK\\)
364  RV = $ADDR
365  SV = PVHV\\($ADDR\\) at $ADDR
366    REFCNT = 1
367    FLAGS = \\(OBJECT,SHAREKEYS\\)
368    IV = 0					# $] < 5.009
369    NV = 0					# $] < 5.009
370    STASH = $ADDR\\t"Tac"
371    ARRAY = 0x0
372    KEYS = 0
373    FILL = 0
374    MAX = 7
375    RITER = -1
376    EITER = 0x0', '',
377	$] > 5.009 ? 'The hash iterator used in dump.c sets the OOK flag'
378	: "Something causes the HV's array to become allocated");
379
380do_test(17,
381	*a,
382'SV = PVGV\\($ADDR\\) at $ADDR
383  REFCNT = 5
384  FLAGS = \\(MULTI(?:,IN_PAD)?\\)		# $] >= 5.009
385  FLAGS = \\(GMG,SMG,MULTI(?:,IN_PAD)?\\)	# $] < 5.009
386  IV = 0					# $] < 5.009
387  NV = 0					# $] < 5.009
388  PV = 0					# $] < 5.009
389  MAGIC = $ADDR					# $] < 5.009
390    MG_VIRTUAL = &PL_vtbl_glob			# $] < 5.009
391    MG_TYPE = PERL_MAGIC_glob\(\*\)		# $] < 5.009
392    MG_OBJ = $ADDR				# $] < 5.009
393  NAME = "a"
394  NAMELEN = 1
395  GvSTASH = $ADDR\\t"main"
396  GP = $ADDR
397    SV = $ADDR
398    REFCNT = 1
399    IO = 0x0
400    FORM = 0x0  
401    AV = 0x0
402    HV = 0x0
403    CV = 0x0
404    CVGEN = 0x0
405    GPFLAGS = 0x0				# $] < 5.009
406    LINE = \\d+
407    FILE = ".*\\b(?i:peek\\.t)"
408    FLAGS = $ADDR
409    EGV = $ADDR\\t"a"');
410
411if (ord('A') == 193) {
412do_test(18,
413	chr(256).chr(0).chr(512),
414'SV = PV\\($ADDR\\) at $ADDR
415  REFCNT = 1
416  FLAGS = \\((?:$PADTMP,)?POK,READONLY,pPOK,UTF8\\)
417  PV = $ADDR "\\\214\\\101\\\0\\\235\\\101"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
418  CUR = 5
419  LEN = \\d+');
420} else {
421do_test(18,
422	chr(256).chr(0).chr(512),
423'SV = PV\\($ADDR\\) at $ADDR
424  REFCNT = 1
425  FLAGS = \\((?:$PADTMP,)?POK,READONLY,pPOK,UTF8\\)
426  PV = $ADDR "\\\304\\\200\\\0\\\310\\\200"\\\0 \[UTF8 "\\\x\{100\}\\\x\{0\}\\\x\{200\}"\]
427  CUR = 5
428  LEN = \\d+');
429}
430
431if (ord('A') == 193) {
432do_test(19,
433	{chr(256)=>chr(512)},
434'SV = $RV\\($ADDR\\) at $ADDR
435  REFCNT = 1
436  FLAGS = \\(ROK\\)
437  RV = $ADDR
438  SV = PVHV\\($ADDR\\) at $ADDR
439    REFCNT = 1
440    FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
441    UV = 1					# $] < 5.009
442    NV = $FLOAT					# $] < 5.009
443    ARRAY = $ADDR  \\(0:7, 1:1\\)
444    hash quality = 100.0%
445    KEYS = 1
446    FILL = 1
447    MAX = 7
448    RITER = -1
449    EITER = $ADDR
450    Elt "\\\214\\\101" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
451    SV = PV\\($ADDR\\) at $ADDR
452      REFCNT = 1
453      FLAGS = \\(POK,pPOK,UTF8\\)
454      PV = $ADDR "\\\235\\\101"\\\0 \[UTF8 "\\\x\{200\}"\]
455      CUR = 2
456      LEN = \\d+',
457	$] > 5.009 ? 'The hash iterator used in dump.c sets the OOK flag'
458	: 'sv_length has been called on the element, and cached the result in MAGIC');
459} else {
460do_test(19,
461	{chr(256)=>chr(512)},
462'SV = $RV\\($ADDR\\) at $ADDR
463  REFCNT = 1
464  FLAGS = \\(ROK\\)
465  RV = $ADDR
466  SV = PVHV\\($ADDR\\) at $ADDR
467    REFCNT = 1
468    FLAGS = \\(SHAREKEYS,HASKFLAGS\\)
469    UV = 1					# $] < 5.009
470    NV = 0					# $] < 5.009
471    ARRAY = $ADDR  \\(0:7, 1:1\\)
472    hash quality = 100.0%
473    KEYS = 1
474    FILL = 1
475    MAX = 7
476    RITER = -1
477    EITER = $ADDR
478    Elt "\\\304\\\200" \[UTF8 "\\\x\{100\}"\] HASH = $ADDR
479    SV = PV\\($ADDR\\) at $ADDR
480      REFCNT = 1
481      FLAGS = \\(POK,pPOK,UTF8\\)
482      PV = $ADDR "\\\310\\\200"\\\0 \[UTF8 "\\\x\{200\}"\]
483      CUR = 2
484      LEN = \\d+', '',
485	$] > 5.009 ? 'The hash iterator used in dump.c sets the OOK flag'
486	: 'sv_length has been called on the element, and cached the result in MAGIC');
487}
488
489my $x="";
490$x=~/.??/g;
491do_test(20,
492        $x,
493'SV = PVMG\\($ADDR\\) at $ADDR
494  REFCNT = 1
495  FLAGS = \\($PADMY,SMG,POK,pPOK\\)
496  IV = 0
497  NV = 0
498  PV = $ADDR ""\\\0
499  CUR = 0
500  LEN = \d+
501  MAGIC = $ADDR
502    MG_VIRTUAL = &PL_vtbl_mglob
503    MG_TYPE = PERL_MAGIC_regex_global\\(g\\)
504    MG_FLAGS = 0x01
505      MINMATCH');
506
507#
508# TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS
509# environment variables may be invisibly case-forced, hence the (?i:PATH)
510# C<scalar(@ARGV)> is turned into an IV on VMS hence the (?:IV)?
511# VMS is setting FAKE and READONLY flags.  What VMS uses for storing
512# ENV hashes is also not always null terminated.
513#
514do_test(21,
515        $ENV{PATH}=@ARGV,  # scalar(@ARGV) is a handy known tainted value
516'SV = PVMG\\($ADDR\\) at $ADDR
517  REFCNT = 1
518  FLAGS = \\(GMG,SMG,RMG,pIOK,pPOK\\)
519  IV = 0
520  NV = 0
521  PV = $ADDR "0"\\\0
522  CUR = 1
523  LEN = \d+
524  MAGIC = $ADDR
525    MG_VIRTUAL = &PL_vtbl_envelem
526    MG_TYPE = PERL_MAGIC_envelem\\(e\\)
527(?:    MG_FLAGS = 0x01
528      TAINTEDDIR
529)?    MG_LEN = -?\d+
530    MG_PTR = $ADDR (?:"(?i:PATH)"|=> HEf_SVKEY
531    SV = PV(?:IV)?\\($ADDR\\) at $ADDR
532      REFCNT = \d+
533      FLAGS = \\(TEMP,POK,(?:FAKE,READONLY,)?pPOK\\)
534(?:      IV = 0
535)?      PV = $ADDR "(?i:PATH)"(?:\\\0)?
536      CUR = \d+
537      LEN = \d+)
538  MAGIC = $ADDR
539    MG_VIRTUAL = &PL_vtbl_taint
540    MG_TYPE = PERL_MAGIC_taint\\(t\\)');
541
542# blessed refs
543do_test(22,
544	bless(\\undef, 'Foobar'),
545'SV = $RV\\($ADDR\\) at $ADDR
546  REFCNT = 1
547  FLAGS = \\(ROK\\)
548  RV = $ADDR
549  SV = PVMG\\($ADDR\\) at $ADDR
550    REFCNT = 2
551    FLAGS = \\(OBJECT,ROK\\)
552    IV = -?\d+
553    NV = $FLOAT
554    RV = $ADDR
555    SV = NULL\\(0x0\\) at $ADDR
556      REFCNT = \d+
557      FLAGS = \\(READONLY\\)
558    PV = $ADDR ""
559    CUR = 0
560    LEN = 0
561    STASH = $ADDR\s+"Foobar"');
562
563# Constant subroutines
564
565sub const () {
566    "Perl rules";
567}
568
569do_test(23,
570	\&const,
571'SV = $RV\\($ADDR\\) at $ADDR
572  REFCNT = 1
573  FLAGS = \\(ROK\\)
574  RV = $ADDR
575  SV = PVCV\\($ADDR\\) at $ADDR
576    REFCNT = (2)
577    FLAGS = \\(POK,pPOK,CONST\\)
578    IV = 0					# $] < 5.009
579    NV = 0					# $] < 5.009
580    PROTOTYPE = ""
581    COMP_STASH = 0x0
582    ROOT = 0x0					# $] < 5.009
583    XSUB = $ADDR
584    XSUBANY = $ADDR \\(CONST SV\\)
585    SV = PV\\($ADDR\\) at $ADDR
586      REFCNT = 1
587      FLAGS = \\(.*POK,READONLY,pPOK\\)
588      PV = $ADDR "Perl rules"\\\0
589      CUR = 10
590      LEN = \\d+
591    GVGV::GV = $ADDR\\t"main" :: "const"
592    FILE = ".*\\b(?i:peek\\.t)"
593    DEPTH = 0(?:
594    MUTEXP = $ADDR
595    OWNER = $ADDR)?
596    FLAGS = 0x200				# $] < 5.009
597    FLAGS = 0xc00				# $] >= 5.009
598    OUTSIDE_SEQ = 0
599    PADLIST = 0x0
600    OUTSIDE = 0x0 \\(null\\)');	
601
602# isUV should show on PVMG
603do_test(24,
604	do { my $v = $1; $v = ~0; $v },
605'SV = PVMG\\($ADDR\\) at $ADDR
606  REFCNT = 1
607  FLAGS = \\(IOK,pIOK,IsUV\\)
608  UV = \d+
609  NV = 0
610  PV = 0');
611
612do_test(25,
613	*STDOUT{IO},
614'SV = $RV\\($ADDR\\) at $ADDR
615  REFCNT = 1
616  FLAGS = \\(ROK\\)
617  RV = $ADDR
618  SV = PVIO\\($ADDR\\) at $ADDR
619    REFCNT = 3
620    FLAGS = \\(OBJECT\\)
621    IV = 0
622    NV = 0					# $] < 5.011
623    STASH = $ADDR\s+"IO::Handle"
624    IFP = $ADDR
625    OFP = $ADDR
626    DIRP = 0x0
627    LINES = 0
628    PAGE = 0
629    PAGE_LEN = 60
630    LINES_LEFT = 0
631    TOP_GV = 0x0
632    FMT_GV = 0x0
633    BOTTOM_GV = 0x0
634    SUBPROCESS = 0				# $] < 5.009
635    TYPE = \'>\'
636    FLAGS = 0x0');
637
638do_test(26,
639	*PIE{FORMAT},
640'SV = $RV\\($ADDR\\) at $ADDR
641  REFCNT = 1
642  FLAGS = \\(ROK\\)
643  RV = $ADDR
644  SV = PVFM\\($ADDR\\) at $ADDR
645    REFCNT = 2
646    FLAGS = \\(\\)
647    IV = 0
648    NV = 0					# $] < 5.009
649(?:    PV = 0
650)?    COMP_STASH = 0x0
651    START = $ADDR ===> \\d+
652    ROOT = $ADDR
653    XSUB = 0x0					# $] < 5.009
654    XSUBANY = 0					# $] < 5.009
655    GVGV::GV = $ADDR\\t"main" :: "PIE"
656    FILE = ".*\\b(?i:peek\\.t)"
657(?:    DEPTH = 0
658    MUTEXP = $ADDR
659    OWNER = $ADDR
660)?    FLAGS = 0x0
661    OUTSIDE_SEQ = \\d+
662    LINES = 0
663    PADLIST = $ADDR
664    PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
665    OUTSIDE = $ADDR \\(MAIN\\)');
666