lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Enrico Colombini <erix@erix.it> writes:

> I just put this at the end of luaconf.h.

To make progress on supporting integer operations, you must change
src/lvm.c so that it correctly handles integer divide by zero.  I've
enclosed a patch that addresses this issue.  It also provides integer
exponentiation. 

John

diff -ur olua-5.1.3/src/lvm.c lua-5.1.3/src/lvm.c
--- olua-5.1.3/src/lvm.c	2007-12-28 10:32:23.000000000 -0500
+++ lua-5.1.3/src/lvm.c	2008-02-20 10:27:15.000000000 -0500
@@ -27,6 +27,37 @@
 #include "lvm.h"
 
 
+#if defined LUA_NUMBER_INTEGRAL
+#define luai_znumdiv(a,b)	\
+  ((b)==0?			\
+   (luaG_runerror(L,"divide by zero"),0): \
+   luai_numdiv(a,b))
+#define luai_znummod(a,b)	\
+  ((b)==0?			\
+   (luaG_runerror(L,"modulo by zero"),0): \
+   luai_nummod(a,b))
+
+LUA_NUMBER luai_ipow(LUA_NUMBER a, LUA_NUMBER b) {
+  if (b < 0)
+    return 0;
+  else if (b == 0)
+    return 1;
+  else {
+    LUA_NUMBER c = 1;
+    for (;;) {
+      if (b & 1)
+	c *= a;
+      b = b >> 1;
+      if (b == 0)
+	return c;
+      a *= a;
+    }
+  }
+}
+#else
+#define luai_znumdiv(a,b)	(luai_numdiv(a,b))
+#define luai_znummod(a,b)	(luai_nummod(a,b))
+#endif
 
 /* limit for table tag-method chains (to avoid loops) */
 #define MAXTAGLOOP	100
@@ -321,8 +352,8 @@
       case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break;
       case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break;
       case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break;
-      case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break;
-      case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break;
+      case TM_DIV: setnvalue(ra, luai_znumdiv(nb, nc)); break;
+      case TM_MOD: setnvalue(ra, luai_znummod(nb, nc)); break;
       case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break;
       case TM_UNM: setnvalue(ra, luai_numunm(nb)); break;
       default: lua_assert(0); break;
@@ -480,11 +511,11 @@
         continue;
       }
       case OP_DIV: {
-        arith_op(luai_numdiv, TM_DIV);
+        arith_op(luai_znumdiv, TM_DIV);
         continue;
       }
       case OP_MOD: {
-        arith_op(luai_nummod, TM_MOD);
+        arith_op(luai_znummod, TM_MOD);
         continue;
       }
       case OP_POW: {
Only in lua-5.1.3/src: lvm.c~