blob: a5b5624568b7c42e069c6acf8b73809137d79a69 [file] [log] [blame]
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef PERL_OBJECT
#define sv_name(svp) svp
#define undef(ref)
#else
static void undef(SV *ref)
{
GV *gv;
SV *sv;
CV *cv;
I32 has_proto=FALSE;
if(SvROK(ref))
sv = SvRV(ref);
else
croak("Apache::Symbol::undef called without a reference!");
switch (SvTYPE(sv)) {
case SVt_PVCV:
cv = (CV*)sv;
if (!CvXSUB(cv) && CvROOT(cv) && CvDEPTH(cv)) {
return; /* subroutine is active */
}
gv = (GV*)SvREFCNT_inc(CvGV(cv));
if(SvPOK(cv))
has_proto = TRUE;
cv_undef(cv);
CvGV(cv) = gv; /* let user-undef'd sub keep its identity */
if(has_proto)
SvPOK_on(cv); /* otherwise we get `Prototype mismatch:' */
break;
default:
warn("Apache::Symbol::undef called without a CODE reference!\n");
}
}
static SV *sv_name(SV *svp)
{
SV *sv = Nullsv;
SV *RETVAL = Nullsv;
if(svp && SvROK(svp) && (sv = SvRV(svp))) {
switch(SvTYPE(sv)) {
case SVt_PVCV:
RETVAL = newSV(0);
gv_fullname(RETVAL, CvGV(sv));
break;
default:
break;
}
}
else if(svp && SvPOK(svp)) {
RETVAL = newSVsv(svp);
}
return RETVAL;
}
#endif
MODULE = Apache::Symbol PACKAGE = Apache::Symbol
PROTOTYPES: DISABLE
void
undef(sv)
SV *sv
SV *
sv_name(sv)
SV *sv
SV *
cv_const_sv(sv)
SV* sv
PREINIT:
CV *cv;
GV *gv;
HV *stash;
CODE:
switch (SvTYPE(sv)) {
default:
if (!SvROK(sv)) {
char *sym;
if (SvGMAGICAL(sv)) {
mg_get(sv);
sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
}
else {
STRLEN n_a;
sym = SvPV(sv, n_a);
}
if(sym)
cv = perl_get_cv(sym, TRUE);
break;
}
cv = (CV*)SvRV(sv);
if (SvTYPE(cv) == SVt_PVCV)
break;
case SVt_PVHV:
case SVt_PVAV:
croak("Not a CODE reference");
case SVt_PVCV:
cv = (CV*)sv;
break;
case SVt_PVGV:
if (!(cv = GvCVu((GV*)sv)))
cv = sv_2cv(sv, &stash, &gv, TRUE);
break;
}
if(!(RETVAL = cv_const_sv(cv)))
XSRETURN_UNDEF;
SvREADONLY_off(RETVAL);
OUTPUT:
RETVAL