You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by do...@apache.org on 2002/06/16 03:07:21 UTC
cvs commit: modperl-2.0/src/modules/perl modperl_perl_pp.c modperl_perl_pp.h
dougm 2002/06/15 18:07:21
Added: src/modules/perl modperl_perl_pp.c modperl_perl_pp.h
Log:
new module where any PL_ppaddr modifications are done
Revision Changes Path
1.1 modperl-2.0/src/modules/perl/modperl_perl_pp.c
Index: modperl_perl_pp.c
===================================================================
#include "mod_perl.h"
static enum opcode MP_pp_map[] = {
#ifdef MP_REFGEN_FIXUP
OP_SREFGEN,
#endif
};
typedef OP * MP_FUNC_T(modperl_pp_t)(pTHX);
static modperl_pp_t MP_PERL_ppaddr[MP_OP_max];
#ifdef MP_REFGEN_FIXUP
/*
* nasty workaround for bug fixed in bleedperl (11536 + 11553)
* XXX: when 5.8.0 is released + stable, we will require 5.8.0
* if ithreads are enabled.
*/
static OP *modperl_pp_srefgen(pTHX)
{
dSP;
OP *o;
SV *sv = *SP;
if (SvPADTMP(sv) && IS_PADGV(sv)) {
/* prevent S_refto from making a copy of the GV,
* tricking it to SvREFCNT_inc and point to this one instead.
*/
SvPADTMP_off(sv);
}
else {
sv = Nullsv;
}
/* o = Perl_pp_srefgen(aTHX) */
o = MP_PERL_ppaddr[MP_OP_SREFGEN](aTHX);
if (sv) {
/* restore original flags */
SvPADTMP_on(sv);
}
return o;
}
#endif /* MP_REFGEN_FIXUP */
static modperl_pp_t MP_ppaddr[] = {
#ifdef MP_REFGEN_FIXUP
MEMBER_TO_FPTR(modperl_pp_srefgen),
#endif
};
void modperl_perl_pp_set(modperl_perl_opcode_e idx)
{
int pl_idx = MP_pp_map[idx];
/* save original */
MP_PERL_ppaddr[idx] = PL_ppaddr[pl_idx];
/* replace with our own */
PL_ppaddr[pl_idx] = MP_ppaddr[idx];
}
void modperl_perl_pp_set_all(void)
{
int i;
for (i=0; i<MP_OP_max; i++) {
modperl_perl_pp_set(i);
}
}
void modperl_perl_pp_unset(modperl_perl_opcode_e idx)
{
int pl_idx = MP_pp_map[idx];
/* restore original */
PL_ppaddr[pl_idx] = MP_PERL_ppaddr[idx];
}
void modperl_perl_pp_unset_all(void)
{
int i;
for (i=0; i<MP_OP_max; i++) {
modperl_perl_pp_unset(i);
}
}
1.1 modperl-2.0/src/modules/perl/modperl_perl_pp.h
Index: modperl_perl_pp.h
===================================================================
#ifndef MODPERL_PERL_PP_H
#define MODPERL_PERL_PP_H
#if defined(USE_ITHREADS) && defined(MP_PERL_5_6_x)
# define MP_REFGEN_FIXUP
#endif
typedef enum {
#ifdef MP_REFGEN_FIXUP
MP_OP_SREFGEN,
#endif
MP_OP_max
} modperl_perl_opcode_e;
void modperl_perl_pp_set(modperl_perl_opcode_e idx);
void modperl_perl_pp_set_all(void);
void modperl_perl_pp_unset(modperl_perl_opcode_e idx);
void modperl_perl_pp_unset_all(void);
#endif /* MODPERL_PERL_PP_H */