refactor pp_ref
authorDaniel Dragan <bulk88@hotmail.com>
Sun, 13 Jul 2014 10:48:25 +0000 (06:48 -0400)
committerTony Cook <tony@develop-help.com>
Mon, 14 Jul 2014 06:09:24 +0000 (16:09 +1000)
similar to commmit b3cf48215c

-removed:
  -4/-8 pop on SP
  +4/+8 push on SP
  PUTBACK
  1 non vol register save/restore (TARG not saved across the sv_ref())

TARG is not computed if the SV isn't a reference, so the PL_sv_no branch is
slightly faster. On VC 2003 32 bit miniperl, this func dropped from 0x6D to
0x58 bytes of machine code.

pp.c

diff --git a/pp.c b/pp.c
index 3751bb4..bc7c0df 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -586,16 +586,21 @@ S_refto(pTHX_ SV *sv)
 
 PP(pp_ref)
 {
-    dSP; dTARGET;
-    SV * const sv = POPs;
+    dSP;
+    SV * const sv = TOPs;
 
     SvGETMAGIC(sv);
     if (!SvROK(sv))
-       RETPUSHNO;
+       SETs(&PL_sv_no);
+    else {
+       dTARGET;
+       SETs(TARG);
+       /* use the return value that is in a register, its the same as TARG */
+       TARG = sv_ref(TARG,SvRV(sv),TRUE);
+       SvSETMAGIC(TARG);
+    }
 
-    (void)sv_ref(TARG,SvRV(sv),TRUE);
-    PUSHTARG;
-    RETURN;
+    return NORMAL;
 }
 
 PP(pp_bless)