diff options
-rw-r--r-- | pp.h | 1 | ||||
-rw-r--r-- | pp_hot.c | 21 | ||||
-rw-r--r-- | pp_sys.c | 6 |
3 files changed, 12 insertions, 16 deletions
@@ -497,6 +497,7 @@ True if this op will be the return value of an lvalue subroutine architecture can generate more efficient instructions. */ # define TIED_METHOD_MORTALIZE_NOT_NEEDED 0x04 # define TIED_METHOD_ARGUMENTS_ON_STACK 0x08 +# define TIED_METHOD_SAY 0x10 #endif /* @@ -729,22 +729,11 @@ PP(pp_print) Move(MARK, MARK + 1, (SP - MARK) + 1, SV*); ++SP; } - PUSHMARK(MARK - 1); - *MARK = SvTIED_obj(MUTABLE_SV(io), mg); - PUTBACK; - ENTER_with_name("call_PRINT"); - if( PL_op->op_type == OP_SAY ) { - /* local $\ = "\n" */ - SAVEGENERICSV(PL_ors_sv); - PL_ors_sv = newSVpvs("\n"); - } - call_method("PRINT", G_SCALAR); - LEAVE_with_name("call_PRINT"); - SPAGAIN; - MARK = ORIGMARK + 1; - *MARK = *SP; - SP = MARK; - RETURN; + return Perl_tied_method(aTHX_ "PRINT", mark - 1, MUTABLE_SV(io), + mg, + (G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK + | (PL_op->op_type == OP_SAY + ? TIED_METHOD_SAY : 0)), sp - mark); } if (!io) { if ( gv && GvEGVx(gv) && (io = GvIO(GvEGV(gv))) @@ -516,6 +516,7 @@ Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv, /* Ensure that our flag bits do not overlap. */ assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0); assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0); + assert((TIED_METHOD_SAY & G_WANT) == 0); PUSHMARK(sp); PUSHs(SvTIED_obj(sv, mg)); @@ -538,6 +539,11 @@ Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv, PUTBACK; ENTER_with_name("call_tied_method"); + if (flags & TIED_METHOD_SAY) { + /* local $\ = "\n" */ + SAVEGENERICSV(PL_ors_sv); + PL_ors_sv = newSVpvs("\n"); + } call_method(methname, flags & G_WANT); LEAVE_with_name("call_tied_method"); return NORMAL; |