summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2006-02-20 19:00:22 +0000
committerNicholas Clark <nick@ccl4.org>2006-02-20 19:00:22 +0000
commitc84c465283025c72dfa40558418521b8e42b7290 (patch)
tree285b0b56947449f80159279646c736c3aebb484f
parent5316d14db4aade2e88cbb15cc065195245c0ec51 (diff)
downloadperl-c84c465283025c72dfa40558418521b8e42b7290.tar.gz
PVCVs don't need XNVs either.
(And actually remove xcv_depth) (And fix the copy lengths in bodies_by_type) p4raw-id: //depot/perl@27249
-rw-r--r--cv.h32
-rw-r--r--dump.c2
-rw-r--r--ext/B/B/Bytecode.pm4
-rw-r--r--ext/Devel/Peek/t/Peek.t9
-rw-r--r--sv.c12
5 files changed, 48 insertions, 11 deletions
diff --git a/cv.h b/cv.h
index 224ac2ce44..873cecd336 100644
--- a/cv.h
+++ b/cv.h
@@ -34,7 +34,6 @@ struct xpvcv {
} xcv_root_u;
GV * xcv_gv;
char * xcv_file;
- long xcv_depth;
PADLIST * xcv_padlist;
CV * xcv_outside;
U32 xcv_outside_seq; /* the COP sequence (at the point of our
@@ -43,6 +42,37 @@ struct xpvcv {
cv_flags_t xcv_flags;
};
+typedef struct {
+ STRLEN xpv_cur; /* length of xp_pv as a C string */
+ STRLEN xpv_len; /* allocated size */
+ union {
+ IV xivu_iv;
+ UV xivu_uv;
+ void * xivu_p1;
+ I32 xivu_i32; /* depth, >= 2 indicates recursive call */
+ } xiv_u;
+ MAGIC* xmg_magic; /* magic for scalar array */
+ HV* xmg_stash; /* class package */
+
+ HV * xcv_stash;
+ union {
+ OP * xcv_start;
+ ANY xcv_xsubany;
+ } xcv_start_u;
+ union {
+ OP * xcv_root;
+ void (*xcv_xsub) (pTHX_ CV*);
+ } xcv_root_u;
+ GV * xcv_gv;
+ char * xcv_file;
+ PADLIST * xcv_padlist;
+ CV * xcv_outside;
+ U32 xcv_outside_seq; /* the COP sequence (at the point of our
+ * compilation) in the lexically enclosing
+ * sub */
+ cv_flags_t xcv_flags;
+} xpvcv_allocated;
+
/*
=head1 Handy Values
diff --git a/dump.c b/dump.c
index 3779d45b34..30571101d9 100644
--- a/dump.c
+++ b/dump.c
@@ -1304,7 +1304,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
PerlIO_putc(file, '\n');
}
if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV
- && type != SVt_PVFM)
+ && type != SVt_PVCV && type != SVt_PVFM)
|| type == SVt_NV) {
STORE_NUMERIC_LOCAL_SET_STANDARD();
/* %Vg doesn't work? --jhi */
diff --git a/ext/B/B/Bytecode.pm b/ext/B/B/Bytecode.pm
index 4497d445ff..6a30111179 100644
--- a/ext/B/B/Bytecode.pm
+++ b/ext/B/B/Bytecode.pm
@@ -257,7 +257,9 @@ sub B::PVNV::bsave {
# Likewise HVs have no NV slot actually allocated.
# I don't think that they can get here, but better safe than sorry
return if $sv->isa('B::HV');
- }
+ return if $sv->isa('B::CV');
+ return if $sv->isa('B::FM');
+ }
asm "xnv", sprintf "%.40g", $sv->NVX;
}
diff --git a/ext/Devel/Peek/t/Peek.t b/ext/Devel/Peek/t/Peek.t
index 3d5d683b07..8897329500 100644
--- a/ext/Devel/Peek/t/Peek.t
+++ b/ext/Devel/Peek/t/Peek.t
@@ -38,6 +38,9 @@ sub do_test {
$pattern =~ s/^ *\$ROOT *\n/
($] < 5.009) ? " ROOT = 0x0\n" : '';
/mge;
+ $pattern =~ s/^ *\$IVNV *\n/
+ ($] < 5.009) ? " IV = 0\n NV = 0\n" : '';
+ /mge;
@@ -218,7 +221,7 @@ do_test(13,
SV = PVCV\\($ADDR\\) at $ADDR
REFCNT = 2
FLAGS = \\(PADMY,POK,pPOK,ANON,WEAKOUTSIDE\\)
- NV = 0
+ $IVNV
PROTOTYPE = ""
COMP_STASH = $ADDR\\t"main"
START = $ADDR ===> \\d+
@@ -244,7 +247,7 @@ do_test(14,
SV = PVCV\\($ADDR\\) at $ADDR
REFCNT = (3|4)
FLAGS = \\(\\)
- NV = 0
+ $IVNV
COMP_STASH = $ADDR\\t"main"
START = $ADDR ===> \\d+
ROOT = $ADDR
@@ -489,7 +492,7 @@ do_test(23,
SV = PVCV\\($ADDR\\) at $ADDR
REFCNT = (2)
FLAGS = \\(POK,pPOK,CONST\\)
- NV = 0
+ $IVNV
PROTOTYPE = ""
COMP_STASH = 0x0
$ROOT
diff --git a/sv.c b/sv.c
index 4f7f35acae..f4e661cea9 100644
--- a/sv.c
+++ b/sv.c
@@ -969,15 +969,17 @@ static const struct body_details bodies_by_type[] = {
+ relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
TRUE, HADNV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
- /* 76 */
- { sizeof(XPVCV), sizeof(XPVCV), 0, TRUE, HADNV,
- HASARENA, FIT_ARENA(0, sizeof(XPVCV)) },
+ /* 56 */
+ { sizeof(xpvcv_allocated), sizeof(XPVCV)
+ - relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
+ + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
+ TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
{ sizeof(xpvfm_allocated),
- sizeof(xpvfm_allocated)
+ sizeof(XPVFM)
- relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
+ relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
- TRUE, HADNV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
+ TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
/* XPVIO is 84 bytes, fits 48x */
{ sizeof(XPVIO), sizeof(XPVIO), 0, TRUE, HADNV,