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 )