|
Packit |
510177 |
#include "EXTERN.h"
|
|
Packit |
510177 |
#include "perl.h"
|
|
Packit |
510177 |
#include "XSUB.h"
|
|
Packit |
510177 |
|
|
Packit |
510177 |
#ifndef PadARRAY
|
|
Packit |
510177 |
typedef AV PADNAMELIST;
|
|
Packit |
510177 |
typedef SV PADNAME;
|
|
Packit |
510177 |
# if PERL_VERSION < 8 || (PERL_VERSION == 8 && !PERL_SUBVERSION)
|
|
Packit |
510177 |
typedef AV PAD;
|
|
Packit |
510177 |
# endif
|
|
Packit |
510177 |
# define PadlistARRAY(pl) ((PAD **)AvARRAY(pl))
|
|
Packit |
510177 |
# define PadlistNAMES(pl) (*PadlistARRAY(pl))
|
|
Packit |
510177 |
# define PadnamelistARRAY(pnl) ((PADNAME **)AvARRAY(pnl))
|
|
Packit |
510177 |
# define PadnamelistMAX(pnl) AvFILLp(pnl)
|
|
Packit |
510177 |
# define PadARRAY AvARRAY
|
|
Packit |
510177 |
# define PadnamePV(pn) (SvPOKp(pn) ? SvPVX(pn) : NULL)
|
|
Packit |
510177 |
#endif
|
|
Packit |
510177 |
|
|
Packit |
510177 |
|
|
Packit |
510177 |
|
|
Packit |
510177 |
/* cargo-culted from PadWalker */
|
|
Packit |
510177 |
|
|
Packit |
510177 |
MODULE = Devel::LexAlias PACKAGE = Devel::LexAlias
|
|
Packit |
510177 |
|
|
Packit |
510177 |
void
|
|
Packit |
510177 |
_lexalias(SV* cv_ref, char *name, SV* new_rv)
|
|
Packit |
510177 |
CODE:
|
|
Packit |
510177 |
{
|
|
Packit |
510177 |
CV* cv = SvROK(cv_ref) ? (CV*) SvRV(cv_ref) : NULL;
|
|
Packit |
510177 |
PADNAMELIST* padn = cv ? PadlistNAMES(CvPADLIST(cv)) : PL_comppad_name;
|
|
Packit |
510177 |
PAD* padv = cv ? PadlistARRAY(CvPADLIST(cv))[1] : PL_comppad;
|
|
Packit |
510177 |
SV* new_sv;
|
|
Packit |
510177 |
I32 i;
|
|
Packit |
510177 |
|
|
Packit |
510177 |
if (!SvROK(new_rv)) croak("ref is not a reference");
|
|
Packit |
510177 |
new_sv = SvRV(new_rv);
|
|
Packit |
510177 |
|
|
Packit |
510177 |
for (i = 0; i <= PadnamelistMAX(padn); ++i) {
|
|
Packit |
510177 |
PADNAME* namesv = PadnamelistARRAY(padn)[i];
|
|
Packit |
510177 |
char* name_str;
|
|
Packit |
510177 |
if (namesv && (name_str = PadnamePV(namesv))) {
|
|
Packit |
510177 |
if (!strcmp(name, name_str)) {
|
|
Packit |
510177 |
SvREFCNT_dec(PadARRAY(padv)[i]);
|
|
Packit |
510177 |
PadARRAY(padv)[i] = new_sv;
|
|
Packit |
510177 |
SvREFCNT_inc(new_sv);
|
|
Packit |
510177 |
SvPADMY_on(new_sv);
|
|
Packit |
510177 |
}
|
|
Packit |
510177 |
}
|
|
Packit |
510177 |
}
|
|
Packit |
510177 |
}
|