/*
 * This file was generated automatically by ExtUtils::ParseXS version 2.18 from the
 * contents of Scope.xs. Do not edit this file, edit Scope.xs instead.
 *
 *	ANY CHANGES MADE HERE WILL BE LOST! 
 *
 */

#line 1 "Scope.xs"
/* Copyright (c) 1997-2006			 -*- C -*-
   Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
   http://www.math.tu-berlin.de/polymake,  mailto:polymake@math.tu-berlin.de

   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 2, or (at your option) any
   later version: http://www.gnu.org/licenses/gpl.txt.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
*/

#ident "$Project: polymake $$Id: Scope.xs 6949 2006-02-06 16:29:16Z gawrilow $"

#include "Ext.h"

CV *avoid_db_sub=0;

static
void localize_marker(pTHX_ void *p)
{
   if (PL_in_eval & ~(EVAL_INREQUIRE))	/* functionality of $^S less the lex test */
      croak("Scope::end missing");
}

typedef struct local_var_ptrs {
   SV *var;
   void *orig_any;
   SV *temp_owner;
} local_var_ptrs;

static
local_var_ptrs* do_local_var(SV *var, SV *value)
{
   local_var_ptrs *ptrs;
   New(0, ptrs, 1, local_var_ptrs);
   ptrs->var=var;
   ptrs->orig_any=SvANY(var);
   SvANY(var)=SvANY(value);
   ptrs->temp_owner=value;
   SvREFCNT_inc(var);
   SvREFCNT_inc(value);
   return ptrs;
}

static
void undo_local_var(pTHX_ void *p)
{
   local_var_ptrs *ptrs=(local_var_ptrs*)p;
   SvANY(ptrs->var)=ptrs->orig_any;
   SvREFCNT_dec(ptrs->var);
   SvREFCNT_dec(ptrs->temp_owner);
   Safefree(p);
}

typedef struct local_scalar_ptrs {
   SV *var;
   SV orig;
} local_scalar_ptrs;

static
local_scalar_ptrs* do_local_scalar(SV *var, SV *value)
{
   local_scalar_ptrs *ptrs;
   New(0, ptrs, 1, local_scalar_ptrs);
   ptrs->var=var;
   ptrs->orig.sv_any=var->sv_any;
   ptrs->orig.sv_refcnt=var->sv_refcnt;
   ptrs->orig.sv_flags=var->sv_flags;
   var->sv_any=0;
   var->sv_flags=0;
   var->sv_refcnt=1;
   sv_setsv(var,value);
   return ptrs;
}

static
void undo_local_scalar(pTHX_ void *p)
{
   local_scalar_ptrs *ptrs=(local_scalar_ptrs*)p;
   if (SvREFCNT(ptrs->var)>1) {
      SvREFCNT_dec(ptrs->var);
   } else {
      SvREFCNT(ptrs->var)=0;  sv_clear(ptrs->var);
   }
   ptrs->var->sv_any=ptrs->orig.sv_any;
   ptrs->var->sv_refcnt=ptrs->orig.sv_refcnt;
   ptrs->var->sv_flags=ptrs->orig.sv_flags;
   Safefree(p);
}

typedef struct local_incr_ptrs {
   SV *var;
   I32 incr;
} local_incr_ptrs; 

static
local_incr_ptrs* do_local_incr(SV *var, I32 incr)
{
   local_incr_ptrs *ptrs;
   New(0, ptrs, 1, local_incr_ptrs);
   ptrs->var=var;
   ptrs->incr=incr;
   if (SvIOK(var) || SvPOK(var))
      sv_setiv(var, SvIV(var)+incr);
   else if (SvNOK(var))
      sv_setnv(var, SvNVX(var)+incr);
   else
      sv_setiv(var,incr);
   return ptrs;
}

static
void undo_local_incr(pTHX_ void *p)
{
   local_incr_ptrs *ptrs=(local_incr_ptrs*)p;
   SV *var=ptrs->var;
   if (SvIOK(var))
      sv_setiv(var, SvIVX(var)-ptrs->incr);
   else if (SvNOK(ptrs->var))
      sv_setnv(var, SvNVX(var)-ptrs->incr);
   else
      Safefree(p), croak("undoing local increment: variable is no more numerical");
   Safefree(p);
}

