c - How do I turn the Perl stack into an AV? -
c - How do I turn the Perl stack into an AV? -
note: question perl internals, c code itself.
i want pass contents of perl stack (ie. sp) array perl function.
is there existing way re-create stack av? if not, how 1 accomplish it? array can read-only. how 1 turn av reference?
found crib looking in pp_anonlist in pp.c
dvar; dsp; dmark; const i32 items = sp - mark; sv * const args = mutable_sv(av_make(items, mark+1)); spagain; mxpushs(newrv_noinc(args));
it took me great number of tries before settled on this:
#define numargs (sp - (pl_stack_base + topmark)) av * perl_get_args(pthx) { dsp; av * args; args = av_make(numargs, sp - numargs + 1); homecoming args; }
this similar pp_anonlist, not quite. dmark expands sv **mark = pl_stack_base + (*pl_markstack_ptr--)
. mark used extensively sick defined in documentation. because dmark modifies state of stack, unusable in function should have no side effects. topmark *pl_markstack_ptr, no decrement. numargs sp - mark
without side effect.
sp points @ top of stack, av_make() works on lists. it's necessary pass in sp - numargs
ensure av_make() can read 2 items off stack. why necessary add together one, i'm not sure.
c perl xs
Comments
Post a Comment