summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-11-08 11:54:25 +0000
committerNicholas Clark <nick@ccl4.org>2010-11-08 11:54:25 +0000
commit6079961fee8cf49c4c5439b5accb5d27994e74f0 (patch)
tree5fa4017d19b64209fd4b42417f6d71d2f1d3634b /ext
parent0a49bb245ba47522d06cd04cb0bb92cb03d49ee9 (diff)
downloadperl-6079961fee8cf49c4c5439b5accb5d27994e74f0.tar.gz
In B.xs refactor cc_opclassname() to make_op_object().
All bar one of the callers to cc_opclassname() were using it in the same way - to pass as the second argument of newSVrv(), whose first argument was a new mortal, and return value was used with sv_setiv() and PTR2IV(). So clearly *that* is the common code needed. Inline the existing code (all 1 line of it) in the other location that called cc_opclassname(). As the typemap was using cc_opclassname(), replace the 4 implicit uses of it with explicit PPCODE sections. Curiously, removing the use of this typemap actually reduces the line count of B.xs On this platform, this reduces the object code size by almost .5K.
Diffstat (limited to 'ext')
-rw-r--r--ext/B/B.xs56
-rw-r--r--ext/B/typemap3
2 files changed, 25 insertions, 34 deletions
diff --git a/ext/B/B.xs b/ext/B/B.xs
index 06d89b1e61..e452c4b70c 100644
--- a/ext/B/B.xs
+++ b/ext/B/B.xs
@@ -235,10 +235,12 @@ cc_opclass(pTHX_ const OP *o)
return OPc_BASEOP;
}
-static char *
-cc_opclassname(pTHX_ const OP *o)
+static SV *
+make_op_object(pTHX_ const OP *o)
{
- return (char *)opclassnames[cc_opclass(aTHX_ o)];
+ SV *opsv = sv_newmortal();
+ sv_setiv(newSVrv(opsv, opclassnames[cc_opclass(aTHX_ o)]), PTR2IV(o));
+ return opsv;
}
/* FIXME - figure out how to get the typemap to assign this to ST(0), rather
@@ -484,7 +486,7 @@ walkoptree(pTHX_ OP *o, const char *method, SV *ref)
dSP;
OP *kid;
SV *object;
- const char *const classname = cc_opclassname(aTHX_ o);
+ const char *const classname = opclassnames[cc_opclass(aTHX_ o)];
dMY_CXT;
/* Check that no-one has changed our reference, or is holding a reference
@@ -529,7 +531,6 @@ static SV **
oplist(pTHX_ OP *o, SV **SP)
{
for(; o; o = o->op_next) {
- SV *opsv;
#if PERL_VERSION >= 9
if (o->op_opt == 0)
break;
@@ -539,9 +540,7 @@ oplist(pTHX_ OP *o, SV **SP)
break;
o->op_seq = 0;
#endif
- opsv = sv_newmortal();
- sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
- XPUSHs(opsv);
+ XPUSHs(make_op_object(aTHX_ o));
switch (o->op_type) {
case OP_SUBST:
SP = oplist(aTHX_ PMOP_pmreplstart(cPMOPo), SP);
@@ -709,14 +708,12 @@ sv_undef()
OUTPUT:
RETVAL
-B::OP
+void
main_root()
ALIAS:
main_start = 1
- CODE:
- RETVAL = ix ? PL_main_start : PL_main_root;
- OUTPUT:
- RETVAL
+ PPCODE:
+ PUSHs(make_op_object(aTHX_ ix ? PL_main_start : PL_main_root));
UV
sub_generation()
@@ -938,12 +935,8 @@ next(o)
ptr = (ix & 0xFFFF) + (char *)o;
switch ((U8)(ix >> 16)) {
case (U8)(OPp >> 16):
- {
- OP *const o2 = *((OP **)ptr);
- ret = sv_newmortal();
- sv_setiv(newSVrv(ret, cc_opclassname(aTHX_ o2)), PTR2IV(o2));
- break;
- }
+ ret = make_op_object(aTHX_ *((OP **)ptr));
+ break;
case (U8)(PADOFFSETp >> 16):
ret = sv_2mortal(newSVuv(*((PADOFFSET*)ptr)));
break;
@@ -1066,10 +1059,10 @@ PMOP_pmreplroot(o)
B::PMOP o
OP * root = NO_INIT
CODE:
- ST(0) = sv_newmortal();
root = o->op_pmreplroot;
/* OP_PUSHRE stores an SV* instead of an OP* in op_pmreplroot */
if (o->op_type == OP_PUSHRE) {
+ ST(0) = sv_newmortal();
# ifdef USE_ITHREADS
sv_setiv(ST(0), INT2PTR(PADOFFSET,root) );
# else
@@ -1079,7 +1072,7 @@ PMOP_pmreplroot(o)
# endif
}
else {
- sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)), PTR2IV(root));
+ ST(0) = make_op_object(aTHX_ root);
}
#else
@@ -1088,8 +1081,8 @@ void
PMOP_pmreplroot(o)
B::PMOP o
CODE:
- ST(0) = sv_newmortal();
if (o->op_type == OP_PUSHRE) {
+ ST(0) = sv_newmortal();
# ifdef USE_ITHREADS
sv_setiv(ST(0), o->op_pmreplrootu.op_pmtargetoff);
# else
@@ -1101,8 +1094,7 @@ PMOP_pmreplroot(o)
}
else {
OP *const root = o->op_pmreplrootu.op_pmreplroot;
- sv_setiv(newSVrv(ST(0), cc_opclassname(aTHX_ root)),
- PTR2IV(root));
+ ST(0) = make_op_object(aTHX_ root);
}
#endif
@@ -1124,11 +1116,12 @@ PMOP_pmstash(o)
#endif
#if PERL_VERSION < 9
-#define PMOP_pmnext(o) o->op_pmnext
-B::PMOP
+void
PMOP_pmnext(o)
B::PMOP o
+ PPCODE:
+ PUSHs(make_op_object(aTHX_ o->op_pmnext));
U32
PMOP_pmpermflags(o)
@@ -1907,15 +1900,14 @@ U32
CvCONST(cv)
B::CV cv
-B::OP
+void
CvSTART(cv)
B::CV cv
ALIAS:
ROOT = 1
- CODE:
- RETVAL = CvISXSUB(cv) ? NULL : ix ? CvROOT(cv) : CvSTART(cv);
- OUTPUT:
- RETVAL
+ PPCODE:
+ PUSHs(make_op_object(aTHX_ CvISXSUB(cv) ? NULL
+ : ix ? CvROOT(cv) : CvSTART(cv)));
void
CvXSUB(cv)
@@ -1951,6 +1943,8 @@ HvRITER(hv)
B::PMOP
HvPMROOT(hv)
B::HV hv
+ PPCODE:
+ PUSHs(make_op_object(aTHX_ HvPMROOT(hv));
#endif
diff --git a/ext/B/typemap b/ext/B/typemap
index 7d14ba6d12..6daceb6d36 100644
--- a/ext/B/typemap
+++ b/ext/B/typemap
@@ -78,9 +78,6 @@ T_RHE_OBJ
croak(\"$var is not a reference\")
OUTPUT
-T_OP_OBJ
- sv_setiv(newSVrv($arg, cc_opclassname(aTHX_ (OP*)$var)), PTR2IV($var));
-
T_SV_OBJ
make_sv_object(aTHX_ ($arg), (SV*)($var));