Parse-Perl

 view release on metacpan or  search on metacpan

lib/Parse/Perl.xs  view on Meta::CPAN

#define PERL_NO_GET_CONTEXT 1
#include "EXTERN.h"
#include "perl.h"
#include "callchecker0.h"
#include "XSUB.h"

#define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
#define PERL_DECIMAL_VERSION \
	PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
#define PERL_VERSION_GE(r,v,s) \
	(PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))

#define QHAVE_UNITCHECK PERL_VERSION_GE(5,9,5)

#define QHAVE_WARNINGS_AS_SV (!PERL_VERSION_GE(5,9,4))
#if QHAVE_WARNINGS_AS_SV
# define WARNINGS_t SV
#else /* !QHAVE_WARNINGS_AS_SV */
# define WARNINGS_t STRLEN
#endif /* !QHAVE_WARNINGS_AS_SV */

#define QLEX_START_LINE_IS_SAFE PERL_VERSION_GE(5,13,7)
#define QHAVE_PARSE_STMTSEQ PERL_VERSION_GE(5,13,6)
#define QHAVE_COP_LABEL (!PERL_VERSION_GE(5,11,0))
#define QHAVE_COP_HINTS PERL_VERSION_GE(5,9,4)
#define QHAVE_COP_HINTS_HASH PERL_VERSION_GE(5,9,4)
#define QHAVE_COP_ARYBASE (!PERL_VERSION_GE(5,9,4))
#define QHAVE_COP_IO (!PERL_VERSION_GE(5,9,4) && PERL_VERSION_GE(5,8,0))

#ifndef COP_SEQ_RANGE_LOW
# if PERL_VERSION_GE(5,9,5)
#  define COP_SEQ_RANGE_LOW(sv) ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xlow
#  define COP_SEQ_RANGE_HIGH(sv) ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xhigh
# else /* <5.9.5 */
#  define COP_SEQ_RANGE_LOW(sv) ((U32)SvNVX(sv))
#  define COP_SEQ_RANGE_HIGH(sv) ((U32)SvIVX(sv))
# endif /* <5.9.5 */
#endif /* !COP_SEQ_RANGE_LOW */

#if PERL_VERSION_GE(5,8,9) && !PERL_VERSION_GE(5,9,0)
/* there is a bogus definition, not actually used */
# undef PARENT_PAD_INDEX
#endif

#ifndef PARENT_PAD_INDEX
# if PERL_VERSION_GE(5,9,5)
#  define PARENT_PAD_INDEX(sv) ((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xlow
#  define PARENT_FAKELEX_FLAGS(sv) \
	((XPVNV*)SvANY(sv))->xnv_u.xpad_cop_seq.xhigh
# elif PERL_VERSION_GE(5,9,0)
#  define PARENT_PAD_INDEX(sv) ((U32)SvNVX(sv))
#  define PARENT_FAKELEX_FLAGS(sv) ((U32)SvIVX(sv))
# endif /* >=5.9.0 */
#endif /* !PARENT_PAD_INDEX */

#ifndef pad_findmy_sv
# if PERL_VERSION_GE(5,11,2)
#  define pad_findmy_sv(sv, flags) pad_findmy(SvPVX(sv), SvCUR(sv), flags)
# else /* <5.11.2 */
#  define pad_findmy_sv(sv, flags) pad_findmy(SvPVX(sv))
# endif /* <5.11.2 */
#endif /* !pad_findmy_sv */

#ifndef newSV_type
# define newSV_type(type) THX_newSV_type(aTHX_ type)
static SV *THX_newSV_type(pTHX_ svtype type)
{
	SV *sv = newSV(0);
	(void) SvUPGRADE(sv, type);
	return sv;
}
#endif /* !newSV_type */

lib/Parse/Perl.xs  view on Meta::CPAN

	SAVECOMPILEWARNINGS();
#endif /* !QHAVE_WARNINGS_AS_SV */
	PL_compiling.cop_warnings =
		warnings_from_sv(safe_av_fetch(enva, ENV_WARNINGS));
#if QHAVE_WARNINGS_AS_SV
	if(!specialWARN(PL_compiling.cop_warnings))
		SAVEFREESV(PL_compiling.cop_warnings);
#endif /* QHAVE_WARNINGS_AS_SV */
#if QHAVE_COP_ARYBASE
	SAVEI32(PL_compiling.cop_arybase);
	PL_compiling.cop_arybase =
		iv_from_sv(safe_av_fetch(enva, ENV_ARYBASE));
