On Wed, Aug 08, 2007 at 02:13:40PM +0100, Tim Bunce wrote:
On Thu, May 03, 2007 at 10:50:07AM -0700, Artur Bergman wrote:
Ah, I missunderstood, you want to find the start of the perl level
scope that access your XS?
Yes. Specifically the first cop in the block, to get the line number.
loop is a block/scope :) but I guess you can just walk down the
cxstack until you find the type you want
CxTYPE == CXt_SUB and CXt_BLOCK
The context struct is focussed on restoring state when the context is exited.
So I can get the op that the context will return to (cx_u.cx_blk.blku_oldcop)
but not the first op that was executed in the context. Right?
If so, does anyone have any ideas?
I may need to track the line numbers myself in the DB_sub, but that'll
probaby need a stack mechanism and careful logic to note changes in
cxstack_ix and PL_curstackinfo. Not very appealing.
Hypothesizing...
If I find the closest enclosing context is a sub, can I use
cx->blk_sub.cv->xcv_start?
If I find the closest enclosing context is an eval, can I use
PL_eval_root or cx->blk_eval.old_eval_root, or cx->blk_eval.cv->xcv_start?
(which?)
If I find the closest enclosing context is a loop, can I use
cx->blk_loop.redo_op?
I can't see a way to identify the first line of an ordinary block (the
scope stack doesn't have enough info) but I can live without that if can
get get line numbers for loops.
Tim.