summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-14 14:42:28 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-14 14:42:28 -0600
commite01629971f90067594163b89dbeae77329fe9b37 (patch)
tree67264267bb8988dda6e0cea53aa7a90a536f9dd1
parent4849f4fc9cc5e2c2a7034cc5851c7068b5309456 (diff)
downloadpackage-stash-xs-e01629971f90067594163b89dbeae77329fe9b37.tar.gz
package-stash-xs-e01629971f90067594163b89dbeae77329fe9b37.zip
actually, i only need stuff from PL_curcop here
-rw-r--r--.gitignore1
-rw-r--r--Stash.xs18
-rw-r--r--stolen_bits_of_padwalker.c82
3 files changed, 2 insertions, 99 deletions
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 */