/* $Id: LexAlias.xs,v 1.7 2002/07/25 14:25:22 richardc Exp $ */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* cargo-culted from PadWalker */ MODULE = Devel::LexAlias PACKAGE = Devel::LexAlias void _lexalias(SV* cv_ref, char *name, SV* new_rv) CODE: { CV *cv = SvROK(cv_ref) ? (CV*) SvRV(cv_ref) : NULL; AV* padn = cv ? (AV*) AvARRAY(CvPADLIST(cv))[0] : PL_comppad_name; AV* padv = cv ? (AV*) AvARRAY(CvPADLIST(cv))[1] : PL_comppad; SV* new_sv; I32 i; if (!SvROK(new_rv)) croak("ref is not a reference"); new_sv = SvRV(new_rv); for (i = 0; i <= av_len(padn); ++i) { SV** name_ptr = av_fetch(padn, i, 0); if (name_ptr) { SV* name_sv = *name_ptr; if (SvPOKp(name_sv)) { char *name_str = SvPVX(name_sv); if (!strcmp(name, name_str)) { SV* old_sv = (SV*) av_fetch(padv, i, 0); av_store(padv, i, new_sv); SvREFCNT_inc(new_sv); } } } } }