From e01629971f90067594163b89dbeae77329fe9b37 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 14 Nov 2010 14:42:28 -0600 Subject: actually, i only need stuff from PL_curcop here --- .gitignore | 1 - Stash.xs | 18 ++-------- stolen_bits_of_padwalker.c | 82 ---------------------------------------------- 3 files changed, 2 insertions(+), 99 deletions(-) delete mode 100644 stolen_bits_of_padwalker.c diff --git a/.gitignore b/.gitignore index b168bbb..92100a6 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,4 @@ MANIFEST.bak Package-Stash-* *.bs *.c -!stolen_bits_of_padwalker.c *.o diff --git a/Stash.xs b/Stash.xs index e652ad1..5124997 100644 --- a/Stash.xs +++ b/Stash.xs @@ -80,12 +80,6 @@ GvIOp(g) = (IO*)(v); \ } while (0) -/* XXX: the core implementation of caller() is private, so we need a - * a reimplementation. luckily, padwalker already has done this. rafl says - * that there should be a public interface in 5.14, so maybe look into - * converting to use that at some point */ -#include "stolen_bits_of_padwalker.c" - typedef enum { VAR_NONE = 0, VAR_SCALAR, @@ -454,18 +448,10 @@ add_symbol(self, variable, initial=NULL, ...) } if (!filename || first_line_num == -1) { - I32 cxix_from, cxix_to; - PERL_CONTEXT *cx, *ccstack; - COP *cop = NULL; - - cx = upcontext(0, &cop, &ccstack, &cxix_from, &cxix_to); - if (!cop) - cop = PL_curcop; - if (!filename) - filename = CopFILE(cop); + filename = CopFILE(PL_curcop); if (first_line_num == -1) - first_line_num = cop->cop_line; + first_line_num = PL_curcop->cop_line; } if (last_line_num == -1) diff --git a/stolen_bits_of_padwalker.c b/stolen_bits_of_padwalker.c deleted file mode 100644 index 0f8d2ea..0000000 --- a/stolen_bits_of_padwalker.c +++ /dev/null @@ -1,82 +0,0 @@ -/* For development testing */ -#ifdef PACKAGE_STASH_DEBUGGING -# define debug_print(x) printf x -#else -# define debug_print(x) -#endif - -/* Originally stolen from pp_ctl.c; now significantly different */ - -I32 -dopoptosub_at(pTHX_ PERL_CONTEXT *cxstk, I32 startingblock) -{ - dTHR; - I32 i; - PERL_CONTEXT *cx; - for (i = startingblock; i >= 0; i--) { - cx = &cxstk[i]; - switch (CxTYPE(cx)) { - default: - continue; - case CXt_SUB: - /* In Perl 5.005, formats just used CXt_SUB */ -#ifdef CXt_FORMAT - case CXt_FORMAT: -#endif - debug_print(("**dopoptosub_at: found sub #%ld\n", (long)i)); - return i; - } - } - debug_print(("**dopoptosub_at: not found #%ld\n", (long)i)); - return i; -} - -I32 -dopoptosub(pTHX_ I32 startingblock) -{ - dTHR; - return dopoptosub_at(aTHX_ cxstack, startingblock); -} - -/* This function is based on the code of pp_caller */ -PERL_CONTEXT* -upcontext(pTHX_ I32 count, COP **cop_p, PERL_CONTEXT **ccstack_p, - I32 *cxix_from_p, I32 *cxix_to_p) -{ - PERL_SI *top_si = PL_curstackinfo; - I32 cxix = dopoptosub(aTHX_ cxstack_ix); - PERL_CONTEXT *ccstack = cxstack; - - if (cxix_from_p) *cxix_from_p = cxstack_ix+1; - if (cxix_to_p) *cxix_to_p = cxix; - for (;;) { - /* we may be in a higher stacklevel, so dig down deeper */ - while (cxix < 0 && top_si->si_type != PERLSI_MAIN) { - top_si = top_si->si_prev; - ccstack = top_si->si_cxstack; - cxix = dopoptosub_at(aTHX_ ccstack, top_si->si_cxix); - if (cxix_to_p && cxix_from_p) *cxix_from_p = *cxix_to_p; - if (cxix_to_p) *cxix_to_p = cxix; - } - if (cxix < 0 && count == 0) { - if (ccstack_p) *ccstack_p = ccstack; - return (PERL_CONTEXT *)0; - } - else if (cxix < 0) - return (PERL_CONTEXT *)-1; - if (PL_DBsub && cxix >= 0 && - ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) - count++; - if (!count--) - break; - - if (cop_p) *cop_p = ccstack[cxix].blk_oldcop; - cxix = dopoptosub_at(aTHX_ ccstack, cxix - 1); - if (cxix_to_p && cxix_from_p) *cxix_from_p = *cxix_to_p; - if (cxix_to_p) *cxix_to_p = cxix; - } - if (ccstack_p) *ccstack_p = ccstack; - return &ccstack[cxix]; -} - -/* end thievery */ -- cgit v1.2.3-54-g00ecf