summaryrefslogtreecommitdiffstats
path: root/contrib/perl5/run.c
diff options
context:
space:
mode:
authormarkm <markm@FreeBSD.org>1998-09-09 07:00:04 +0000
committermarkm <markm@FreeBSD.org>1998-09-09 07:00:04 +0000
commit4fcbc3669aa997848e15198cc9fb856287a6788c (patch)
tree58b20e81687d6d5931f120b50802ed21225bf440 /contrib/perl5/run.c
downloadFreeBSD-src-4fcbc3669aa997848e15198cc9fb856287a6788c.zip
FreeBSD-src-4fcbc3669aa997848e15198cc9fb856287a6788c.tar.gz
Initial import of Perl5. The king is dead; long live the king!
Diffstat (limited to 'contrib/perl5/run.c')
-rw-r--r--contrib/perl5/run.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/contrib/perl5/run.c b/contrib/perl5/run.c
new file mode 100644
index 0000000..97444ec
--- /dev/null
+++ b/contrib/perl5/run.c
@@ -0,0 +1,139 @@
+/* run.c
+ *
+ * Copyright (c) 1991-1997, Larry Wall
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#include "EXTERN.h"
+#include "perl.h"
+
+/*
+ * "Away now, Shadowfax! Run, greatheart, run as you have never run before!
+ * Now we are come to the lands where you were foaled, and every stone you
+ * know. Run now! Hope is in speed!" --Gandalf
+ */
+
+#ifdef PERL_OBJECT
+#define CALLOP this->*PL_op
+#else
+#define CALLOP *PL_op
+#endif
+
+int
+runops_standard(void)
+{
+ dTHR;
+
+ while ( PL_op = (CALLOP->op_ppaddr)(ARGS) ) ;
+
+ TAINT_NOT;
+ return 0;
+}
+
+#ifdef DEBUGGING
+
+dEXT char **watchaddr = 0;
+dEXT char *watchok;
+
+#ifndef PERL_OBJECT
+static void debprof _((OP*o));
+#endif
+
+#endif /* DEBUGGING */
+
+int
+runops_debug(void)
+{
+#ifdef DEBUGGING
+ dTHR;
+ if (!PL_op) {
+ warn("NULL OP IN RUN");
+ return 0;
+ }
+
+ do {
+ if (PL_debug) {
+ if (watchaddr != 0 && *watchaddr != watchok)
+ PerlIO_printf(Perl_debug_log, "WARNING: %lx changed from %lx to %lx\n",
+ (long)watchaddr, (long)watchok, (long)*watchaddr);
+ DEBUG_s(debstack());
+ DEBUG_t(debop(PL_op));
+ DEBUG_P(debprof(PL_op));
+ }
+ } while ( PL_op = (CALLOP->op_ppaddr)(ARGS) );
+
+ TAINT_NOT;
+ return 0;
+#else
+ return runops_standard();
+#endif /* DEBUGGING */
+}
+
+I32
+debop(OP *o)
+{
+#ifdef DEBUGGING
+ SV *sv;
+ deb("%s", op_name[o->op_type]);
+ switch (o->op_type) {
+ case OP_CONST:
+ PerlIO_printf(Perl_debug_log, "(%s)", SvPEEK(cSVOPo->op_sv));
+ break;
+ case OP_GVSV:
+ case OP_GV:
+ if (cGVOPo->op_gv) {
+ sv = NEWSV(0,0);
+ gv_fullname3(sv, cGVOPo->op_gv, Nullch);
+ PerlIO_printf(Perl_debug_log, "(%s)", SvPV(sv, PL_na));
+ SvREFCNT_dec(sv);
+ }
+ else
+ PerlIO_printf(Perl_debug_log, "(NULL)");
+ break;
+ default:
+ break;
+ }
+ PerlIO_printf(Perl_debug_log, "\n");
+#endif /* DEBUGGING */
+ return 0;
+}
+
+void
+watch(char **addr)
+{
+#ifdef DEBUGGING
+ watchaddr = addr;
+ watchok = *addr;
+ PerlIO_printf(Perl_debug_log, "WATCHING, %lx is currently %lx\n",
+ (long)watchaddr, (long)watchok);
+#endif /* DEBUGGING */
+}
+
+STATIC void
+debprof(OP *o)
+{
+#ifdef DEBUGGING
+ if (!PL_profiledata)
+ Newz(000, PL_profiledata, MAXO, U32);
+ ++PL_profiledata[o->op_type];
+#endif /* DEBUGGING */
+}
+
+void
+debprofdump(void)
+{
+#ifdef DEBUGGING
+ unsigned i;
+ if (!PL_profiledata)
+ return;
+ for (i = 0; i < MAXO; i++) {
+ if (PL_profiledata[i])
+ PerlIO_printf(Perl_debug_log,
+ "%5lu %s\n", (unsigned long)PL_profiledata[i],
+ op_name[i]);
+ }
+#endif /* DEBUGGING */
+}
OpenPOWER on IntegriCloud