3 * Copyright (c) 1991-1994, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "'You have talked long in your sleep, Frodo,' said Gandalf gently, 'and
12 * it has not been hard for me to read your mind and memory.'"
23 #else /* Rest of file is for DEBUGGING */
34 setvbuf(stderr, Nullch, _IOLBF, 0);
38 dump_packsubs(defstash);
51 for (i = 0; i <= (I32) HvMAX(stash); i++) {
52 for (entry = HvARRAY(stash)[i]; entry; entry = entry->hent_next) {
53 GV *gv = (GV*)entry->hent_val;
59 if (entry->hent_key[entry->hent_klen-1] == ':' &&
60 (hv = GvHV(gv)) && HvNAME(hv) && hv != defstash)
61 dump_packsubs(hv); /* nested package */
70 SV *sv = sv_newmortal();
73 dump("\nSUB %s = ", SvPVX(sv));
75 dump("(xsub 0x%x %d)\n",
76 (long)CvXSUB(GvCV(gv)),
77 CvXSUBANY(GvCV(gv)).any_i32);
78 else if (CvROOT(GvCV(gv)))
79 dump_op(CvROOT(GvCV(gv)));
88 SV *sv = sv_newmortal();
91 dump("\nFORMAT %s = ", SvPVX(sv));
92 if (CvROOT(GvFORM(gv)))
93 dump_op(CvROOT(GvFORM(gv)));
112 fprintf(stderr, "%-4d", o->op_seq);
114 fprintf(stderr, " ");
115 dump("TYPE = %s ===> ", op_name[o->op_type]);
118 fprintf(stderr, "%d\n", o->op_next->op_seq);
120 fprintf(stderr, "(%d)\n", o->op_next->op_seq);
123 fprintf(stderr, "DONE\n");
126 if (o->op_type == OP_NULL)
127 dump(" (was %s)\n", op_name[o->op_targ]);
129 dump("TARG = %d\n", o->op_targ);
132 dump("ADDR = 0x%lx => 0x%lx\n",o, o->op_next);
136 if (o->op_flags & OPf_KNOW) {
137 if (o->op_flags & OPf_LIST)
138 (void)strcat(buf,"LIST,");
140 (void)strcat(buf,"SCALAR,");
143 (void)strcat(buf,"UNKNOWN,");
144 if (o->op_flags & OPf_KIDS)
145 (void)strcat(buf,"KIDS,");
146 if (o->op_flags & OPf_PARENS)
147 (void)strcat(buf,"PARENS,");
148 if (o->op_flags & OPf_STACKED)
149 (void)strcat(buf,"STACKED,");
150 if (o->op_flags & OPf_REF)
151 (void)strcat(buf,"REF,");
152 if (o->op_flags & OPf_MOD)
153 (void)strcat(buf,"MOD,");
154 if (o->op_flags & OPf_SPECIAL)
155 (void)strcat(buf,"SPECIAL,");
157 buf[strlen(buf)-1] = '\0';
158 dump("FLAGS = (%s)\n",buf);
162 if (o->op_type == OP_AASSIGN) {
163 if (o->op_private & OPpASSIGN_COMMON)
164 (void)strcat(buf,"COMMON,");
166 else if (o->op_type == OP_SASSIGN) {
167 if (o->op_private & OPpASSIGN_BACKWARDS)
168 (void)strcat(buf,"BACKWARDS,");
170 else if (o->op_type == OP_TRANS) {
171 if (o->op_private & OPpTRANS_SQUASH)
172 (void)strcat(buf,"SQUASH,");
173 if (o->op_private & OPpTRANS_DELETE)
174 (void)strcat(buf,"DELETE,");
175 if (o->op_private & OPpTRANS_COMPLEMENT)
176 (void)strcat(buf,"COMPLEMENT,");
178 else if (o->op_type == OP_REPEAT) {
179 if (o->op_private & OPpREPEAT_DOLIST)
180 (void)strcat(buf,"DOLIST,");
182 else if (o->op_type == OP_ENTERSUB ||
183 o->op_type == OP_RV2SV ||
184 o->op_type == OP_RV2AV ||
185 o->op_type == OP_RV2HV ||
186 o->op_type == OP_RV2GV ||
187 o->op_type == OP_AELEM ||
188 o->op_type == OP_HELEM )
190 if (o->op_private & OPpENTERSUB_AMPER)
191 (void)strcat(buf,"AMPER,");
192 if (o->op_private & OPpENTERSUB_DB)
193 (void)strcat(buf,"DB,");
194 if (o->op_private & OPpDEREF_AV)
195 (void)strcat(buf,"AV,");
196 if (o->op_private & OPpDEREF_HV)
197 (void)strcat(buf,"HV,");
198 if (o->op_private & HINT_STRICT_REFS)
199 (void)strcat(buf,"STRICT_REFS,");
201 else if (o->op_type == OP_CONST) {
202 if (o->op_private & OPpCONST_BARE)
203 (void)strcat(buf,"BARE,");
205 else if (o->op_type == OP_FLIP) {
206 if (o->op_private & OPpFLIP_LINENUM)
207 (void)strcat(buf,"LINENUM,");
209 else if (o->op_type == OP_FLOP) {
210 if (o->op_private & OPpFLIP_LINENUM)
211 (void)strcat(buf,"LINENUM,");
213 if (o->op_flags & OPf_MOD && o->op_private & OPpLVAL_INTRO)
214 (void)strcat(buf,"INTRO,");
216 buf[strlen(buf)-1] = '\0';
217 dump("PRIVATE = (%s)\n",buf);
221 switch (o->op_type) {
228 gv_fullname(tmpsv,cGVOPo->op_gv);
229 dump("GV = %s\n", SvPV(tmpsv, na));
236 dump("SV = %s\n", SvPEEK(cSVOPo->op_sv));
241 dump("LINE = %d\n",cCOPo->cop_line);
242 if (cCOPo->cop_label)
243 dump("LABEL = \"%s\"\n",cCOPo->cop_label);
247 if (cLOOPo->op_redoop)
248 fprintf(stderr, "%d\n", cLOOPo->op_redoop->op_seq);
250 fprintf(stderr, "DONE\n");
252 if (cLOOPo->op_nextop)
253 fprintf(stderr, "%d\n", cLOOPo->op_nextop->op_seq);
255 fprintf(stderr, "DONE\n");
257 if (cLOOPo->op_lastop)
258 fprintf(stderr, "%d\n", cLOOPo->op_lastop->op_seq);
260 fprintf(stderr, "DONE\n");
264 if (cCONDOPo->op_true)
265 fprintf(stderr, "%d\n", cCONDOPo->op_true->op_seq);
267 fprintf(stderr, "DONE\n");
269 if (cCONDOPo->op_false)
270 fprintf(stderr, "%d\n", cCONDOPo->op_false->op_seq);
272 fprintf(stderr, "DONE\n");
279 if (cLOGOPo->op_other)
280 fprintf(stderr, "%d\n", cLOGOPo->op_other->op_seq);
282 fprintf(stderr, "DONE\n");
292 if (o->op_flags & OPf_KIDS) {
294 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
308 fprintf(stderr,"{}\n");
313 fprintf(stderr,"{\n");
315 dump("GV_NAME = %s", SvPVX(sv));
316 if (gv != GvEGV(gv)) {
317 gv_efullname(sv,GvEGV(gv));
318 dump("-> %s", SvPVX(sv));
337 if (pm->op_pmflags & PMf_ONCE)
342 dump("PMf_PRE %c%s%c\n",ch,pm->op_pmregexp->precomp,ch);
343 if (pm->op_type != OP_PUSHRE && pm->op_pmreplroot) {
345 dump_op(pm->op_pmreplroot);
347 if (pm->op_pmshort) {
348 dump("PMf_SHORT = %s\n",SvPEEK(pm->op_pmshort));
350 if (pm->op_pmflags) {
352 if (pm->op_pmflags & PMf_USED)
353 (void)strcat(buf,"USED,");
354 if (pm->op_pmflags & PMf_ONCE)
355 (void)strcat(buf,"ONCE,");
356 if (pm->op_pmflags & PMf_SCANFIRST)
357 (void)strcat(buf,"SCANFIRST,");
358 if (pm->op_pmflags & PMf_ALL)
359 (void)strcat(buf,"ALL,");
360 if (pm->op_pmflags & PMf_SKIPWHITE)
361 (void)strcat(buf,"SKIPWHITE,");
362 if (pm->op_pmflags & PMf_FOLD)
363 (void)strcat(buf,"FOLD,");
364 if (pm->op_pmflags & PMf_CONST)
365 (void)strcat(buf,"CONST,");
366 if (pm->op_pmflags & PMf_KEEP)
367 (void)strcat(buf,"KEEP,");
368 if (pm->op_pmflags & PMf_GLOBAL)
369 (void)strcat(buf,"GLOBAL,");
370 if (pm->op_pmflags & PMf_RUNTIME)
371 (void)strcat(buf,"RUNTIME,");
372 if (pm->op_pmflags & PMf_EVAL)
373 (void)strcat(buf,"EVAL,");
375 buf[strlen(buf)-1] = '\0';
376 dump("PMFLAGS = (%s)\n",buf);
384 static void dump(arg1,arg2,arg3,arg4,arg5)
386 long arg2, arg3, arg4, arg5;
390 for (i = dumplvl*4; i; i--)
391 (void)putc(' ',stderr);
392 fprintf(stderr,arg1, arg2, arg3, arg4, arg5);