diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-10-27 16:27:27 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-10-29 15:28:08 +0100 |
commit | 9b1961beade0167df90ecc268327eb2a546a368a (patch) | |
tree | 288a0856f007e4882fed324f76cfcb8b024abd57 | |
parent | 85b6f04b7ee23e319b73a6a2f61aa9c4169557fe (diff) | |
download | perl-9b1961beade0167df90ecc268327eb2a546a368a.tar.gz |
Merge all B::OP::* accessors returning B::OP objects.
Use the ALIAS value to store the member's offset within the structure, and
perform explicit pointer arithmetic to read it. This reduces the object size
by about 5K on this platform.
-rw-r--r-- | ext/B/B.xs | 90 |
1 files changed, 36 insertions, 54 deletions
diff --git a/ext/B/B.xs b/ext/B/B.xs index c0c9a4a02b..d706829160 100644 --- a/ext/B/B.xs +++ b/ext/B/B.xs @@ -831,12 +831,25 @@ threadsv_names() # endif #endif -#define OP_next(o) o->op_next -#define OP_sibling(o) o->op_sibling #define OP_targ(o) o->op_targ #define OP_flags(o) o->op_flags #define OP_private(o) o->op_private +#define OP_next_offset offsetof(struct op, op_next) +#define OP_sibling_offset offsetof(struct op, op_sibling) +#define UNOP_first_offset offsetof(struct unop, op_first) +#define BINOP_last_offset offsetof(struct binop, op_last) +#define LOGOP_other_offset offsetof(struct logop, op_other) +#if PERL_VERSION >= 9 +# define PMOP_pmreplstart_offset \ + offsetof(struct pmop, op_pmstashstartu.op_pmreplstart) +#else +# define PMOP_pmreplstart_offset offsetof(struct pmop, op_pmreplstart) +#endif +#define LOOP_redoop_offset offsetof(struct loop, op_redoop) +#define LOOP_nextop_offset offsetof(struct loop, op_nextop) +#define LOOP_lastop_offset offsetof(struct loop, op_lastop) + MODULE = B PACKAGE = B::OP PREFIX = OP_ size_t @@ -847,13 +860,29 @@ OP_size(o) OUTPUT: RETVAL +# The type checking code in B has always been identical for all OP types, +# irrespective of whether the action is actually defined on that OP. +# We should fix this B::OP -OP_next(o) - B::OP o - -B::OP -OP_sibling(o) +next(o) B::OP o + ALIAS: + B::OP::next = OP_next_offset + B::OP::sibling = OP_sibling_offset + B::UNOP::first = UNOP_first_offset + B::BINOP::last = BINOP_last_offset + B::LOGOP::other = LOGOP_other_offset + B::PMOP::pmreplstart = PMOP_pmreplstart_offset + B::LOOP::redoop = LOOP_redoop_offset + B::LOOP::nextop = LOOP_nextop_offset + B::LOOP::lastop = LOOP_lastop_offset + PREINIT: + char *ptr; + CODE: + ptr = ix + (char *)o; + RETVAL = *((OP **)ptr); + OUTPUT: + RETVAL char * OP_name(o) @@ -938,30 +967,6 @@ OP_oplist(o) PPCODE: SP = oplist(aTHX_ o, SP); -#define UNOP_first(o) o->op_first - -MODULE = B PACKAGE = B::UNOP PREFIX = UNOP_ - -B::OP -UNOP_first(o) - B::UNOP o - -#define BINOP_last(o) o->op_last - -MODULE = B PACKAGE = B::BINOP PREFIX = BINOP_ - -B::OP -BINOP_last(o) - B::BINOP o - -#define LOGOP_other(o) o->op_other - -MODULE = B PACKAGE = B::LOGOP PREFIX = LOGOP_ - -B::OP -LOGOP_other(o) - B::LOGOP o - MODULE = B PACKAGE = B::LISTOP PREFIX = LISTOP_ U32 @@ -1035,10 +1040,6 @@ PMOP_pmreplroot(o) #endif -B::OP -PMOP_pmreplstart(o) - B::PMOP o - #if PERL_VERSION < 9 #define PMOP_pmnext(o) o->op_pmnext @@ -1163,25 +1164,6 @@ PVOP_pv(o) else ST(0) = newSVpvn_flags(o->op_pv, strlen(o->op_pv), SVs_TEMP); -#define LOOP_redoop(o) o->op_redoop -#define LOOP_nextop(o) o->op_nextop -#define LOOP_lastop(o) o->op_lastop - -MODULE = B PACKAGE = B::LOOP PREFIX = LOOP_ - - -B::OP -LOOP_redoop(o) - B::LOOP o - -B::OP -LOOP_nextop(o) - B::LOOP o - -B::OP -LOOP_lastop(o) - B::LOOP o - #define COP_label(o) CopLABEL(o) #define COP_stashpv(o) CopSTASHPV(o) #define COP_stash(o) CopSTASH(o) |