commit a948054a1951cd526c732d6a0e16d99cae837d49
parent a8f8c7fd80a5c7e630fd4bf7f858d05024f6b434
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Mon, 16 Dec 2013 17:06:27 -0200
new order for binary operations (grouping them by type of result)
Diffstat:
9 files changed, 41 insertions(+), 35 deletions(-)
diff --git a/lcode.c b/lcode.c
@@ -1,5 +1,5 @@
/*
-** $Id: lcode.c,v 2.72 2013/08/30 16:01:37 roberto Exp roberto $
+** $Id: lcode.c,v 2.73 2013/12/16 14:30:22 roberto Exp roberto $
** Code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -762,6 +762,7 @@ static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
((op == OP_MOD && ivalue(&v2) == 0) || /* ...avoid module by 0... */
(op == OP_POW && ivalue(&v2) < 0))) /* ...and negative exponents */
return 0;
+ lua_assert(OP_IDIV - OP_ADD + LUA_OPADD == LUA_OPIDIV);
luaO_arith(NULL, op - OP_ADD + LUA_OPADD, &v1, &v2, &res);
if (ttisinteger(&res)) {
e1->k = VKINT;
diff --git a/lcode.h b/lcode.h
@@ -1,5 +1,5 @@
/*
-** $Id: lcode.h,v 1.59 2013/04/25 19:35:19 roberto Exp roberto $
+** $Id: lcode.h,v 1.60 2013/04/26 13:07:53 roberto Exp roberto $
** Code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -24,7 +24,9 @@
** grep "ORDER OPR" if you change these enums (ORDER OP)
*/
typedef enum BinOpr {
- OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_IDIV, OPR_MOD, OPR_POW,
+ OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,
+ OPR_DIV,
+ OPR_IDIV,
OPR_CONCAT,
OPR_EQ, OPR_LT, OPR_LE,
OPR_NE, OPR_GT, OPR_GE,
diff --git a/lopcodes.c b/lopcodes.c
@@ -1,5 +1,5 @@
/*
-** $Id: lopcodes.c,v 1.49 2012/05/14 13:34:18 roberto Exp roberto $
+** $Id: lopcodes.c,v 1.50 2013/04/26 13:07:53 roberto Exp roberto $
** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h
*/
@@ -31,10 +31,10 @@ LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {
"ADD",
"SUB",
"MUL",
- "DIV",
- "IDIV",
"MOD",
"POW",
+ "DIV",
+ "IDIV",
"UNM",
"NOT",
"LEN",
@@ -80,10 +80,10 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */
,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */
,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */
- ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */
- ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_IDIV */
,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */
,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_IDIV */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */
,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */
diff --git a/lopcodes.h b/lopcodes.h
@@ -1,5 +1,5 @@
/*
-** $Id: lopcodes.h,v 1.142 2011/07/15 12:50:29 roberto Exp roberto $
+** $Id: lopcodes.h,v 1.143 2013/04/26 13:07:53 roberto Exp roberto $
** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h
*/
@@ -187,10 +187,10 @@ OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */
OP_ADD,/* A B C R(A) := RK(B) + RK(C) */
OP_SUB,/* A B C R(A) := RK(B) - RK(C) */
OP_MUL,/* A B C R(A) := RK(B) * RK(C) */
-OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
-OP_IDIV,/* A B C R(A) := RK(B) // RK(C) */
OP_MOD,/* A B C R(A) := RK(B) % RK(C) */
OP_POW,/* A B C R(A) := RK(B) ^ RK(C) */
+OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
+OP_IDIV,/* A B C R(A) := RK(B) // RK(C) */
OP_UNM,/* A B R(A) := -R(B) */
OP_NOT,/* A B R(A) := not R(B) */
OP_LEN,/* A B R(A) := length of R(B) */
diff --git a/lparser.c b/lparser.c
@@ -1,5 +1,5 @@
/*
-** $Id: lparser.c,v 2.134 2013/08/16 18:55:49 roberto Exp roberto $
+** $Id: lparser.c,v 2.135 2013/08/30 16:01:37 roberto Exp roberto $
** Lua Parser
** See Copyright Notice in lua.h
*/
@@ -990,10 +990,10 @@ static BinOpr getbinopr (int op) {
case '+': return OPR_ADD;
case '-': return OPR_SUB;
case '*': return OPR_MUL;
- case '/': return OPR_DIV;
- case TK_IDIV: return OPR_IDIV;
case '%': return OPR_MOD;
case '^': return OPR_POW;
+ case '/': return OPR_DIV;
+ case TK_IDIV: return OPR_IDIV;
case TK_CONCAT: return OPR_CONCAT;
case TK_NE: return OPR_NE;
case TK_EQ: return OPR_EQ;
@@ -1012,12 +1012,14 @@ static const struct {
lu_byte left; /* left priority for each binary operator */
lu_byte right; /* right priority */
} priority[] = { /* ORDER OPR */
- {6, 6}, {6, 6}, /* '+' '-' */
- {7, 7}, {7, 7}, {7, 7}, {7, 7}, /* '*' '/' '//' '%' */
- {10, 9}, {5, 4}, /* ^, .. (right associative) */
- {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
- {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
- {2, 2}, {1, 1} /* and, or */
+ {6, 6}, {6, 6}, /* '+' '-' */
+ {7, 7}, {7, 7}, /* '*' '%' */
+ {10, 9}, /* '^' (right associative) */
+ {7, 7}, {7, 7}, /* '/' '//' */
+ {5, 4}, /* '..' (right associative) */
+ {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
+ {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
+ {2, 2}, {1, 1} /* and, or */
};
#define UNARY_PRIORITY 8 /* priority for unary operators */
diff --git a/ltests.c b/ltests.c
@@ -1,5 +1,5 @@
/*
-** $Id: ltests.c,v 2.158 2013/09/11 14:09:55 roberto Exp roberto $
+** $Id: ltests.c,v 2.159 2013/09/11 14:47:08 roberto Exp roberto $
** Internal Module for Debugging of the Lua Implementation
** See Copyright Notice in lua.h
*/
@@ -1198,7 +1198,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
}
}
else if EQ("arith") {
- static char ops[] = "+-*/\\%^_"; /* '\' -> '//'; '_' -> '..' */
+ static char ops[] = "+-*%^/\\_"; /* '\' -> '//'; '_' -> '..' */
int op;
skip(&pc);
op = strchr(ops, *pc++) - ops;
diff --git a/ltm.c b/ltm.c
@@ -1,5 +1,5 @@
/*
-** $Id: ltm.c,v 2.21 2013/08/21 20:09:51 roberto Exp roberto $
+** $Id: ltm.c,v 2.22 2013/08/27 18:53:35 roberto Exp roberto $
** Tag methods
** See Copyright Notice in lua.h
*/
@@ -36,8 +36,9 @@ void luaT_init (lua_State *L) {
static const char *const luaT_eventname[] = { /* ORDER TM */
"__index", "__newindex",
"__gc", "__mode", "__len", "__eq",
- "__add", "__sub", "__mul", "__div", "__idiv", "__mod",
- "__pow", "__unm", "__lt", "__le",
+ "__add", "__sub", "__mul", "__mod", "__pow",
+ "__div", "__idiv",
+ "__unm", "__lt", "__le",
"__concat", "__call"
};
int i;
diff --git a/ltm.h b/ltm.h
@@ -1,5 +1,5 @@
/*
-** $Id: ltm.h,v 2.15 2013/04/26 13:07:53 roberto Exp roberto $
+** $Id: ltm.h,v 2.16 2013/04/29 16:56:50 roberto Exp roberto $
** Tag methods
** See Copyright Notice in lua.h
*/
@@ -13,7 +13,7 @@
/*
* WARNING: if you change the order of this enumeration,
-* grep "ORDER TM"
+* grep "ORDER TM" and "ORDER OP"
*/
typedef enum {
TM_INDEX,
@@ -25,10 +25,10 @@ typedef enum {
TM_ADD,
TM_SUB,
TM_MUL,
- TM_DIV,
- TM_IDIV,
TM_MOD,
TM_POW,
+ TM_DIV,
+ TM_IDIV,
TM_UNM,
TM_LT,
TM_LE,
diff --git a/lua.h b/lua.h
@@ -1,5 +1,5 @@
/*
-** $Id: lua.h,v 1.294 2013/09/13 16:21:52 roberto Exp roberto $
+** $Id: lua.h,v 1.295 2013/12/09 14:21:10 roberto Exp roberto $
** Lua - A Scripting Language
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
** See Copyright Notice at the end of this file
@@ -182,13 +182,13 @@ LUA_API const void *(lua_topointer) (lua_State *L, int idx);
** Comparison and arithmetic functions
*/
-#define LUA_OPADD 0 /* ORDER TM */
+#define LUA_OPADD 0 /* ORDER TM, ORDER OP */
#define LUA_OPSUB 1
#define LUA_OPMUL 2
-#define LUA_OPDIV 3
-#define LUA_OPIDIV 4
-#define LUA_OPMOD 5
-#define LUA_OPPOW 6
+#define LUA_OPMOD 3
+#define LUA_OPPOW 4
+#define LUA_OPDIV 5
+#define LUA_OPIDIV 6
#define LUA_OPUNM 7
LUA_API void (lua_arith) (lua_State *L, int op);