From: Ilya Zakharevich <ilya@math.ohio-state.edu>
[p5sagit/p5-mst-13.2.git] / run.c
1 /*    run.c
2  *
3  *    Copyright (c) 1991-1999, Larry Wall
4  *
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.
7  *
8  */
9
10 #include "EXTERN.h"
11 #define PERL_IN_RUN_C
12 #include "perl.h"
13
14 /*
15  * "Away now, Shadowfax!  Run, greatheart, run as you have never run before!
16  * Now we are come to the lands where you were foaled, and every stone you
17  * know.  Run now!  Hope is in speed!"  --Gandalf
18  */
19
20 int
21 Perl_runops_standard(pTHX)
22 {
23     dTHR;
24
25     while ( PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX) ) ;
26
27     TAINT_NOT;
28     return 0;
29 }
30
31 int
32 Perl_runops_debug(pTHX)
33 {
34 #ifdef DEBUGGING
35     dTHR;
36     if (!PL_op) {
37         if (ckWARN_d(WARN_DEBUGGING))
38             Perl_warner(aTHX_ WARN_DEBUGGING, "NULL OP IN RUN");
39         return 0;
40     }
41
42     do {
43         if (PL_debug) {
44             if (PL_watchaddr != 0 && *PL_watchaddr != PL_watchok)
45                 PerlIO_printf(Perl_debug_log, "WARNING: %lx changed from %lx to %lx\n",
46                     (long)PL_watchaddr, (long)PL_watchok, (long)*PL_watchaddr);
47             DEBUG_s(debstack());
48             DEBUG_t(debop(PL_op));
49             DEBUG_P(debprof(PL_op));
50         }
51     } while ( PL_op = CALL_FPTR(PL_op->op_ppaddr)(aTHX) );
52
53     TAINT_NOT;
54     return 0;
55 #else
56     return runops_standard();
57 #endif  /* DEBUGGING */
58 }
59
60 I32
61 Perl_debop(pTHX_ OP *o)
62 {
63 #ifdef DEBUGGING
64     SV *sv;
65     STRLEN n_a;
66     Perl_deb(aTHX_ "%s", PL_op_name[o->op_type]);
67     switch (o->op_type) {
68     case OP_CONST:
69         PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo->op_sv));
70         break;
71     case OP_GVSV:
72     case OP_GV:
73         if (cGVOPo->op_gv) {
74             sv = NEWSV(0,0);
75             gv_fullname3(sv, cGVOPo->op_gv, Nullch);
76             PerlIO_printf(Perl_debug_log, "(%s)", SvPV(sv, n_a));
77             SvREFCNT_dec(sv);
78         }
79         else
80             PerlIO_printf(Perl_debug_log, "(NULL)");
81         break;
82     default:
83         break;
84     }
85     PerlIO_printf(Perl_debug_log, "\n");
86 #endif  /* DEBUGGING */
87     return 0;
88 }
89
90 void
91 Perl_watch(pTHX_ char **addr)
92 {
93 #ifdef DEBUGGING
94     dTHR;
95     PL_watchaddr = addr;
96     PL_watchok = *addr;
97     PerlIO_printf(Perl_debug_log, "WATCHING, %lx is currently %lx\n",
98         (long)PL_watchaddr, (long)PL_watchok);
99 #endif  /* DEBUGGING */
100 }
101
102 STATIC void
103 S_debprof(pTHX_ OP *o)
104 {
105 #ifdef DEBUGGING
106     if (!PL_profiledata)
107         Newz(000, PL_profiledata, MAXO, U32);
108     ++PL_profiledata[o->op_type];
109 #endif /* DEBUGGING */
110 }
111
112 void
113 Perl_debprofdump(pTHX)
114 {
115 #ifdef DEBUGGING
116     unsigned i;
117     if (!PL_profiledata)
118         return;
119     for (i = 0; i < MAXO; i++) {
120         if (PL_profiledata[i])
121             PerlIO_printf(Perl_debug_log,
122                           "%5lu %s\n", (unsigned long)PL_profiledata[i],
123                                        PL_op_name[i]);
124     }
125 #endif  /* DEBUGGING */
126 }