static
local_incr_ptrs* do_local_push(pTHX_ SV *av, SV **src, int n, int side)
{
   local_incr_ptrs *ptrs;
   SV **dst, **src_end;
   New(0, ptrs, 1, local_incr_ptrs);
   ptrs->var=av;
   ptrs->incr=side*n;
   av_extend((AV*)av, AvFILLp(av)+n);
   if (side<0) {
      dst=AvARRAY(av);
      Move(dst, dst+n, AvFILLp(av)+1, SV*);
   } else {
      dst=AvARRAY(av)+AvFILLp(av)+1;
   }
   for (src_end=src+n; src<src_end; ++src, ++dst) {
      SV *d=*src;
      if (SvREADONLY(d) || !SvTEMP(d))
	 *dst=newSVsv(d);
      else
	 *dst=SvREFCNT_inc(d);
   }
   AvFILLp(av)+=n;
   return ptrs;
}

static
void undo_local_push(pTHX_ void *p)
{
   local_incr_ptrs *ptrs=(local_incr_ptrs*)p;
   SV *av=ptrs->var;
   I32 n=ptrs->incr;
   SV **e, **eend;
   if (n>0) {
      for (e=AvARRAY(av)+AvFILLp(av), eend=e-n; e>eend; --e) {
	 SvREFCNT_dec(*e);
	 *e=&PL_sv_undef;
      }
      AvFILLp(av)-=n;
   } else {
      for (eend=AvARRAY(av)-1, e=eend-n; e>eend; --e)
	 SvREFCNT_dec(*e);
      AvFILLp(av)+=n;
      ++eend;
      Move(eend-n, eend, AvFILLp(av)+1, SV*);
      for (e=eend+AvFILLp(av)+1, eend=e-n; e<eend; ++e)
	 *e=&PL_sv_undef;
   }
   Safefree(p);
}

#ifndef PERL_UNUSED_VAR
#  define PERL_UNUSED_VAR(var) if (0) var = var
#endif

#line 195 "Scope.c"

XS(XS_Poly__Scope_begin_locals); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly__Scope_begin_locals)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::Scope::begin_locals", "scope");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	scope =SvRV(ST(0));
#line 187 "Scope.xs"
LEAVE;
{
   save_destructor_x(&localize_marker, scope);
}
ENTER;
#line 216 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly__Scope_end_locals); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly__Scope_end_locals)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::Scope::end_locals", "scope");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	scope =SvRV(ST(0));
#line 197 "Scope.xs"
LEAVE;
{
   ANY *mainstack=PL_savestack;
   I32 frame_top=PL_savestack_ix, frame_bottom=PL_scopestack[PL_scopestack_ix-1], f, to_save;

   /* find the marker or resign */
   for (f=frame_top-3; f >= frame_bottom; --f)
      if (mainstack[f].any_ptr == (void*)&localize_marker
	  && f+2 < frame_top
	  && mainstack[f+2].any_i32 == SAVEt_DESTRUCTOR_X) {

	 if (scope != (SV*)mainstack[f+1].any_ptr) break;

	 to_save=frame_top-(f+3);
	 if (to_save > 0) {
	    SV *marker=*av_fetch((AV*)scope, 0, 0);
	    sv_catpvn(marker, (char*)&(mainstack[f+3]), to_save*sizeof(ANY));
	    PL_savestack_ix=f;	/* pop the marker and the saved locals quickly */
	 }
	    scope=0;
	    break;
      }
   if (scope)
      croak("Scope: begin-end mismatch");
}
ENTER;
#line 262 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly__Scope_unwind); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly__Scope_unwind)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::Scope::unwind", "marker");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	marker =ST(0);
#line 228 "Scope.xs"
{
   I32 saved=SvCUR(marker)/sizeof(ANY);
   if (saved) {
      LEAVE;
      SSCHECK(saved);
      Copy(SvPVX(marker), &(PL_savestack[PL_savestack_ix]), saved, ANY);
      PL_savestack_ix+=saved;
      ENTER;
   }
}
#line 292 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_scalar); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_scalar)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 2)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_scalar", "var, value");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	var = ST(0);
	SV *	value = ST(1);
