mirror of
https://github.com/Perl/perl5.git
synced 2026-01-26 08:38:23 +00:00
This commit:
1. Renames the various dtrace probe macros into a consistent and
self-documenting pattern, e.g.
ENTRY_PROBE => PERL_DTRACE_PROBE_ENTRY
RETURN_PROBE => PERL_DTRACE_PROBE_RETURN
Since they're supposed to be defined only under PERL_CORE, this shouldn't
break anything that's not being naughty.
2. Implement the main body of these macros using a real function.
They were formerly defined along the lines of
if (PERL_SUB_ENTRY_ENABLED())
PERL_SUB_ENTRY(...);
The PERL_SUB_ENTRY() part is a macro generated by the dtrace system, which
for example on linux expands to a large bunch of assembly directives.
Replace the direct macro with a function wrapper, e.g.
if (PERL_SUB_ENTRY_ENABLED())
Perl_dtrace_probe_call(aTHX_ cv, TRUE);
This reduces to once the number of times the macro is expanded.
The new functions also take simpler args and then process the values they
need using intermediate temporary vars to avoid huge macro expansions.
For example
ENTRY_PROBE(CvNAMED(cv)
? HEK_KEY(CvNAME_HEK(cv))
: GvENAME(CvGV(cv)),
CopFILE((const COP *)CvSTART(cv)),
CopLINE((const COP *)CvSTART(cv)),
CopSTASHPV((const COP *)CvSTART(cv)));
is now
PERL_DTRACE_PROBE_ENTRY(cv);
This reduces the executable size by 1K on -O2 -Dusedtrace builds,
and by 45K on -DDEBUGGING -Dusedtrace builds.
53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
/* run.c
|
|
*
|
|
* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
|
* 2000, 2001, 2004, 2005, 2006, by Larry Wall and others
|
|
*
|
|
* You may distribute under the terms of either the GNU General Public
|
|
* License or the Artistic License, as specified in the README file.
|
|
*
|
|
*/
|
|
|
|
/* This file contains the main Perl opcode execution loop. It just
|
|
* calls the pp_foo() function associated with each op, and expects that
|
|
* function to return a pointer to the next op to be executed, or null if
|
|
* it's the end of the sub or program or whatever.
|
|
*
|
|
* There is a similar loop in dump.c, Perl_runops_debug(), which does
|
|
* the same, but also checks for various debug flags each time round the
|
|
* loop.
|
|
*
|
|
* Why this function requires a file all of its own is anybody's guess.
|
|
* DAPM.
|
|
*/
|
|
|
|
#include "EXTERN.h"
|
|
#define PERL_IN_RUN_C
|
|
#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
|
|
*
|
|
* [p.600 of _The Lord of the Rings_, III/xi: "The Palantír"]
|
|
*/
|
|
|
|
int
|
|
Perl_runops_standard(pTHX)
|
|
{
|
|
OP *op = PL_op;
|
|
PERL_DTRACE_PROBE_OP(op);
|
|
while ((PL_op = op = op->op_ppaddr(aTHX))) {
|
|
PERL_DTRACE_PROBE_OP(op);
|
|
}
|
|
PERL_ASYNC_CHECK();
|
|
|
|
TAINT_NOT;
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* ex: set ts=8 sts=4 sw=4 et:
|
|
*/
|