From 5ea1d9e1b46ed49c78678624d0957f6fa81f1dd8 Mon Sep 17 00:00:00 2001
From: Per Hedbor <ph@opera.com>
Date: Fri, 22 Jun 2012 11:03:52 +0200
Subject: [PATCH] [compiler] Added ADD_LOCAL_INT to complement
 ADD_LOCAL_INT_AND_POP.

Also, do quick return for return UNDEFINED.
---
 src/interpret_functions.h | 19 +++++++++++++++++++
 src/peep.in               |  4 ++++
 2 files changed, 23 insertions(+)

diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 94b74a0c40..e39a9ea707 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -550,6 +550,25 @@ OPCODE2(F_ADD_LOCAL_INT_AND_POP, "local += number", 0,{
   }
 });
 
+OPCODE2(F_ADD_LOCAL_INT, "local += number local", 0,{
+  struct svalue *dst = Pike_fp->locals+arg1;
+  if( dst->type == PIKE_T_INT
+      DO_IF_BIGNUM(
+        &&(!INT_TYPE_ADD_OVERFLOW(dst->u.integer,arg2))))
+  {
+    SET_SVAL_SUBTYPE(*dst,NUMBER_NUMBER);
+    dst->u.integer += arg2;
+    push_int( dst->u.integer );
+  }
+  else
+  {
+    push_svalue( dst );
+    push_int( arg2 );
+    f_add(2);
+    assign_svalue( Pike_fp->locals+arg1,Pike_sp-1);
+  }
+});
+
 OPCODE1(F_INC_LOCAL, "++local", I_UPDATE_SP, {
   if( (TYPEOF(Pike_fp->locals[arg1]) == PIKE_T_INT)
       DO_IF_BIGNUM(
diff --git a/src/peep.in b/src/peep.in
index 496aaadd11..756c01ae3e 100644
--- a/src/peep.in
+++ b/src/peep.in
@@ -80,6 +80,9 @@ LOCAL_LVALUE CONST_1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,-1)
 LOCAL_LVALUE CONST1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,1)
 LOCAL_LVALUE CONST0 ADD_TO_AND_POP:
 
+LOCAL_LVALUE LTOSVAL ADD_INT ASSIGN: ADD_LOCAL_INT($1a,$3a)
+LOCAL_LVALUE LTOSVAL ADD_NEG_INT ASSIGN: ADD_LOCAL_INT($1a,-$3a)
+
 NUMBER  ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,$1a)
 CONST0  ASSIGN_LOCAL_AND_POP : CLEAR_LOCAL($2a)
 CONST1  ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,1)
@@ -402,6 +405,7 @@ LE BRANCH_WHEN_NON_ZERO : LE QUICK_BRANCH_WHEN_NON_ZERO($2a)
 //
 // These are functions returning a constant, and doing nothing else.
 MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_0 : RETURN_0
+MARK_AT(0) POP_TO_MARK INIT_FRAME UNDEFINED RETURN : UNDEFINED RETURN
 MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_1 : RETURN_1
 MARK_AT(0) POP_TO_MARK INIT_FRAME NUMBER RETURN : NUMBER($4a) RETURN
 MARK_AT(0) POP_TO_MARK INIT_FRAME STRING RETURN : STRING($4a) RETURN
-- 
GitLab