This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Convert miniperl sources to ANSI C. Several passes of
[perl5.git] / run.c
1 /*    run.c
2  *
3  *    Copyright (c) 1991-1997, 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 #include "perl.h"
12
13 /*
14  * "Away now, Shadowfax!  Run, greatheart, run as you have never run before!
15  * Now we are come to the lands where you were foaled, and every stone you
16  * know.  Run now!  Hope is in speed!"  --Gandalf
17  */
18
19 dEXT char **watchaddr = 0;
20 dEXT char *watchok;
21
22 int
23 runops_standard(void) {
24     dTHR;
25     SAVEI32(runlevel);
26     runlevel++;
27
28     while ( op = (*op->op_ppaddr)(ARGS) ) ;
29
30     TAINT_NOT;
31     return 0;
32 }
33
34 #ifdef DEBUGGING
35 static void debprof _((OP*o));
36
37 int
38 runops_debug(void) {
39     dTHR;
40     if (!op) {
41         warn("NULL OP IN RUN");
42         return 0;
43     }
44
45     SAVEI32(runlevel);
46     runlevel++;
47
48     do {
49         if (debug) {
50             if (watchaddr != 0 && *watchaddr != watchok)
51                 PerlIO_printf(Perl_debug_log, "WARNING: %lx changed from %lx to %lx\n",
52                     (long)watchaddr, (long)watchok, (long)*watchaddr);
53             DEBUG_s(debstack());
54             DEBUG_t(debop(op));
55             DEBUG_P(debprof(op));
56         }
57     } while ( op = (*op->op_ppaddr)(ARGS) );
58
59     TAINT_NOT;
60     return 0;
61 }
62
63 I32
64 debop(OP *o)
65 {
66     SV *sv;
67     deb("%s", op_name[o->op_type]);
68     switch (o->op_type) {
69     case OP_CONST:
70         PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo->op_sv));
71         break;
72     case OP_GVSV:
73     case OP_GV:
74         if (cGVOPo->op_gv) {
75             sv = NEWSV(0,0);
76             gv_fullname3(sv, cGVOPo->op_gv, Nullch);
77             PerlIO_printf(Perl_debug_log, "(%s)", SvPV(sv, na));
78             SvREFCNT_dec(sv);
79         }
80         else
81             PerlIO_printf(Perl_debug_log, "(NULL)");
82         break;
83     default:
84         break;
85     }
86     PerlIO_printf(Perl_debug_log, "\n");
87     return 0;
88 }
89
90 void
91 watch(char **addr)
92 {
93     watchaddr = addr;
94     watchok = *addr;
95     PerlIO_printf(Perl_debug_log, "WATCHING, %lx is currently %lx\n",
96         (long)watchaddr, (long)watchok);
97 }
98
99 static void
100 debprof(OP *o)
101 {
102     if (!profiledata)
103         New(000, profiledata, MAXO, U32);
104     ++profiledata[o->op_type];
105 }
106
107 void
108 debprofdump(void)
109 {
110     unsigned i;
111     if (!profiledata)
112         return;
113     for (i = 0; i < MAXO; i++) {
114         if (profiledata[i])
115             PerlIO_printf(Perl_debug_log,
116                           "%u\t%lu\n", i, (unsigned long)profiledata[i]);
117     }
118 }
119
120 #endif
121