#endif /* QHAVE_COP_ARYBASE */
#if QHAVE_COP_IO
	SAVESPTR(PL_compiling.cop_io);
	PL_compiling.cop_io = iohint_from_sv(safe_av_fetch(enva, ENV_IOHINT));
	if(PL_compiling.cop_io) SAVEFREESV(PL_compiling.cop_io);
#endif /* QHAVE_COP_IO */
	PL_hints |= HINT_LOCALIZE_HH;
	SAVEHINTS();
	PL_hints = uv_from_sv(safe_av_fetch(enva, ENV_HINTBITS)) |
		HINT_BLOCK_SCOPE;
	{
		HV *old_hh = GvHV(PL_hintgv);
		GvHV(PL_hintgv) =
			hinthash_from_sv(safe_av_fetch(enva, ENV_HINTHASH));
		if(old_hh) SvREFCNT_dec(old_hh);
	}
#if QHAVE_COP_HINTS_HASH
	{
		COPHH *old_cophh = CopHINTHASH_get(&PL_compiling);
		CopHINTHASH_set(&PL_compiling,
			cophh_from_sv(safe_av_fetch(enva, ENV_COPHINTHASH)));
		cophh_free(old_cophh);
	}
#endif /* QHAVE_COP_HINTS_HASH */
#if QHAVE_COP_HINTS
	SAVEI32(PL_compiling.cop_hints);
	PL_compiling.cop_hints = PL_hints;
#endif /* QHAVE_COP_HINTS */
#if QHAVE_COP_LABEL
	SAVEPPTR(PL_compiling.cop_label);
	PL_compiling.cop_label = NULL;
#endif /* QHAVE_COP_LABEL */
	SAVEVPTR(PL_curcop);
	PL_curcop = &PL_compiling;
	/* initialise PL_compcv and related state */
	SAVEGENERICSV(PL_compcv);
	PL_compcv = (CV*)newSV_type(SVt_PVCV);
	CvANON_on(PL_compcv);
	CvOUTSIDE(PL_compcv) =
		function_from_sv(safe_av_fetch(enva, ENV_OUTSIDECV));
	CvOUTSIDE_SEQ(PL_compcv) =
		uv_from_sv(safe_av_fetch(enva, ENV_OUTSIDESEQ));
	CvPADLIST(PL_compcv) = pad_new(padnew_SAVE);
	/* initialise other parser state */
	SAVEOP();
	PL_op = NULL;
	SAVEGENERICSV(PL_beginav);
	PL_beginav = newAV();
#if QHAVE_UNITCHECK
	SAVEGENERICSV(PL_unitcheckav);
	PL_unitcheckav = newAV();
#endif /* QHAVE_UNITCHECK */
	/* parse */
#if !QLEX_START_LINE_IS_SAFE
	source = sv_mortalcopy(source);
#endif /* !QLEX_START_LINE_IS_SAFE */
	lex_start_simple(source);
	parse_file_as_sub_body(
		array_from_sv(safe_av_fetch(enva, ENV_OUTSIDEPAD)));
	lex_end();
	if(PL_error_count) {
		if(!(SvPOK(ERRSV) && SvCUR(ERRSV) != 0))
			sv_setpvs(ERRSV, "Compilation error");
		Perl_die(aTHX_ NULL);
	}
	/* finalise */
#if QHAVE_UNITCHECK
	if(PL_unitcheckav) call_list(PL_scopestack_ix, PL_unitcheckav);
#endif /* QHAVE_UNITCHECK */
	RETVAL = (CV*)SvREFCNT_inc((SV*)PL_compcv);
	FREETMPS;
	LEAVE;
OUTPUT:
	RETVAL

MODULE = Parse::Perl PACKAGE = Parse::Perl::CopHintsHash

void
DESTROY(SV *sv)
PREINIT:
#if QHAVE_COP_HINTS_HASH
	SV *usv;
	COPHH *cophh;
#endif /* QHAVE_COP_HINTS_HASH */
CODE:
#if QHAVE_COP_HINTS_HASH
	if(sv_is_undef(sv)) {
		cophh = NULL;
	} else if(SvROK(sv) && (usv = SvRV(sv), 1) &&
			SvOBJECT(usv) && SvSTASH(usv) == stash_cophh &&
			SvIOK(usv)) {
		cophh = (COPHH *)SvUV(usv);
	} else {
		croak("malformed cop_hints_hash");
	}
	cophh_free(cophh);
#else /* !QHAVE_COP_HINTS_HASH */
	PERL_UNUSED_VAR(sv);
#endif /* !QHAVE_COP_HINTS_HASH */



( run in 1.415 second using v1.01-cache-2.11-cpan-ceb78f64989 )