#line 247 "Scope.xs"
{
   if ( (isGV(var) ? !(var=GvSV(var))
	           : SvTYPE(var) >= SVt_PVAV) ||
	SvTYPE(value) >= SVt_PVAV )
      croak("usage: local_scalar(*glob || $var, value)");
   LEAVE;
   save_destructor_x(&undo_local_scalar, do_local_scalar(var, value));
   ENTER;
}
#line 322 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_array); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_array)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 2)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_array", "var, value");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	var = ST(0);
	SV *	value = ST(1);
#line 263 "Scope.xs"
{
   if ( (isGV(var) ? !(var=(SV*)GvAV(var))
                   : !SvROK(var) || (var=SvRV(var), SvTYPE(var) != SVt_PVAV)) ||
	(!SvROK(value) || (value=SvRV(value), SvTYPE(value) != SVt_PVAV)) )
      croak("usage: local_array(*glob || \\@array, [ value ])");
   LEAVE;
   save_destructor_x(&undo_local_var, do_local_var(var, value));
   ENTER;
}
#line 352 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_hash); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_hash)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 2)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_hash", "var, value");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	var = ST(0);
	SV *	value = ST(1);
#line 279 "Scope.xs"
{
   if ( (isGV(var) ? !(var=(SV*)GvHV(var))
	           : !SvROK(var) || (var=SvRV(var), SvTYPE(var) != SVt_PVHV)) ||
	(!SvROK(value) || (value=SvRV(value), SvTYPE(value) != SVt_PVHV)) )
      croak("usage: local_hash(*glob || \\%hash, { value })");
   LEAVE;
   save_destructor_x(&undo_local_var, do_local_var(var, value));
   ENTER;
}
#line 382 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_sub); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_sub)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 2)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_sub", "var, value");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	var = ST(0);
	SV *	value =ST(1);
#line 295 "Scope.xs"
{
   if ( (isGV(var) ? !(var=(SV*)GvCV(var))
	           : !SvROK(var) || (var=SvRV(var), SvTYPE(var) != SVt_PVCV)) ||
	(!SvROK(value) || (value=SvRV(value), SvTYPE(value) != SVt_PVCV)) )
      croak("usage: local_sub(*glob || \\&sub, sub { ... })");
   LEAVE;
   save_destructor_x(&undo_local_var, do_local_var(var, value));
   ENTER;
}
#line 412 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_incr); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_incr)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items < 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_incr", "var, ...");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	var = ST(0);
#line 310 "Scope.xs"
{
   SV *incr= items==2 ? ST(1) : 0;
   if ( items>2 ||
	(isGV(var) ? !(var=GvSV(var))
	           : SvTYPE(var) >= SVt_PVAV) ||
	(incr && SvTYPE(incr) >= SVt_PVAV) )
      croak("usage: local_incr(*glob || $var, incr(=1))");
   LEAVE;
   save_destructor_x(&undo_local_incr, do_local_incr(var, incr ? SvIV(incr) : 1));
   ENTER;
}
#line 443 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_push); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_push)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items < 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_push", "avref, ...");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	avref = ST(0);
#line 327 "Scope.xs"
{
   SV *av=0;
   if (isGV(avref)
       ? !(av=(SV*)GvAV(avref))
       : !SvROK(avref) || (av=SvRV(avref), SvTYPE(av) != SVt_PVAV || SvMAGICAL(av)))
      croak("usage: local_push(\\@array, data ...");
   if (items>=2) {
      LEAVE;
      save_destructor_x(&undo_local_push, do_local_push(aTHX_ av, &ST(1), items-1, 1));
      ENTER;
   }
}
#line 475 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_local_unshift); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_local_unshift)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items < 1)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::local_unshift", "avref, ...");
    PERL_UNUSED_VAR(cv); /* -W */
    {
	SV *	avref = ST(0);
#line 345 "Scope.xs"
{
   SV *av=0;
   if (isGV(avref)
       ? !(av=(SV*)GvAV(avref))
       : !SvROK(avref) || (av=SvRV(avref), SvTYPE(av) != SVt_PVAV || SvMAGICAL(av)))
      croak("usage: local_unshift(\\@array, data ...");
   if (items>=2) {
      LEAVE;
      save_destructor_x(&undo_local_push, do_local_push(aTHX_ av, &ST(1), items-1, -1));
      ENTER;
   }
}
#line 507 "Scope.c"
    }
    XSRETURN_EMPTY;
}


