X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FScope-Upper.git;a=blobdiff_plain;f=Upper.xs;h=a002eac9a3c976727316ee64f6b8c7f344020bb2;hp=928fdfd28295a098bdf1fc69cbcf065d787d70df;hb=6e6aa503ec0f8dc6f7c01ac956f57d34eb1f7eda;hpb=f5baf3c7bce8c08d6475fdcdb20fe23798f5cd8b diff --git a/Upper.xs b/Upper.xs index 928fdfd..a002eac 100644 --- a/Upper.xs +++ b/Upper.xs @@ -256,6 +256,10 @@ static U8 su_op_gimme_reverse(U8 gimme) { # define MY_CXT_CLONE NOOP #endif +/* --- Error messages ------------------------------------------------------ */ + +static const char su_stack_smash[] = "Cannot target a scope outside of the current stack"; + /* --- Unique context ID global storage ------------------------------------ */ /* ... Sequence ID counter ................................................. */ @@ -2586,6 +2590,8 @@ PPCODE: --cxix; cxix = su_context_skip_db(cxix); cxix = su_context_normalize_up(cxix); + } else { + warn(su_stack_smash); } EXTEND(SP, 1); mPUSHi(cxix); @@ -2642,8 +2648,10 @@ PPCODE: SU_GET_LEVEL(0, 0); cxix = su_context_here(); while (--level >= 0) { - if (cxix <= 0) + if (cxix <= 0) { + warn(su_stack_smash); break; + } --cxix; cxix = su_context_skip_db(cxix); cxix = su_context_normalize_up(cxix); @@ -2673,6 +2681,8 @@ PPCODE: } } done: + if (level >= 0) + warn(su_stack_smash); EXTEND(SP, 1); mPUSHi(cxix); XSRETURN(1);