Sub-StopCalls
view release on metacpan or search on metacpan
StopCalls.xs view on Meta::CPAN
}
}
void
array_case(pTHX_ call_info* info, SV** stack, I32 items) {
int i;
OP *fop = NULL, *pop = NULL, *op = NULL;
if ( items == 0 )
return void_case(aTHX_ info);
for( i = 0; i < items; i++ ) {
pop = op;
op = newSVOP( OP_CONST, 0, newSVsv(*(stack+i+1)) );
if (!fop) fop = op;
if (pop)
pop->op_sibling = pop->op_next = op;
}
op->op_next = info->enter->op_next;
op->op_sibling = info->enter->op_sibling;
if ( info->sibling ) {
info->sibling->op_sibling = fop;
}
else {
cUNOPx(info->parent)->op_first = fop;
}
for( i = 0; i < info->prev->length; i++ ) {
info->prev->ops[i]->op_next = fop;
}
}
static void
stop(pTHX_ SV** stack, I32 items)
{
call_info info = caller_info(aTHX);
if (!info.cx) return;
switch( info.cx->blk_gimme ) {
case G_ARRAY:
array_case( aTHX_ &info, stack, items );
break;
case G_SCALAR:
scalar_case( aTHX_ &info, stack, items );
break;
case G_VOID:
void_case( aTHX_ &info );
}
free(info.targets);
free(info.prev);
}
MODULE = Sub::StopCalls PACKAGE = Sub::StopCalls
PROTOTYPES: DISABLE
void
stop(...)
PPCODE:
stop(aTHX_ SP, items);
if ( GIMME_V == G_SCALAR && items > 1 )
mPUSHi(items);
else
SP += items;
( run in 0.499 second using v1.01-cache-2.11-cpan-5511b514fd6 )