XS(XS_Poly_propagate_match); /* prototype to pass -Wmissing-prototypes */
XS(XS_Poly_propagate_match)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    if (items != 0)
       Perl_croak(aTHX_ "Usage: %s(%s)", "Poly::propagate_match", "");
    PERL_UNUSED_VAR(cv); /* -W */
    PERL_UNUSED_VAR(ax); /* -Wall */
    SP -= items;
    {
#line 361 "Scope.xs"
{
   PERL_CONTEXT *cx_bottom=cxstack, *cx=cx_bottom+cxstack_ix;
   while (cx >= cx_bottom) {
      if (CxTYPE(cx) == CXt_SUB) {
	 cx->blk_oldpm=PL_curpm;
	 if (!avoid_db_sub || cx->blk_sub.cv == avoid_db_sub)
	    break;
      }
      --cx;
   }
}
#line 539 "Scope.c"
	PUTBACK;
	return;
    }
}

#ifdef __cplusplus
extern "C"
#endif
XS(boot_Poly__Scope); /* prototype to pass -Wmissing-prototypes */
XS(boot_Poly__Scope)
{
#ifdef dVAR
    dVAR; dXSARGS;
#else
    dXSARGS;
#endif
    char* file = __FILE__;

    PERL_UNUSED_VAR(cv); /* -W */
    PERL_UNUSED_VAR(items); /* -W */
    XS_VERSION_BOOTCHECK ;

        newXS("Poly::Scope::begin_locals", XS_Poly__Scope_begin_locals, file);
        newXS("Poly::Scope::end_locals", XS_Poly__Scope_end_locals, file);
        newXS("Poly::Scope::unwind", XS_Poly__Scope_unwind, file);
        newXSproto("Poly::local_scalar", XS_Poly_local_scalar, file, "$$");
        newXSproto("Poly::local_array", XS_Poly_local_array, file, "$$");
        newXSproto("Poly::local_hash", XS_Poly_local_hash, file, "$$");
        newXSproto("Poly::local_sub", XS_Poly_local_sub, file, "$$");
        newXSproto("Poly::local_incr", XS_Poly_local_incr, file, "$;$");
        newXSproto("Poly::local_push", XS_Poly_local_push, file, "$@");
        newXSproto("Poly::local_unshift", XS_Poly_local_unshift, file, "$@");
        newXS("Poly::propagate_match", XS_Poly_propagate_match, file);

    /* Initialisation Section */

#line 374 "Scope.xs"
if (PL_DBgv) {
   CvNODEBUG_on(get_cv("Poly::Scope::begin_locals", FALSE));
   CvNODEBUG_on(get_cv("Poly::Scope::end_locals", FALSE));
   CvNODEBUG_on(get_cv("Poly::Scope::unwind", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_scalar", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_array", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_hash", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_incr", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_push", FALSE));
   CvNODEBUG_on(get_cv("Poly::local_unshift", FALSE));
   CvNODEBUG_on(get_cv("Poly::propagate_match", FALSE));
   avoid_db_sub=GvCV(PL_DBsub);
}

#line 591 "Scope.c"

    /* End of Initialisation Section */

    XSRETURN_YES;
}



syntax highlighted by Code2HTML, v. 0.9.1