/*
 * This file was generated automatically by xsubpp version 1.9505 from the 
 * contents of Symbol.xs. Do not edit this file, edit Symbol.xs instead.
 *
 *	ANY CHANGES MADE HERE WILL BE LOST! 
 *
 */

#line 1 "Symbol.xs"
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "patchlevel.h" 
#if ((PATCHLEVEL >= 4) && (SUBVERSION >= 76)) || (PATCHLEVEL >= 5) 
#define na PL_na 
#endif 

#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

XS(XS_Apache__Symbol_undef)
{
    dXSARGS;
    if (items != 1)
	croak("Usage: Apache::Symbol::undef(sv)");
    {
	SV *	sv = ST(0);

	undef(sv);
    }
    XSRETURN_EMPTY;
}

XS(XS_Apache__Symbol_sv_name)
{
    dXSARGS;
    if (items != 1)
	croak("Usage: Apache::Symbol::sv_name(sv)");
    {
	SV *	sv = ST(0);
	SV *	RETVAL;

	RETVAL = sv_name(sv);
	ST(0) = RETVAL;
	if (SvREFCNT(ST(0))) sv_2mortal(ST(0));
    }
    XSRETURN(1);
}

XS(XS_Apache__Symbol_cv_const_sv)
{
    dXSARGS;
    if (items != 1)
	croak("Usage: Apache::Symbol::cv_const_sv(sv)");
    {
	SV*	sv = ST(0);
#line 90 "Symbol.xs"
    CV *cv;
    GV *gv;
    HV *stash;

#line 124 "Symbol.c"
	SV *	RETVAL;
#line 96 "Symbol.xs"
    switch (SvTYPE(sv)) {
    default:
	if (!SvROK(sv)) {
	    char *sym;

	    if (SvGMAGICAL(sv)) {
		mg_get(sv);
		sym = SvPOKp(sv) ? SvPVX(sv) : Nullch;
	    }
	    else
		sym = SvPV(sv, na);
	    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);

#line 163 "Symbol.c"
	ST(0) = RETVAL;
	if (SvREFCNT(ST(0))) sv_2mortal(ST(0));
    }
    XSRETURN(1);
}

#ifdef __cplusplus
extern "C"
#endif
XS(boot_Apache__Symbol)
{
    dXSARGS;
    char* file = __FILE__;

    XS_VERSION_BOOTCHECK ;

        newXS("Apache::Symbol::undef", XS_Apache__Symbol_undef, file);
        newXS("Apache::Symbol::sv_name", XS_Apache__Symbol_sv_name, file);
        newXS("Apache::Symbol::cv_const_sv", XS_Apache__Symbol_cv_const_sv, file);
    ST(0) = &sv_yes;
    XSRETURN(1);
}
