From b515d6f88e8cbfe1b742d0a5cc99aa2d55b6c38e Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Thu, 22 May 2008 17:21:30 +0000 Subject: [PATCH] * Changed Makefiles to use mainline Lua * Added a dispatching shortcut (thanks to Jow) --- Makefile | 2 +- .../luci-fw/src/controller/luci_fw/luci_fw.lua | 17 +- build/config.mk | 2 +- contrib/package-source/lua-luci-5.1.3.tar.bz2 | Bin 175758 -> 0 bytes contrib/package/ffluci/Makefile | 6 +- contrib/package/haserl-lua/Makefile | 2 +- contrib/package/lua-luci/Makefile | 151 - .../patches/010-lua-5.1.3-lnum-full-260308.patch | 3806 -------------------- .../lua-luci/patches/020-shared_liblua.patch | 139 - .../patches/030-archindependent-bytecode.patch | 113 - .../package/lua-luci/patches/100-no_readline.patch | 53 - .../package/lua-luci/patches/200-lua-path.patch | 36 - contrib/package/luaposix/Makefile | 2 +- core/src/dispatcher.lua | 19 + 14 files changed, 28 insertions(+), 4320 deletions(-) delete mode 100644 contrib/package-source/lua-luci-5.1.3.tar.bz2 delete mode 100644 contrib/package/lua-luci/Makefile delete mode 100644 contrib/package/lua-luci/patches/010-lua-5.1.3-lnum-full-260308.patch delete mode 100644 contrib/package/lua-luci/patches/020-shared_liblua.patch delete mode 100644 contrib/package/lua-luci/patches/030-archindependent-bytecode.patch delete mode 100644 contrib/package/lua-luci/patches/100-no_readline.patch delete mode 100644 contrib/package/lua-luci/patches/200-lua-path.patch diff --git a/Makefile b/Makefile index 473d031fb..8d4c73b00 100644 --- a/Makefile +++ b/Makefile @@ -18,5 +18,5 @@ host: build mkdir -p host/ffluci for i in $(MODULES); do cp $$i/dist$(LUCI_INSTALLDIR) host/ -R 2>/dev/null || true; done -hostclean: +hostclean: clean rm host -rf diff --git a/applications/luci-fw/src/controller/luci_fw/luci_fw.lua b/applications/luci-fw/src/controller/luci_fw/luci_fw.lua index 864455ca8..9a92b9099 100644 --- a/applications/luci-fw/src/controller/luci_fw/luci_fw.lua +++ b/applications/luci-fw/src/controller/luci_fw/luci_fw.lua @@ -1,18 +1,7 @@ module("ffluci.controller.luci_fw.luci_fw", package.seeall) function index() - local page = node("admin", "network", "portfw") - page.target = cbi("luci_fw/portfw") - page.title = "Portweiterleitung" - page.order = 70 - - local page = node("admin", "network", "routing") - page.target = cbi("luci_fw/routing") - page.title = "Routing" - page.order = 72 - - local page = node("admin", "network", "firewall") - page.target = cbi("luci_fw/firewall") - page.title = "Firewall" - page.order = 74 + entry({"admin", "network", "portfw"}, cbi("luci_fw/portfw"), "Portweiterleitung", 70) + entry({"admin", "network", "routing"}, cbi("luci_fw/routing"), "Routing", 72) + entry({"admin", "network", "firewall"}, cbi("luci_fw/firewall"), "Firewall", 74) end \ No newline at end of file diff --git a/build/config.mk b/build/config.mk index 372fc8a57..af0b443d5 100644 --- a/build/config.mk +++ b/build/config.mk @@ -1,3 +1,3 @@ LUAC = luac LUAC_OPTIONS = -s -LUCI_INSTALLDIR = /usr/lib/lua/5.1/ffluci \ No newline at end of file +LUCI_INSTALLDIR = /usr/lib/lua/ffluci \ No newline at end of file diff --git a/contrib/package-source/lua-luci-5.1.3.tar.bz2 b/contrib/package-source/lua-luci-5.1.3.tar.bz2 deleted file mode 100644 index 640a71fe800f79e655e87b4b12b7eda9472f15b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175758 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

4$ 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�ySj{kyPU$JSPV4XQ7^riyFRUX(l#%DRec` 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 G_g7#Oe-kwT diff --git a/contrib/package/ffluci/Makefile b/contrib/package/ffluci/Makefile index 34c796e2d..bcfe3c2af 100644 --- a/contrib/package/ffluci/Makefile +++ b/contrib/package/ffluci/Makefile @@ -13,12 +13,10 @@ PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz PKG_SOURCE_PROTO:=svn PKG_SOURCE_VERSION:=$(PKG_REV) -PKG_BUILD_DEPENDS:=lua-luci - PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install -# LUA_TARGET:=compile LUAC=$(BUILD_DIR_HOST)/lua-luci/luac +# LUA_TARGET:=compile LUAC=$(BUILD_DIR_HOST)/lua/luac LUA_TARGET:=source @@ -48,7 +46,7 @@ endef define Package/ffluci $(call Package/ffluci/template) MENU:=1 - DEPENDS:=+lua-luci +luaposix +luci-addons + DEPENDS:=+lua +luaposix +luci-addons endef define Package/ffluci/conffiles diff --git a/contrib/package/haserl-lua/Makefile b/contrib/package/haserl-lua/Makefile index ed4279bfd..bc8cb44eb 100644 --- a/contrib/package/haserl-lua/Makefile +++ b/contrib/package/haserl-lua/Makefile @@ -23,7 +23,7 @@ define Package/haserl-lua CATEGORY:=Utilities TITLE:=A CGI wrapper to embed shell scripts in HTML documents URL:=http://haserl.sourceforge.net/ - DEPENDS:=+liblua-luci + DEPENDS:=+liblua endef CONFIGURE_ARGS += \ diff --git a/contrib/package/lua-luci/Makefile b/contrib/package/lua-luci/Makefile deleted file mode 100644 index ffa26853d..000000000 --- a/contrib/package/lua-luci/Makefile +++ /dev/null @@ -1,151 +0,0 @@ -# -# Copyright (C) 2006 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. - -include $(TOPDIR)/rules.mk - -PKG_NAME:=lua-luci -PKG_VERSION:=5.1.3 -PKG_RELEASE:=1 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://dev.leipzig.freifunk.net/svn/ff-luci/trunk/contrib/package-source/ \ - http://firmware.freifunk-halle.net/ffluci/package-source/ -PKG_MD5SUM:=98b12c767a5eed92169b01537e988c7f - -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) -PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install - -X_HOST_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME) - -include $(INCLUDE_DIR)/package.mk - -define Package/lua-luci/Default - SUBMENU:=LUA - SECTION:=lang - CATEGORY:=Languages - TITLE:=LUA programming language - URL:=http://www.lua.org/ -endef - -define Package/lua-luci/Default/description - Lua is a powerful light-weight programming language designed for extending - applications. Lua is also frequently used as a general-purpose, stand-alone - language. Lua is free software. -endef - -define Package/liblua-luci -$(call Package/lua-luci/Default) - SUBMENU:= - SECTION:=libs - CATEGORY:=Libraries - TITLE+= (libraries) -endef - -define Package/liblua-luci/description -$(call Package/lua-luci/Default/description) - This package contains the LUA shared libraries, needed by other programs. -endef - -define Package/lua-luci -$(call Package/lua-luci/Default) - DEPENDS:=+liblua-luci - TITLE+= (interpreter) -endef - -define Package/lua-luci/description -$(call Package/lua-luci/Default/description) - This package contains the LUA language interpreter. -endef - -define Package/luac-luci -$(call Package/lua-luci/Default) - DEPENDS:=+liblua-luci - TITLE+= (compiler) -endef - -define Package/luac/description -$(call Package/lua-luci/Default/description) - This package contains the LUA language compiler. -endef - -define Package/lua-luci-examples -$(call Package/lua-luci/Default) - DEPENDS:=lua-luci - TITLE+= (examples) -endef - -define Package/lua-luci-examples/description -$(call Package/lua-luci/Default/description) - This package contains LUA language examples. -endef - -define Build/Configure -endef - -define Build/Compile - cp $(PKG_BUILD_DIR)/src $(PKG_BUILD_DIR)/src-host -R - $(MAKE) -C $(PKG_BUILD_DIR) \ - CC="$(TARGET_CROSS)gcc" \ - LD="$(TARGET_CROSS)ld" \ - AR="$(TARGET_CROSS)ar rcu" \ - RANLIB="$(TARGET_CROSS)ranlib" \ - INSTALL_ROOT=/usr \ - MYCFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ - MYLDFLAGS="$(TARGET_LDFLAGS)" \ - PKG_VERSION=$(PKG_VERSION) \ - all linux - rm -rf $(PKG_INSTALL_DIR) - mkdir -p $(PKG_INSTALL_DIR) - $(MAKE) -C $(PKG_BUILD_DIR) \ - INSTALL_TOP="$(PKG_INSTALL_DIR)/usr" \ - install - $(MAKE) -C $(PKG_BUILD_DIR)/src-host luac-host - mkdir -p $(X_HOST_DIR) - cp $(PKG_BUILD_DIR)/src-host/luac-host $(X_HOST_DIR)/luac -endef - -define Build/InstallDev - mkdir -p $(1)/usr/include - $(CP) $(PKG_INSTALL_DIR)/usr/include/lua{,lib,conf}.h $(1)/usr/include/ - $(CP) $(PKG_INSTALL_DIR)/usr/include/lauxlib.h $(1)/usr/include/ - $(CP) $(PKG_INSTALL_DIR)/usr/include/lnum_config.h $(1)/usr/include/ - mkdir -p $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblua.{a,so.*} $(1)/usr/lib/ - ln -sf liblua.so.$(PKG_VERSION) $(1)/usr/lib/liblua.so - ln -sf liblua.so.$(PKG_VERSION) $(1)/usr/lib/liblualib.so -endef - -define Package/liblua-luci/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblua.so.* $(1)/usr/lib/ - echo "Replaces: liblua" >> $(1)/CONTROL/control - echo "Conflicts: liblua" >> $(1)/CONTROL/control -endef - -define Package/lua-luci/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/lua $(1)/usr/bin/ - echo "Replaces: lua" >> $(1)/CONTROL/control - echo "Conflicts: lua" >> $(1)/CONTROL/control -endef - -define Package/luac-luci/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/luac $(1)/usr/bin/ - echo "Replaces: luac" >> $(1)/CONTROL/control - echo "Conflicts: luac" >> $(1)/CONTROL/control -endef - -define Package/lua-luci-examples/install - $(INSTALL_DIR) $(1)/usr/share/lua/examples - $(INSTALL_DATA) $(PKG_BUILD_DIR)/test/*.lua \ - $(1)/usr/share/lua/examples/ -endef - -$(eval $(call BuildPackage,liblua-luci)) -$(eval $(call BuildPackage,lua-luci)) -$(eval $(call BuildPackage,luac-luci)) -$(eval $(call BuildPackage,lua-luci-examples)) diff --git a/contrib/package/lua-luci/patches/010-lua-5.1.3-lnum-full-260308.patch b/contrib/package/lua-luci/patches/010-lua-5.1.3-lnum-full-260308.patch deleted file mode 100644 index a9cc95f75..000000000 --- a/contrib/package/lua-luci/patches/010-lua-5.1.3-lnum-full-260308.patch +++ /dev/null @@ -1,3806 +0,0 @@ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/Makefile lua-5.1.3-patched/src/Makefile ---- ../lua-5.1.3/src/Makefile 2008-01-19 21:37:58.000000000 +0200 -+++ lua-5.1.3-patched/src/Makefile 2008-03-26 13:05:24.000000000 +0200 -@@ -25,7 +25,7 @@ - LUA_A= liblua.a - CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \ - lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \ -- lundump.o lvm.o lzio.o -+ lundump.o lvm.o lzio.o lnum.o - LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \ - lstrlib.o loadlib.o linit.o - -@@ -148,6 +148,7 @@ - lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h - lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ - ltm.h lzio.h lmem.h ldo.h -+lnum.o: lnum.c lua.h llex.h lnum.h - loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h - lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \ - ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h -@@ -179,4 +180,18 @@ - print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \ - ltm.h lzio.h lmem.h lopcodes.h lundump.h - -+luaconf.h: lnum_config.h -+lapi.c: lnum.h -+lauxlib.c: llimits.h -+lbaselib.c: llimits.h lobject.h lapi.h -+lcode.c: lnum.h -+liolib.c: lnum.h llex.h -+llex.c: lnum.h -+lnum.h: lobject.h -+lobject.c: llex.h lnum.h -+ltable.c: lnum.h -+lua.c: llimits.h -+lvm.c: llex.h lnum.h -+print.c: lnum.h -+ - # (end of Makefile) -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lapi.c lua-5.1.3-patched/src/lapi.c ---- ../lua-5.1.3/src/lapi.c 2008-01-03 17:20:39.000000000 +0200 -+++ lua-5.1.3-patched/src/lapi.c 2008-03-19 09:52:15.000000000 +0200 -@@ -28,7 +28,7 @@ - #include "ltm.h" - #include "lundump.h" - #include "lvm.h" -- -+#include "lnum.h" - - - const char lua_ident[] = -@@ -242,12 +242,13 @@ - - LUA_API int lua_type (lua_State *L, int idx) { - StkId o = index2adr(L, idx); -- return (o == luaO_nilobject) ? LUA_TNONE : ttype(o); -+ return (o == luaO_nilobject) ? LUA_TNONE : ttype_ext(o); - } - - - LUA_API const char *lua_typename (lua_State *L, int t) { - UNUSED(L); -+ lua_assert( t!= LUA_TINT ); - return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; - } - -@@ -265,6 +266,14 @@ - } - - -+LUA_API int lua_isinteger (lua_State *L, int idx) { -+ TValue tmp; -+ lua_Integer dum; -+ const TValue *o = index2adr(L, idx); -+ return tonumber(o,&tmp) && (ttisint(o) || tt_integer_valued(o,&dum)); -+} -+ -+ - LUA_API int lua_isstring (lua_State *L, int idx) { - int t = lua_type(L, idx); - return (t == LUA_TSTRING || t == LUA_TNUMBER); -@@ -310,31 +319,66 @@ - } - - -- - LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { - TValue n; - const TValue *o = index2adr(L, idx); -- if (tonumber(o, &n)) -+ if (tonumber(o, &n)) { -+#ifdef LNUM_COMPLEX -+ if (nvalue_img(o) != 0) -+ luaG_runerror(L, "expecting a real number"); -+#endif - return nvalue(o); -- else -- return 0; -+ } -+ return 0; - } - - - LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { - TValue n; -+ /* Lua 5.1 documented behaviour is to return nonzero for non-integer: -+ * "If the number is not an integer, it is truncated in some non-specified way." -+ * I would suggest to change this, to return 0 for anything that would -+ * not fit in 'lua_Integer'. -+ */ -+#ifdef LUA_COMPAT_TOINTEGER -+ /* Lua 5.1 compatible */ - const TValue *o = index2adr(L, idx); - if (tonumber(o, &n)) { -- lua_Integer res; -- lua_Number num = nvalue(o); -- lua_number2integer(res, num); -- return res; -+ lua_Integer i; -+ lua_Number d; -+ if (ttisint(o)) return ivalue(o); -+ d= nvalue_fast(o); -+# ifdef LNUM_COMPLEX -+ if (nvalue_img_fast(o) != 0) -+ luaG_runerror(L, "expecting a real number"); -+# endif -+ lua_number2integer(i, d); -+ return i; - } -- else -- return 0; -+#else -+ /* New suggestion */ -+ const TValue *o = index2adr(L, idx); -+ if (tonumber(o, &n)) { -+ lua_Integer i; -+ if (ttisint(o)) return ivalue(o); -+ if (tt_integer_valued(o,&i)) return i; -+ } -+#endif -+ return 0; - } - - -+#ifdef LNUM_COMPLEX -+LUA_API lua_Complex lua_tocomplex (lua_State *L, int idx) { -+ TValue tmp; -+ const TValue *o = index2adr(L, idx); -+ if (tonumber(o, &tmp)) -+ return nvalue_complex(o); -+ return 0; -+} -+#endif -+ -+ - LUA_API int lua_toboolean (lua_State *L, int idx) { - const TValue *o = index2adr(L, idx); - return !l_isfalse(o); -@@ -365,6 +409,7 @@ - case LUA_TSTRING: return tsvalue(o)->len; - case LUA_TUSERDATA: return uvalue(o)->len; - case LUA_TTABLE: return luaH_getn(hvalue(o)); -+ case LUA_TINT: - case LUA_TNUMBER: { - size_t l; - lua_lock(L); /* `luaV_tostring' may create a new string */ -@@ -427,6 +472,8 @@ - } - - -+/* 'lua_pushnumber()' may lose accuracy on integers, 'lua_pushinteger' will not. -+ */ - LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { - lua_lock(L); - setnvalue(L->top, n); -@@ -435,12 +482,22 @@ - } - - --LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { -+LUA_API void lua_pushinteger (lua_State *L, lua_Integer i) { -+ lua_lock(L); -+ setivalue(L->top, i); -+ api_incr_top(L); -+ lua_unlock(L); -+} -+ -+ -+#ifdef LNUM_COMPLEX -+LUA_API void lua_pushcomplex (lua_State *L, lua_Complex v) { - lua_lock(L); -- setnvalue(L->top, cast_num(n)); -+ setnvalue_complex( L->top, v ); - api_incr_top(L); - lua_unlock(L); - } -+#endif - - - LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { -@@ -570,7 +627,7 @@ - lua_lock(L); - o = index2adr(L, idx); - api_check(L, ttistable(o)); -- setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); -+ setobj2s(L, L->top, luaH_getint(hvalue(o), n)); - api_incr_top(L); - lua_unlock(L); - } -@@ -598,6 +655,9 @@ - case LUA_TUSERDATA: - mt = uvalue(obj)->metatable; - break; -+ case LUA_TINT: -+ mt = G(L)->mt[LUA_TNUMBER]; -+ break; - default: - mt = G(L)->mt[ttype(obj)]; - break; -@@ -688,7 +748,7 @@ - api_checknelems(L, 1); - o = index2adr(L, idx); - api_check(L, ttistable(o)); -- setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); -+ setobj2t(L, luaH_setint(L, hvalue(o), n), L->top-1); - luaC_barriert(L, hvalue(o), L->top-1); - L->top--; - lua_unlock(L); -@@ -722,7 +782,7 @@ - break; - } - default: { -- G(L)->mt[ttype(obj)] = mt; -+ G(L)->mt[ttype_ext(obj)] = mt; - break; - } - } -@@ -1083,3 +1143,32 @@ - return name; - } - -+ -+/* Help function for 'luaB_tonumber()', avoids multiple str->number -+ * conversions for Lua "tonumber()". -+ * -+ * Also pushes floating point numbers with integer value as integer, which -+ * can be used by 'tonumber()' in scripts to bring values back to integer -+ * realm. -+ * -+ * Note: The 'back to integer realm' is _not_ to affect string conversions: -+ * 'tonumber("4294967295.1")' should give a floating point value, although -+ * the value would be 4294967296 (and storable in int64 realm). -+ */ -+int lua_pushvalue_as_number (lua_State *L, int idx) -+{ -+ const TValue *o = index2adr(L, idx); -+ TValue tmp; -+ lua_Integer i; -+ if (ttisnumber(o)) { -+ if ( (!ttisint(o)) && tt_integer_valued(o,&i)) { -+ lua_pushinteger( L, i ); -+ return 1; -+ } -+ } else if (!tonumber(o, &tmp)) { -+ return 0; -+ } -+ if (ttisint(o)) lua_pushinteger( L, ivalue(o) ); -+ else lua_pushnumber( L, nvalue_fast(o) ); -+ return 1; -+} -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lapi.h lua-5.1.3-patched/src/lapi.h ---- ../lua-5.1.3/src/lapi.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lapi.h 2008-03-03 12:47:53.000000000 +0200 -@@ -13,4 +13,6 @@ - - LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o); - -+int lua_pushvalue_as_number (lua_State *L, int idx); -+ - #endif -Binary files ../lua-5.1.3/src/lapi.o and lua-5.1.3-patched/src/lapi.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lauxlib.c lua-5.1.3-patched/src/lauxlib.c ---- ../lua-5.1.3/src/lauxlib.c 2008-01-21 15:20:51.000000000 +0200 -+++ lua-5.1.3-patched/src/lauxlib.c 2008-03-19 09:51:27.000000000 +0200 -@@ -23,7 +23,7 @@ - #include "lua.h" - - #include "lauxlib.h" -- -+#include "llimits.h" - - #define FREELIST_REF 0 /* free list of references */ - -@@ -66,7 +66,7 @@ - - - static void tag_error (lua_State *L, int narg, int tag) { -- luaL_typerror(L, narg, lua_typename(L, tag)); -+ luaL_typerror(L, narg, tag==LUA_TINT ? "integer" : lua_typename(L, tag)); - } - - -@@ -188,8 +188,8 @@ - - LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) { - lua_Integer d = lua_tointeger(L, narg); -- if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ -- tag_error(L, narg, LUA_TNUMBER); -+ if (d == 0 && !lua_isinteger(L, narg)) /* avoid extra test when d is not 0 */ -+ tag_error(L, narg, LUA_TINT); - return d; - } - -@@ -200,6 +200,16 @@ - } - - -+#ifdef LNUM_COMPLEX -+LUALIB_API lua_Complex luaL_checkcomplex (lua_State *L, int narg) { -+ lua_Complex c = lua_tocomplex(L, narg); -+ if (c == 0 && !lua_isnumber(L, narg)) /* avoid extra test when c is not 0 */ -+ tag_error(L, narg, LUA_TNUMBER); -+ return c; -+} -+#endif -+ -+ - LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { - if (!lua_getmetatable(L, obj)) /* no metatable? */ - return 0; -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lauxlib.h lua-5.1.3-patched/src/lauxlib.h ---- ../lua-5.1.3/src/lauxlib.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lauxlib.h 2008-03-12 23:15:22.000000000 +0200 -@@ -57,6 +57,12 @@ - LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); - LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, - lua_Integer def); -+#define luaL_checkint32(L,narg) ((int)luaL_checkinteger(L,narg)) -+#define luaL_optint32(L,narg,def) ((int)luaL_optinteger(L,narg,def)) -+ -+#ifdef LNUM_COMPLEX -+ LUALIB_API lua_Complex (luaL_checkcomplex) (lua_State *L, int narg); -+#endif - - LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); - LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); -Binary files ../lua-5.1.3/src/lauxlib.o and lua-5.1.3-patched/src/lauxlib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lbaselib.c lua-5.1.3-patched/src/lbaselib.c ---- ../lua-5.1.3/src/lbaselib.c 2008-01-20 15:53:22.000000000 +0200 -+++ lua-5.1.3-patched/src/lbaselib.c 2008-03-13 10:42:50.000000000 +0200 -@@ -18,7 +18,9 @@ - - #include "lauxlib.h" - #include "lualib.h" -- -+#include "llimits.h" -+#include "lobject.h" -+#include "lapi.h" - - - -@@ -54,20 +56,25 @@ - int base = luaL_optint(L, 2, 10); - if (base == 10) { /* standard conversion */ - luaL_checkany(L, 1); -- if (lua_isnumber(L, 1)) { -- lua_pushnumber(L, lua_tonumber(L, 1)); -+ if (lua_isnumber(L, 1)) { /* numeric string, or a number */ -+ lua_pushvalue_as_number(L,1); /* API extension (not to lose accuracy here) */ - return 1; -- } -+ } - } - else { - const char *s1 = luaL_checkstring(L, 1); - char *s2; -- unsigned long n; -+ unsigned LUA_INTEGER n; - luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); -- n = strtoul(s1, &s2, base); -+ n = lua_str2ul(s1, &s2, base); - if (s1 != s2) { /* at least one valid digit? */ - while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ - if (*s2 == '\0') { /* no invalid trailing characters? */ -+ -+ /* Push as number, there needs to be separate 'luaB_tointeger' for -+ * when the caller wants to preserve the bits (matters if unsigned -+ * values are used). -+ */ - lua_pushnumber(L, (lua_Number)n); - return 1; - } -@@ -144,7 +151,7 @@ - luaL_checktype(L, 2, LUA_TTABLE); - getfunc(L, 0); - lua_pushvalue(L, 2); -- if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { -+ if (lua_isnumber(L, 1) && lua_tointeger(L, 1) == 0) { - /* change environment of current thread */ - lua_pushthread(L); - lua_insert(L, -2); -@@ -209,7 +216,7 @@ - return 1; - } - default: { -- lua_pushnumber(L, res); -+ lua_pushinteger(L, res); - return 1; - } - } -@@ -629,6 +636,8 @@ - luaL_register(L, "_G", base_funcs); - lua_pushliteral(L, LUA_VERSION); - lua_setglobal(L, "_VERSION"); /* set global _VERSION */ -+ lua_pushliteral(L, LUA_LNUM); -+ lua_setglobal(L, "_LNUM"); /* "[complex] double|float|ldouble int32|int64" */ - /* `ipairs' and `pairs' need auxliliary functions as upvalues */ - auxopen(L, "ipairs", luaB_ipairs, ipairsaux); - auxopen(L, "pairs", luaB_pairs, luaB_next); -Binary files ../lua-5.1.3/src/lbaselib.o and lua-5.1.3-patched/src/lbaselib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lcode.c lua-5.1.3-patched/src/lcode.c ---- ../lua-5.1.3/src/lcode.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/lcode.c 2008-03-19 10:02:51.000000000 +0200 -@@ -22,13 +22,18 @@ - #include "lopcodes.h" - #include "lparser.h" - #include "ltable.h" -+#include "lnum.h" - - - #define hasjumps(e) ((e)->t != (e)->f) - -- - static int isnumeral(expdesc *e) { -- return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); -+ int ek= -+#ifdef LNUM_COMPLEX -+ (e->k == VKNUM2) || -+#endif -+ (e->k == VKINT) || (e->k == VKNUM); -+ return (ek && e->t == NO_JUMP && e->f == NO_JUMP); - } - - -@@ -231,12 +236,16 @@ - TValue *idx = luaH_set(L, fs->h, k); - Proto *f = fs->f; - int oldsize = f->sizek; -- if (ttisnumber(idx)) { -- lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v)); -- return cast_int(nvalue(idx)); -+ if (ttype(idx)==LUA_TNUMBER) { -+ luai_normalize(idx); -+ lua_assert( ttype(idx)==LUA_TINT ); /* had no fraction */ -+ } -+ if (ttisint(idx)) { -+ lua_assert(luaO_rawequalObj(&fs->f->k[ivalue(idx)], v)); -+ return cast_int(ivalue(idx)); - } - else { /* constant not found; create a new entry */ -- setnvalue(idx, cast_num(fs->nk)); -+ setivalue(idx, fs->nk); - luaM_growvector(L, f->k, fs->nk, f->sizek, TValue, - MAXARG_Bx, "constant table overflow"); - while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); -@@ -261,6 +270,21 @@ - } - - -+int luaK_integerK (FuncState *fs, lua_Integer r) { -+ TValue o; -+ setivalue(&o, r); -+ return addk(fs, &o, &o); -+} -+ -+ -+#ifdef LNUM_COMPLEX -+static int luaK_imagK (FuncState *fs, lua_Number r) { -+ TValue o; -+ setnvalue_complex(&o, r*I); -+ return addk(fs, &o, &o); -+} -+#endif -+ - static int boolK (FuncState *fs, int b) { - TValue o; - setbvalue(&o, b); -@@ -359,6 +383,16 @@ - luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); - break; - } -+ case VKINT: { -+ luaK_codeABx(fs, OP_LOADK, reg, luaK_integerK(fs, e->u.ival)); -+ break; -+ } -+#ifdef LNUM_COMPLEX -+ case VKNUM2: { -+ luaK_codeABx(fs, OP_LOADK, reg, luaK_imagK(fs, e->u.nval)); -+ break; -+ } -+#endif - case VRELOCABLE: { - Instruction *pc = &getcode(fs, e); - SETARG_A(*pc, reg); -@@ -444,6 +478,10 @@ - int luaK_exp2RK (FuncState *fs, expdesc *e) { - luaK_exp2val(fs, e); - switch (e->k) { -+#ifdef LNUM_COMPLEX -+ case VKNUM2: -+#endif -+ case VKINT: - case VKNUM: - case VTRUE: - case VFALSE: -@@ -451,6 +489,10 @@ - if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */ - e->u.s.info = (e->k == VNIL) ? nilK(fs) : - (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) : -+ (e->k == VKINT) ? luaK_integerK(fs, e->u.ival) : -+#ifdef LNUM_COMPLEX -+ (e->k == VKNUM2) ? luaK_imagK(fs, e->u.nval) : -+#endif - boolK(fs, (e->k == VTRUE)); - e->k = VK; - return RKASK(e->u.s.info); -@@ -540,7 +582,10 @@ - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { -- case VK: case VKNUM: case VTRUE: { -+#ifdef LNUM_COMPLEX -+ case VKNUM2: -+#endif -+ case VKINT: case VK: case VKNUM: case VTRUE: { - pc = NO_JUMP; /* always true; do nothing */ - break; - } -@@ -598,7 +643,10 @@ - e->k = VTRUE; - break; - } -- case VK: case VKNUM: case VTRUE: { -+#ifdef LNUM_COMPLEX -+ case VKNUM2: -+#endif -+ case VKINT: case VK: case VKNUM: case VTRUE: { - e->k = VFALSE; - break; - } -@@ -634,25 +682,70 @@ - - static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { - lua_Number v1, v2, r; -+ int vkres= VKNUM; - if (!isnumeral(e1) || !isnumeral(e2)) return 0; -- v1 = e1->u.nval; -- v2 = e2->u.nval; -+ -+ /* real and imaginary parts don't mix. */ -+#ifdef LNUM_COMPLEX -+ if (e1->k == VKNUM2) { -+ if ((op != OP_UNM) && (e2->k != VKNUM2)) return 0; -+ vkres= VKNUM2; } -+ else if (e2->k == VKNUM2) { return 0; } -+#endif -+ if ((e1->k == VKINT) && (e2->k == VKINT)) { -+ lua_Integer i1= e1->u.ival, i2= e2->u.ival; -+ lua_Integer rr; -+ int done= 0; -+ /* Integer/integer calculations (may end up producing floating point) */ -+ switch (op) { -+ case OP_ADD: done= try_addint( &rr, i1, i2 ); break; -+ case OP_SUB: done= try_subint( &rr, i1, i2 ); break; -+ case OP_MUL: done= try_mulint( &rr, i1, i2 ); break; -+ case OP_DIV: done= try_divint( &rr, i1, i2 ); break; -+ case OP_MOD: done= try_modint( &rr, i1, i2 ); break; -+ case OP_POW: done= try_powint( &rr, i1, i2 ); break; -+ case OP_UNM: done= try_unmint( &rr, i1 ); break; -+ default: done= 0; break; -+ } -+ if (done) { -+ e1->u.ival = rr; /* remained within integer range */ -+ return 1; -+ } -+ } -+ v1 = (e1->k == VKINT) ? ((lua_Number)e1->u.ival) : e1->u.nval; -+ v2 = (e2->k == VKINT) ? ((lua_Number)e2->u.ival) : e2->u.nval; -+ - switch (op) { - case OP_ADD: r = luai_numadd(v1, v2); break; - case OP_SUB: r = luai_numsub(v1, v2); break; -- case OP_MUL: r = luai_nummul(v1, v2); break; -+ case OP_MUL: -+#ifdef LNUM_COMPLEX -+ if (vkres==VKNUM2) return 0; /* leave to runtime (could do here, but not worth it?) */ -+#endif -+ r = luai_nummul(v1, v2); break; - case OP_DIV: - if (v2 == 0) return 0; /* do not attempt to divide by 0 */ -- r = luai_numdiv(v1, v2); break; -+#ifdef LNUM_COMPLEX -+ if (vkres==VKNUM2) return 0; /* leave to runtime */ -+#endif -+ r = luai_numdiv(v1, v2); break; - case OP_MOD: - if (v2 == 0) return 0; /* do not attempt to divide by 0 */ -+#ifdef LNUM_COMPLEX -+ if (vkres==VKNUM2) return 0; /* leave to runtime */ -+#endif - r = luai_nummod(v1, v2); break; -- case OP_POW: r = luai_numpow(v1, v2); break; -+ case OP_POW: -+#ifdef LNUM_COMPLEX -+ if (vkres==VKNUM2) return 0; /* leave to runtime */ -+#endif -+ r = luai_numpow(v1, v2); break; - case OP_UNM: r = luai_numunm(v1); break; - case OP_LEN: return 0; /* no constant folding for 'len' */ - default: lua_assert(0); r = 0; break; - } - if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */ -+ e1->k = cast(expkind,vkres); - e1->u.nval = r; - return 1; - } -@@ -696,7 +789,8 @@ - - void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { - expdesc e2; -- e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; -+ e2.t = e2.f = NO_JUMP; e2.k = VKINT; e2.u.ival = 0; -+ - switch (op) { - case OPR_MINUS: { - if (!isnumeral(e)) -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lcode.h lua-5.1.3-patched/src/lcode.h ---- ../lua-5.1.3/src/lcode.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lcode.h 2008-03-03 12:47:53.000000000 +0200 -@@ -71,6 +71,6 @@ - LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); - LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); - LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); -- -+LUAI_FUNC int luaK_integerK (FuncState *fs, lua_Integer r); - - #endif -Binary files ../lua-5.1.3/src/lcode.o and lua-5.1.3-patched/src/lcode.o differ -Binary files ../lua-5.1.3/src/ldblib.o and lua-5.1.3-patched/src/ldblib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ldebug.c lua-5.1.3-patched/src/ldebug.c ---- ../lua-5.1.3/src/ldebug.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/ldebug.c 2008-03-06 22:41:08.000000000 +0200 -@@ -183,7 +183,7 @@ - int *lineinfo = f->l.p->lineinfo; - int i; - for (i=0; il.p->sizelineinfo; i++) -- setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); -+ setbvalue(luaH_setint(L, t, lineinfo[i]), 1); - sethvalue(L, L->top, t); - } - incr_top(L); -@@ -550,7 +550,7 @@ - - void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { - const char *name = NULL; -- const char *t = luaT_typenames[ttype(o)]; -+ const char *t = luaT_typenames[ttype_ext(o)]; - const char *kind = (isinstack(L->ci, o)) ? - getobjname(L, L->ci, cast_int(o - L->base), &name) : - NULL; -@@ -578,8 +578,8 @@ - - - int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { -- const char *t1 = luaT_typenames[ttype(p1)]; -- const char *t2 = luaT_typenames[ttype(p2)]; -+ const char *t1 = luaT_typenames[ttype_ext(p1)]; -+ const char *t2 = luaT_typenames[ttype_ext(p2)]; - if (t1[2] == t2[2]) - luaG_runerror(L, "attempt to compare two %s values", t1); - else -Binary files ../lua-5.1.3/src/ldebug.o and lua-5.1.3-patched/src/ldebug.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ldo.c lua-5.1.3-patched/src/ldo.c ---- ../lua-5.1.3/src/ldo.c 2008-01-19 00:31:22.000000000 +0200 -+++ lua-5.1.3-patched/src/ldo.c 2008-03-06 22:41:31.000000000 +0200 -@@ -219,9 +219,9 @@ - luaC_checkGC(L); - htab = luaH_new(L, nvar, 1); /* create `arg' table */ - for (i=0; itop - nvar + i); -+ setobj2n(L, luaH_setint(L, htab, i+1), L->top - nvar + i); - /* store counter in field `n' */ -- setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); -+ setivalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), nvar); - } - #endif - /* move fixed parameters to final position */ -Binary files ../lua-5.1.3/src/ldo.o and lua-5.1.3-patched/src/ldo.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ldump.c lua-5.1.3-patched/src/ldump.c ---- ../lua-5.1.3/src/ldump.c 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/ldump.c 2008-03-03 12:47:53.000000000 +0200 -@@ -52,6 +52,11 @@ - DumpVar(x,D); - } - -+static void DumpInteger(lua_Integer x, DumpState* D) -+{ -+ DumpVar(x,D); -+} -+ - static void DumpVector(const void* b, int n, size_t size, DumpState* D) - { - DumpInt(n,D); -@@ -93,8 +98,11 @@ - DumpChar(bvalue(o),D); - break; - case LUA_TNUMBER: -- DumpNumber(nvalue(o),D); -+ DumpNumber(nvalue_fast(o),D); - break; -+ case LUA_TINT: -+ DumpInteger(ivalue(o),D); -+ break; - case LUA_TSTRING: - DumpString(rawtsvalue(o),D); - break; -Binary files ../lua-5.1.3/src/ldump.o and lua-5.1.3-patched/src/ldump.o differ -Binary files ../lua-5.1.3/src/lfunc.o and lua-5.1.3-patched/src/lfunc.o differ -Binary files ../lua-5.1.3/src/lgc.o and lua-5.1.3-patched/src/lgc.o differ -Binary files ../lua-5.1.3/src/liblua.a and lua-5.1.3-patched/src/liblua.a differ -Binary files ../lua-5.1.3/src/linit.o and lua-5.1.3-patched/src/linit.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/liolib.c lua-5.1.3-patched/src/liolib.c ---- ../lua-5.1.3/src/liolib.c 2008-01-18 19:47:43.000000000 +0200 -+++ lua-5.1.3-patched/src/liolib.c 2008-03-19 10:10:09.000000000 +0200 -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - - #define liolib_c - #define LUA_LIB -@@ -18,7 +19,8 @@ - #include "lauxlib.h" - #include "lualib.h" - -- -+#include "lnum.h" -+#include "llex.h" - - #define IO_INPUT 1 - #define IO_OUTPUT 2 -@@ -269,6 +271,13 @@ - ** ======================================================= - */ - -+/* -+* Many problems if we intend the same 'n' format specifier (see 'file:read()') -+* to work for both FP and integer numbers, without losing their accuracy. So -+* we don't. 'n' reads numbers as floating points, 'i' as integers. Old code -+* remains valid, but won't provide full integer accuracy (this only matters -+* with float FP and/or 64-bit integers). -+*/ - - static int read_number (lua_State *L, FILE *f) { - lua_Number d; -@@ -279,6 +288,43 @@ - else return 0; /* read fails */ - } - -+static int read_integer (lua_State *L, FILE *f) { -+ lua_Integer i; -+ if (fscanf(f, LUA_INTEGER_SCAN, &i) == 1) { -+ lua_pushinteger(L, i); -+ return 1; -+ } -+ else return 0; /* read fails */ -+} -+ -+#ifdef LNUM_COMPLEX -+static int read_complex (lua_State *L, FILE *f) { -+ /* NNN / NNNi / NNN+MMMi / NNN-MMMi */ -+ lua_Number a,b; -+ if (fscanf(f, LUA_NUMBER_SCAN, &a) == 1) { -+ int c=fgetc(f); -+ switch(c) { -+ case 'i': -+ lua_pushcomplex(L, a*I); -+ return 1; -+ case '+': -+ case '-': -+ /* "i" is consumed if at the end; just 'NNN+MMM' will most likely -+ * behave as if "i" was there? (TBD: test) -+ */ -+ if (fscanf(f, LUA_NUMBER_SCAN "i", &b) == 1) { -+ lua_pushcomplex(L, a+ (c=='+' ? b:-b)*I); -+ return 1; -+ } -+ } -+ ungetc( c,f ); -+ lua_pushnumber(L,a); /*real part only*/ -+ return 1; -+ } -+ return 0; /* read fails */ -+} -+#endif -+ - - static int test_eof (lua_State *L, FILE *f) { - int c = getc(f); -@@ -352,6 +398,14 @@ - case 'n': /* number */ - success = read_number(L, f); - break; -+ case 'i': /* integer (full accuracy) */ -+ success = read_integer(L, f); -+ break; -+#ifdef LNUM_COMPLEX -+ case 'c': /* complex */ -+ success = read_complex(L, f); -+ break; -+#endif - case 'l': /* line */ - success = read_line(L, f); - break; -@@ -412,9 +466,10 @@ - int status = 1; - for (; nargs--; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { -- /* optimization: could be done exactly as for strings */ -- status = status && -- fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; -+ if (lua_isinteger(L,arg)) -+ status = status && fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg)) > 0; -+ else -+ status = status && fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; - } - else { - size_t l; -@@ -457,7 +512,7 @@ - static const char *const modenames[] = {"no", "full", "line", NULL}; - FILE *f = tofile(L); - int op = luaL_checkoption(L, 2, NULL, modenames); -- lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); -+ size_t sz = luaL_optint32(L, 3, LUAL_BUFFERSIZE); - int res = setvbuf(f, NULL, mode[op], sz); - return pushresult(L, res == 0, NULL); - } -Binary files ../lua-5.1.3/src/liolib.o and lua-5.1.3-patched/src/liolib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/llex.c lua-5.1.3-patched/src/llex.c ---- ../lua-5.1.3/src/llex.c 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/llex.c 2008-03-04 11:10:30.000000000 +0200 -@@ -22,6 +22,7 @@ - #include "lstring.h" - #include "ltable.h" - #include "lzio.h" -+#include "lnum.h" - - - -@@ -34,13 +35,17 @@ - - - /* ORDER RESERVED */ --const char *const luaX_tokens [] = { -+static const char *const luaX_tokens [] = { - "and", "break", "do", "else", "elseif", - "end", "false", "for", "function", "if", - "in", "local", "nil", "not", "or", "repeat", - "return", "then", "true", "until", "while", - "..", "...", "==", ">=", "<=", "~=", - "", "", "", "", -+ "", -+#ifdef LNUM_COMPLEX -+ "", -+#endif - NULL - }; - -@@ -90,7 +95,11 @@ - switch (token) { - case TK_NAME: - case TK_STRING: -+ case TK_INT: - case TK_NUMBER: -+#ifdef LNUM_COMPLEX -+ case TK_NUMBER2: -+#endif - save(ls, '\0'); - return luaZ_buffer(ls->buff); - default: -@@ -173,23 +182,27 @@ - if (p[n] == from) p[n] = to; - } - -- --static void trydecpoint (LexState *ls, SemInfo *seminfo) { -+/* TK_NUMBER (/ TK_NUMBER2) */ -+static int trydecpoint (LexState *ls, SemInfo *seminfo) { - /* format error: try to update decimal point separator */ - struct lconv *cv = localeconv(); - char old = ls->decpoint; -+ int ret; - ls->decpoint = (cv ? cv->decimal_point[0] : '.'); - buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ -- if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { -+ ret= luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r, NULL); -+ if (!ret) { - /* format error with correct decimal point: no more options */ - buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ - luaX_lexerror(ls, "malformed number", TK_NUMBER); - } -+ return ret; - } - - --/* LUA_NUMBER */ --static void read_numeral (LexState *ls, SemInfo *seminfo) { -+/* TK_NUMBER / TK_INT (/TK_NUMBER2) */ -+static int read_numeral (LexState *ls, SemInfo *seminfo) { -+ int ret; - lua_assert(isdigit(ls->current)); - do { - save_and_next(ls); -@@ -200,8 +213,9 @@ - save_and_next(ls); - save(ls, '\0'); - buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ -- if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ -- trydecpoint(ls, seminfo); /* try to update decimal point separator */ -+ ret= luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r, &seminfo->i ); -+ if (!ret) return trydecpoint(ls, seminfo); /* try to update decimal point separator */ -+ return ret; - } - - -@@ -329,6 +343,7 @@ - } - - -+/* char / TK_* */ - static int llex (LexState *ls, SemInfo *seminfo) { - luaZ_resetbuffer(ls->buff); - for (;;) { -@@ -400,8 +415,7 @@ - } - else if (!isdigit(ls->current)) return '.'; - else { -- read_numeral(ls, seminfo); -- return TK_NUMBER; -+ return read_numeral(ls, seminfo); - } - } - case EOZ: { -@@ -414,8 +428,7 @@ - continue; - } - else if (isdigit(ls->current)) { -- read_numeral(ls, seminfo); -- return TK_NUMBER; -+ return read_numeral(ls, seminfo); - } - else if (isalpha(ls->current) || ls->current == '_') { - /* identifier or reserved word */ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/llex.h lua-5.1.3-patched/src/llex.h ---- ../lua-5.1.3/src/llex.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/llex.h 2008-03-04 11:12:08.000000000 +0200 -@@ -29,19 +29,22 @@ - TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, - /* other terminal symbols */ - TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, -- TK_NAME, TK_STRING, TK_EOS -+ TK_NAME, TK_STRING, TK_EOS, TK_INT -+#ifdef LNUM_COMPLEX -+ , TK_NUMBER2 /* imaginary constants: Ni */ -+#endif - }; - - /* number of reserved words */ - #define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) - - --/* array with token `names' */ --LUAI_DATA const char *const luaX_tokens []; -- -- -+/* SemInfo is a local data structure of 'llex.c', used for carrying a string -+ * or a number. A separate token (TK_*) will tell, how to interpret the data. -+ */ - typedef union { - lua_Number r; -+ lua_Integer i; - TString *ts; - } SemInfo; /* semantics information */ - -Binary files ../lua-5.1.3/src/llex.o and lua-5.1.3-patched/src/llex.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/llimits.h lua-5.1.3-patched/src/llimits.h ---- ../lua-5.1.3/src/llimits.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/llimits.h 2008-03-04 11:16:43.000000000 +0200 -@@ -49,6 +49,7 @@ - - /* result of a `usual argument conversion' over lua_Number */ - typedef LUAI_UACNUMBER l_uacNumber; -+typedef LUAI_UACINTEGER l_uacInteger; - - - /* internal assertions for in-house debugging */ -@@ -80,7 +81,6 @@ - #define cast_int(i) cast(int, (i)) - - -- - /* - ** type for virtual-machine instructions - ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lmathlib.c lua-5.1.3-patched/src/lmathlib.c ---- ../lua-5.1.3/src/lmathlib.c 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lmathlib.c 2008-03-26 11:32:25.000000000 +0200 -@@ -4,7 +4,6 @@ - ** See Copyright Notice in lua.h - */ - -- - #include - #include - -@@ -16,113 +15,210 @@ - #include "lauxlib.h" - #include "lualib.h" - -+/* 'luai_vectpow()' as a replacement for 'cpow()'. Defined in the header; we -+ * don't intrude the code libs internal functions. -+ */ -+#ifdef LNUM_COMPLEX -+# include "lnum.h" -+#endif - - #undef PI --#define PI (3.14159265358979323846) --#define RADIANS_PER_DEGREE (PI/180.0) -- -+#ifdef LNUM_FLOAT -+# define PI (3.14159265358979323846F) -+#elif defined(M_PI) -+# define PI M_PI -+#else -+# define PI (3.14159265358979323846264338327950288) -+#endif -+#define RADIANS_PER_DEGREE (PI/180) - -+#undef HUGE -+#ifdef LNUM_FLOAT -+# define HUGE HUGE_VALF -+#elif defined(LNUM_LDOUBLE) -+# define HUGE HUGE_VALL -+#else -+# define HUGE HUGE_VAL -+#endif - - static int math_abs (lua_State *L) { -- lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushnumber(L, _LF(cabs) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(fabs) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_sin (lua_State *L) { -- lua_pushnumber(L, sin(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(csin) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(sin) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_sinh (lua_State *L) { -- lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(csinh) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(sinh) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_cos (lua_State *L) { -- lua_pushnumber(L, cos(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(ccos) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(cos) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_cosh (lua_State *L) { -- lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(ccosh) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(cosh) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_tan (lua_State *L) { -- lua_pushnumber(L, tan(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(ctan) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(tan) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_tanh (lua_State *L) { -- lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(ctanh) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(tanh) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_asin (lua_State *L) { -- lua_pushnumber(L, asin(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(casin) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(asin) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_acos (lua_State *L) { -- lua_pushnumber(L, acos(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(cacos) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(acos) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_atan (lua_State *L) { -- lua_pushnumber(L, atan(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(catan) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(atan) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_atan2 (lua_State *L) { -- lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); -+ /* scalars only */ -+ lua_pushnumber(L, _LF(atan2) (luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; - } - - static int math_ceil (lua_State *L) { -- lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_Complex v= luaL_checkcomplex(L, 1); -+ lua_pushcomplex(L, _LF(ceil) (_LF(creal)(v)) + _LF(ceil) (_LF(cimag)(v))*I); -+#else -+ lua_pushnumber(L, _LF(ceil) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_floor (lua_State *L) { -- lua_pushnumber(L, floor(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_Complex v= luaL_checkcomplex(L, 1); -+ lua_pushcomplex(L, _LF(floor) (_LF(creal)(v)) + _LF(floor) (_LF(cimag)(v))*I); -+#else -+ lua_pushnumber(L, _LF(floor) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - --static int math_fmod (lua_State *L) { -- lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); -+static int math_fmod (lua_State *L) { -+ /* scalars only */ -+ lua_pushnumber(L, _LF(fmod) (luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; - } - - static int math_modf (lua_State *L) { -- double ip; -- double fp = modf(luaL_checknumber(L, 1), &ip); -+ /* scalars only */ -+ lua_Number ip; -+ lua_Number fp = _LF(modf) (luaL_checknumber(L, 1), &ip); - lua_pushnumber(L, ip); - lua_pushnumber(L, fp); - return 2; - } - - static int math_sqrt (lua_State *L) { -- lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(csqrt) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(sqrt) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_pow (lua_State *L) { -- lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); -+#ifdef LNUM_COMPLEX -+ /* C99 'cpow' gives somewhat inaccurate results (i.e. (-1)^2 = -1+1.2246467991474e-16i). -+ * 'luai_vectpow' smoothens such, reusing it is the reason we need to #include "lnum.h". -+ */ -+ lua_pushcomplex(L, luai_vectpow(luaL_checkcomplex(L,1), luaL_checkcomplex(L,2))); -+#else -+ lua_pushnumber(L, _LF(pow) (luaL_checknumber(L, 1), luaL_checknumber(L, 2))); -+#endif - return 1; - } - - static int math_log (lua_State *L) { -- lua_pushnumber(L, log(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(clog) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(log) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_log10 (lua_State *L) { -- lua_pushnumber(L, log10(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ /* Not in standard , but easy to calculate: log_a(x) = log_b(x) / log_b(a) -+ */ -+ lua_pushcomplex(L, _LF(clog) (luaL_checkcomplex(L,1)) / _LF(log) (10)); -+#else -+ lua_pushnumber(L, _LF(log10) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - - static int math_exp (lua_State *L) { -- lua_pushnumber(L, exp(luaL_checknumber(L, 1))); -+#ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(cexp) (luaL_checkcomplex(L,1))); -+#else -+ lua_pushnumber(L, _LF(exp) (luaL_checknumber(L, 1))); -+#endif - return 1; - } - -@@ -138,19 +234,20 @@ - - static int math_frexp (lua_State *L) { - int e; -- lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); -+ lua_pushnumber(L, _LF(frexp) (luaL_checknumber(L, 1), &e)); - lua_pushinteger(L, e); - return 2; - } - - static int math_ldexp (lua_State *L) { -- lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); -+ lua_pushnumber(L, _LF(ldexp) (luaL_checknumber(L, 1), luaL_checkint(L, 2))); - return 1; - } - - - - static int math_min (lua_State *L) { -+ /* scalars only */ - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmin = luaL_checknumber(L, 1); - int i; -@@ -165,6 +262,7 @@ - - - static int math_max (lua_State *L) { -+ /* scalars only */ - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmax = luaL_checknumber(L, 1); - int i; -@@ -182,25 +280,20 @@ - /* the `%' avoids the (rare) case of r==1, and is needed also because on - some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ - lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; -- switch (lua_gettop(L)) { /* check number of arguments */ -- case 0: { /* no arguments */ -- lua_pushnumber(L, r); /* Number between 0 and 1 */ -- break; -- } -- case 1: { /* only upper limit */ -- int u = luaL_checkint(L, 1); -- luaL_argcheck(L, 1<=u, 1, "interval is empty"); -- lua_pushnumber(L, floor(r*u)+1); /* int between 1 and `u' */ -- break; -- } -- case 2: { /* lower and upper limits */ -- int l = luaL_checkint(L, 1); -- int u = luaL_checkint(L, 2); -- luaL_argcheck(L, l<=u, 2, "interval is empty"); -- lua_pushnumber(L, floor(r*(u-l+1))+l); /* int between `l' and `u' */ -- break; -- } -- default: return luaL_error(L, "wrong number of arguments"); -+ int n= lua_gettop(L); /* number of arguments */ -+ if (n==0) { /* no arguments: range [0,1) */ -+ lua_pushnumber(L, r); -+ } else if (n<=2) { /* int range [1,u] or [l,u] */ -+ int l= n==1 ? 1 : luaL_checkint(L, 1); -+ int u = luaL_checkint(L, n); -+ int tmp; -+ lua_Number d; -+ luaL_argcheck(L, l<=u, n, "interval is empty"); -+ d= _LF(floor)(r*(u-l+1)); -+ lua_number2int(tmp,d); -+ lua_pushinteger(L, l+tmp); -+ } else { -+ return luaL_error(L, "wrong number of arguments"); - } - return 1; - } -@@ -211,6 +304,66 @@ - return 0; - } - -+/* -+* Lua 5.1 does not have acosh, asinh, atanh for scalars (not ANSI C) -+*/ -+#if __STDC_VERSION__ >= 199901L -+static int math_acosh (lua_State *L) { -+# ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(cacosh) (luaL_checkcomplex(L,1))); -+# else -+ lua_pushnumber(L, _LF(acosh) (luaL_checknumber(L,1))); -+# endif -+ return 1; -+} -+static int math_asinh (lua_State *L) { -+# ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(casinh) (luaL_checkcomplex(L,1))); -+# else -+ lua_pushnumber(L, _LF(asinh) (luaL_checknumber(L,1))); -+# endif -+ return 1; -+} -+static int math_atanh (lua_State *L) { -+# ifdef LNUM_COMPLEX -+ lua_pushcomplex(L, _LF(catanh) (luaL_checkcomplex(L,1))); -+# else -+ lua_pushnumber(L, _LF(atanh) (luaL_checknumber(L,1))); -+# endif -+ return 1; -+} -+#endif -+ -+/* -+ * C99 complex functions, not covered above. -+*/ -+#ifdef LNUM_COMPLEX -+static int math_arg (lua_State *L) { -+ lua_pushnumber(L, _LF(carg) (luaL_checkcomplex(L,1))); -+ return 1; -+} -+ -+static int math_imag (lua_State *L) { -+ lua_pushnumber(L, _LF(cimag) (luaL_checkcomplex(L,1))); -+ return 1; -+} -+ -+static int math_real (lua_State *L) { -+ lua_pushnumber(L, _LF(creal) (luaL_checkcomplex(L,1))); -+ return 1; -+} -+ -+static int math_conj (lua_State *L) { -+ lua_pushcomplex(L, _LF(conj) (luaL_checkcomplex(L,1))); -+ return 1; -+} -+ -+static int math_proj (lua_State *L) { -+ lua_pushcomplex(L, _LF(cproj) (luaL_checkcomplex(L,1))); -+ return 1; -+} -+#endif -+ - - static const luaL_Reg mathlib[] = { - {"abs", math_abs}, -@@ -241,6 +394,18 @@ - {"sqrt", math_sqrt}, - {"tanh", math_tanh}, - {"tan", math_tan}, -+#if __STDC_VERSION__ >= 199901L -+ {"acosh", math_acosh}, -+ {"asinh", math_asinh}, -+ {"atanh", math_atanh}, -+#endif -+#ifdef LNUM_COMPLEX -+ {"arg", math_arg}, -+ {"imag", math_imag}, -+ {"real", math_real}, -+ {"conj", math_conj}, -+ {"proj", math_proj}, -+#endif - {NULL, NULL} - }; - -@@ -252,8 +417,10 @@ - luaL_register(L, LUA_MATHLIBNAME, mathlib); - lua_pushnumber(L, PI); - lua_setfield(L, -2, "pi"); -- lua_pushnumber(L, HUGE_VAL); -+ lua_pushnumber(L, HUGE); - lua_setfield(L, -2, "huge"); -+ lua_pushinteger(L, LUA_INTEGER_MAX ); -+ lua_setfield(L, -2, "hugeint"); - #if defined(LUA_COMPAT_MOD) - lua_getfield(L, -1, "fmod"); - lua_setfield(L, -2, "mod"); -Binary files ../lua-5.1.3/src/lmathlib.o and lua-5.1.3-patched/src/lmathlib.o differ -Binary files ../lua-5.1.3/src/lmem.o and lua-5.1.3-patched/src/lmem.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lnum.c lua-5.1.3-patched/src/lnum.c ---- ../lua-5.1.3/src/lnum.c 1970-01-01 02:00:00.000000000 +0200 -+++ lua-5.1.3-patched/src/lnum.c 2008-03-26 11:32:25.000000000 +0200 -@@ -0,0 +1,312 @@ -+/* -+** $Id: lnum.c,v ... $ -+** Internal number model -+** See Copyright Notice in lua.h -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define lnum_c -+#define LUA_CORE -+ -+#include "lua.h" -+#include "llex.h" -+#include "lnum.h" -+ -+/* -+** lua_real2str converts a (non-complex) number to a string. -+** lua_str2real converts a string to a (non-complex) number. -+*/ -+#define lua_real2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -+ -+/* -+* Note: Only 'strtod()' is part of ANSI C; others are C99 and -+* may need '--std=c99' compiler setting (at least on Ubuntu 7.10). -+* -+* Visual C++ 2008 Express does not have 'strtof()', nor 'strtold()'. -+* References to '_strtold()' exist but don't compile. It seems best -+* to leave Windows users with DOUBLE only (or compile with MinGW). -+* -+* In practise, using '(long double)strtod' is a risky thing, since -+* it will cause accuracy loss in reading in numbers, and such losses -+* will pile up in later processing. Get a real 'strtold()' or don't -+* use that mode at all. -+*/ -+#ifdef LNUM_DOUBLE -+# define lua_str2real strtod -+#elif defined(LNUM_FLOAT) -+# define lua_str2real strtof -+#elif defined(LNUM_LDOUBLE) -+# define lua_str2real strtold -+#endif -+ -+#define lua_integer2str(s,v) sprintf((s), LUA_INTEGER_FMT, (v)) -+ -+/* 's' is expected to be LUAI_MAXNUMBER2STR long (enough for any number) -+*/ -+void luaO_num2buf( char *s, const TValue *o ) -+{ -+ lua_Number n; -+ lua_assert( ttisnumber(o) ); -+ -+ /* Reason to handle integers differently is not only speed, but accuracy as -+ * well. We want to make any integer tostring() without roundings, at all. -+ */ -+ if (ttisint(o)) { -+ lua_integer2str( s, ivalue(o) ); -+ return; -+ } -+ n= nvalue_fast(o); -+ lua_real2str(s, n); -+ -+#ifdef LNUM_COMPLEX -+ lua_Number n2= nvalue_img_fast(o); -+ if (n2!=0) { /* Postfix with +-Ni */ -+ int re0= (n == 0); -+ char *s2= re0 ? s : strchr(s,'\0'); -+ if ((!re0) && (n2>0)) *s2++= '+'; -+ lua_real2str( s2, n2 ); -+ strcat(s2,"i"); -+ } -+#endif -+} -+ -+/* -+* If a LUA_TNUMBER has integer value, give it. -+*/ -+int /*bool*/ tt_integer_valued( const TValue *o, lua_Integer *ref ) { -+ lua_Number d; -+ lua_Integer i; -+ -+ lua_assert( ttype(o)==LUA_TNUMBER ); -+ lua_assert( ref ); -+#ifdef LNUM_COMPLEX -+ if (nvalue_img_fast(o)!=0) return 0; -+#endif -+ d= nvalue_fast(o); -+ lua_number2integer(i, d); -+ if (cast_num(i) == d) { -+ *ref= i; return 1; -+ } -+ return 0; -+} -+ -+/* -+ * Lua 5.1.3 (using 'strtod()') allows 0x+hex but not 0+octal. This is good, -+ * and we should NOT use 'autobase' 0 with 'strtoul[l]()' for this reason. -+ * -+ * Lua 5.1.3 allows '0x...' numbers to overflow and lose precision; this is not -+ * good. On Visual C++ 2008, 'strtod()' does not even take them in. Better to -+ * require hex values to fit 'lua_Integer' or give an error that they don't? -+ * -+ * Full hex range (0 .. 0xff..ff) is stored as integers, not to lose any bits. -+ * Numerical value of 0xff..ff will be -1, if used in calculations. -+ * -+ * Returns: TK_INT for a valid integer, '*endptr_ref' updated -+ * TK_NUMBER for seemingly numeric, to be parsed as floating point -+ * 0 for bad characters, not a number (or '0x' out of range) -+ */ -+static int luaO_str2i (const char *s, lua_Integer *res, char **endptr_ref) { -+ char *endptr; -+ /* 'v' gets ULONG_MAX on possible overflow (which is > LUA_INTEGER_MAX); -+ * we don't have to check 'errno' here. -+ */ -+ unsigned LUA_INTEGER v= lua_str2ul(s, &endptr, 10); -+ if (endptr == s) return 0; /* nothing numeric */ -+ if (v==0 && *endptr=='x') { -+ errno= 0; /* needs to be set, 'strtoul[l]' does not clear it */ -+ v= lua_str2ul(endptr+1, &endptr, 16); /* retry as hex, unsigned range */ -+ if (errno==ERANGE) { /* clamped to 0xff..ff */ -+#if (defined(LNUM_INT32) && !defined(LNUM_FLOAT)) || defined(LNUM_LDOUBLE) -+ return TK_NUMBER; /* Allow to be read as floating point (has more integer range) */ -+#else -+ return 0; /* Reject the number */ -+#endif -+ } -+ } else if ((v > LUA_INTEGER_MAX) || (*endptr && (!isspace(*endptr)))) { -+ return TK_NUMBER; /* not in signed range, or has '.', 'e' etc. trailing */ -+ } -+ *res= (lua_Integer)v; -+ *endptr_ref= endptr; -+ return TK_INT; -+} -+ -+/* 0 / TK_NUMBER / TK_INT (/ TK_NUMBER2) */ -+int luaO_str2d (const char *s, lua_Number *res_n, lua_Integer *res_i) { -+ char *endptr; -+ int ret= TK_NUMBER; -+ /* Check integers first, if caller is allowing. -+ * If 'res2'==NULL, they're only looking for floating point. -+ */ -+ if (res_i) { -+ ret= luaO_str2i(s,res_i,&endptr); -+ if (ret==0) return 0; -+ } -+ if (ret==TK_NUMBER) { -+ lua_assert(res_n); -+ /* Note: Visual C++ 2008 Express 'strtod()' does not read in "0x..." -+ * numbers; it will read '0' and spit 'x' as endptr. -+ * This means hex constants not fitting in 'lua_Integer' won't -+ * be read in at all. What to do? -+ */ -+ *res_n = lua_str2real(s, &endptr); -+ if (endptr == s) return 0; /* conversion failed */ -+ /* Visual C++ 2008 'strtod()' does not allow "0x..." input. */ -+#if defined(_MSC_VER) && !defined(LNUM_FLOAT) && !defined(LNUM_INT64) -+ if (*res_n==0 && *endptr=='x') { -+ /* Hex constant too big for 'lua_Integer' but that could fit in 'lua_Number' -+ * integer bits -+ */ -+ unsigned __int64 v= _strtoui64( s, &endptr, 16 ); -+ /* We just let > 64 bit values be clamped to _UI64_MAX (MSDN does not say 'errno'==ERANGE would be set) */ -+ *res_n= cast_num(v); -+ if (*res_n != v) return 0; /* Would have lost accuracy */ -+ } -+#endif -+#ifdef LNUM_COMPLEX -+ if (*endptr == 'i') { endptr++; ret= TK_NUMBER2; } -+#endif -+ } -+ if (*endptr) { -+ while (isspace(cast(unsigned char, *endptr))) endptr++; -+ if (*endptr) return 0; /* invalid trail */ -+ } -+ return ret; -+} -+ -+ -+/* Functions for finding out, when integer operations remain in range -+ * (and doing them). -+ */ -+int try_addint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib+ic; /* may overflow */ -+ if (ib>0 && ic>0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic<0) { if (v >= 0) return 0; } -+ *r= v; -+ return 1; -+} -+ -+int try_subint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ lua_Integer v= ib-ic; /* may overflow */ -+ if (ib>=0 && ic<0) { if (v < 0) return 0; /*overflow, use floats*/ } -+ else if (ib<0 && ic>0) { if (v >= 0) return 0; } -+ *r= v; -+ return 1; -+} -+ -+int try_mulint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ if (ib!=LUA_INTEGER_MIN && ic!=LUA_INTEGER_MIN) { -+ lua_Integer b= luai_abs(ib), c= luai_abs(ic); -+ if ( (ib==0) || (LUA_INTEGER_MAX/b >= c) ) { -+ *r= ib*ic; /* no overflow */ -+ return 1; -+ } -+ } else if (ib==0 || ic==0) { -+ *r= 0; return 1; -+ } -+ -+ /* Result can be LUA_INTEGER_MIN; if it is, calculating it using floating -+ * point will not cause accuracy loss. -+ */ -+ if ( luai_nummul( cast_num(ib), cast_num(ic) ) == LUA_INTEGER_MIN ) { -+ *r= LUA_INTEGER_MIN; -+ return 1; -+ } -+ return 0; -+} -+ -+int try_divint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ /* N/0: leave to float side, to give an error -+ */ -+ if (ic==0) return 0; -+ -+ /* N/LUA_INTEGER_MIN: always non-integer results, or 0 or +1 -+ */ -+ if (ic==LUA_INTEGER_MIN) { -+ if (ib==LUA_INTEGER_MIN) { *r=1; return 1; } -+ if (ib==0) { *r=0; return 1; } -+ -+ /* LUA_INTEGER_MIN (-2^31|63)/N: calculate using float side (either the division -+ * causes non-integer results, or there is no accuracy loss in int->fp->int -+ * conversions (N=2,4,8,..,256 and N=2^30,2^29,..2^23). -+ */ -+ } else if (ib==LUA_INTEGER_MIN) { -+ lua_Number d= luai_numdiv( cast_num(LUA_INTEGER_MIN), cast_num(ic) ); -+ lua_Integer i; lua_number2integer(i,d); -+ if (cast_num(i)==d) { *r= i; return 1; } -+ -+ } else { -+ /* Note: We _can_ use ANSI C mod here, even on negative values, since -+ * we only test for == 0 (the sign would be implementation dependent). -+ */ -+ if (ib%ic == 0) { *r= ib/ic; return 1; } -+ } -+ -+ return 0; -+} -+ -+int try_modint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ if (ic!=0) { -+ /* ANSI C can be trusted when b%c==0, or when values are non-negative. -+ * b - (floor(b/c) * c) -+ * --> -+ * + +: b - (b/c) * c (b % c can be used) -+ * - -: b - (b/c) * c (b % c could work, but not defined by ANSI C) -+ * 0 -: b - (b/c) * c (=0, b % c could work, but not defined by ANSI C) -+ * - +: b - (b/c-1) * c (when b!=-c) -+ * + -: b - (b/c-1) * c (when b!=-c) -+ * -+ * o MIN%MIN ends up 0, via overflow in calcs but that does not matter. -+ * o MIN%MAX ends up MAX-1 (and other such numbers), also after overflow, -+ * but that does not matter, results do. -+ */ -+ lua_Integer v= ib % ic; -+ if ( v!=0 && (ib<0 || ic<0) ) { -+ v= ib - ((ib/ic) - ((ib<=0 && ic<0) ? 0:1)) * ic; -+ } -+ /* Result should always have same sign as 2nd argument. (PIL2) */ -+ lua_assert( (v<0) ? (ic<0) : (v>0) ? (ic>0) : 1 ); -+ *r= v; -+ return 1; -+ } -+ return 0; /* let float side return NaN */ -+} -+ -+int try_powint( lua_Integer *r, lua_Integer ib, lua_Integer ic ) { -+ -+ /* In FLOAT/INT32 or FLOAT|DOUBLE/INT64 modes, calculating integer powers -+ * via FP realm may lose accuracy (i.e. 7^11 = 1977326743, which fits int32 -+ * but not 23-bit float mantissa). -+ * -+ * The current solution is dumb, but it works and uses little code. Use of -+ * integer powers is not anticipated to be very frequent (apart from 2^x, -+ * which is separately optimized). -+ */ -+ if (ib==0) *r=0; -+ else if (ic<0) return 0; /* FP realm */ -+ else if (ib==2 && ic < (int)sizeof(lua_Integer)*8-1) *r= ((lua_Integer)1)< -+ -+#include "lobject.h" -+ -+/* -+** The luai_num* macros define the primitive operations over 'lua_Number's -+** (not 'lua_Integer's, not 'lua_Complex'). -+*/ -+#define luai_numadd(a,b) ((a)+(b)) -+#define luai_numsub(a,b) ((a)-(b)) -+#define luai_nummul(a,b) ((a)*(b)) -+#define luai_numdiv(a,b) ((a)/(b)) -+#define luai_nummod(a,b) ((a) - _LF(floor)((a)/(b))*(b)) -+#define luai_numpow(a,b) (_LF(pow)(a,b)) -+#define luai_numunm(a) (-(a)) -+#define luai_numeq(a,b) ((a)==(b)) -+#define luai_numlt(a,b) ((a)<(b)) -+#define luai_numle(a,b) ((a)<=(b)) -+#define luai_numisnan(a) (!luai_numeq((a), (a))) -+ -+int try_addint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_subint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_mulint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_divint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_modint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_powint( lua_Integer *r, lua_Integer ib, lua_Integer ic ); -+int try_unmint( lua_Integer *r, lua_Integer ib ); -+ -+#ifdef LNUM_COMPLEX -+ static inline lua_Complex luai_vectunm( lua_Complex a ) { return -a; } -+ static inline lua_Complex luai_vectadd( lua_Complex a, lua_Complex b ) { return a+b; } -+ static inline lua_Complex luai_vectsub( lua_Complex a, lua_Complex b ) { return a-b; } -+ static inline lua_Complex luai_vectmul( lua_Complex a, lua_Complex b ) { return a*b; } -+ static inline lua_Complex luai_vectdiv( lua_Complex a, lua_Complex b ) { return a/b; } -+ -+/* -+ * C99 does not provide modulus for complex numbers. It most likely is not -+ * meaningful at all. -+ */ -+ -+/* -+ * Complex power -+ * -+ * C99 'cpow' gives inaccurate results for many common cases s.a. (1i)^2 -> -+ * -1+1.2246467991474e-16i (OS X 10.4, gcc 4.0.1 build 5367) -+ * -+ * [(a+bi)^(c+di)] = (r^c) * exp(-d*t) * cos(c*t + d*ln(r)) + -+ * = (r^c) * exp(-d*t) * sin(c*t + d*ln(r)) *i -+ * r = sqrt(a^2+b^2), t = arctan( b/a ) -+ * -+ * Reference: -+ * Could also be calculated using: x^y = exp(ln(x)*y) -+ * -+ * Note: Defined here (and not in .c) so 'lmathlib.c' can share the -+ * implementation. -+ */ -+ static inline -+ lua_Complex luai_vectpow( lua_Complex a, lua_Complex b ) -+ { -+# if 1 -+ lua_Number ar= _LF(creal)(a), ai= _LF(cimag)(a); -+ lua_Number br= _LF(creal)(b), bi= _LF(cimag)(b); -+ -+ if (ai==0 && bi==0) { /* a^c (real) */ -+ return luai_numpow( ar, br ); -+ } -+ -+ int br_int= (int)br; -+ -+ if ( ai!=0 && bi==0 && br_int==br && br_int!=0 && br_int!=INT_MIN ) { -+ /* (a+bi)^N, N = { +-1,+-2, ... +-INT_MAX } -+ */ -+ lua_Number k= luai_numpow( _LF(sqrt) (ar*ar + ai*ai), br ); -+ lua_Number cos_z, sin_z; -+ -+ /* Situation depends upon c (N) in the following manner: -+ * -+ * N%4==0 => cos(c*t)=1, sin(c*t)=0 -+ * (N*sign(b))%4==1 or (N*sign(b))%4==-3 => cos(c*t)=0, sin(c*t)=1 -+ * N%4==2 or N%4==-2 => cos(c*t)=-1, sin(c*t)=0 -+ * (N*sign(b))%4==-1 or (N*sign(b))%4==3 => cos(c*t)=0, sin(c*t)=-1 -+ */ -+ int br_int_abs = br_int<0 ? -br_int:br_int; -+ -+ switch( (br_int_abs%4) * (br_int<0 ? -1:1) * (ai<0 ? -1:1) ) { -+ case 0: cos_z=1, sin_z=0; break; -+ case 2: case -2: cos_z=-1, sin_z=0; break; -+ case 1: case -3: cos_z=0, sin_z=1; break; -+ case 3: case -1: cos_z=0, sin_z=-1; break; -+ default: lua_assert(0); return 0; -+ } -+ return k*cos_z + (k*sin_z)*I; -+ } -+# endif -+ return _LF(cpow) ( a, b ); -+ } -+#endif -+ -+LUAI_FUNC int luaO_str2d (const char *s, lua_Number *res1, lua_Integer *res2); -+LUAI_FUNC void luaO_num2buf( char *s, const TValue *o ); -+ -+LUAI_FUNC int /*bool*/ tt_integer_valued( const TValue *o, lua_Integer *ref ); -+ -+#define luai_normalize(o) \ -+{ lua_Integer _i; if (tt_integer_valued(o,&_i)) setivalue(o,_i); } -+ -+#endif -Binary files ../lua-5.1.3/src/lnum.o and lua-5.1.3-patched/src/lnum.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lnum_config.h lua-5.1.3-patched/src/lnum_config.h ---- ../lua-5.1.3/src/lnum_config.h 1970-01-01 02:00:00.000000000 +0200 -+++ lua-5.1.3-patched/src/lnum_config.h 2008-03-26 11:32:25.000000000 +0200 -@@ -0,0 +1,221 @@ -+/* -+** $Id: lnum_config.h,v ... $ -+** Internal Number model -+** See Copyright Notice in lua.h -+*/ -+ -+#ifndef lnum_config_h -+#define lnum_config_h -+ -+/* -+** Default number modes -+*/ -+#if (!defined LNUM_DOUBLE) && (!defined LNUM_FLOAT) && (!defined LNUM_LDOUBLE) -+# define LNUM_DOUBLE -+#endif -+#if (!defined LNUM_INT16) && (!defined LNUM_INT32) && (!defined LNUM_INT64) -+# define LNUM_INT32 -+#endif -+ -+/* -+** Require C99 mode for COMPLEX, FLOAT and LDOUBLE (only DOUBLE is ANSI C). -+*/ -+#if defined(LNUM_COMPLEX) && (__STDC_VERSION__ < 199901L) -+# error "Need C99 for complex (use '--std=c99' or similar)" -+#elif defined(LNUM_LDOUBLE) && (__STDC_VERSION__ < 199901L) && !defined(_MSC_VER) -+# error "Need C99 for 'long double' (use '--std=c99' or similar)" -+#elif defined(LNUM_FLOAT) && (__STDC_VERSION__ < 199901L) -+/* LNUM_FLOAT not supported on Windows */ -+# error "Need C99 for 'float' (use '--std=c99' or similar)" -+#endif -+ -+/* -+** Number mode identifier to accompany the version string. -+*/ -+#ifdef LNUM_COMPLEX -+# define _LNUM1 "complex " -+#else -+# define _LNUM1 "" -+#endif -+#ifdef LNUM_DOUBLE -+# define _LNUM2 "double" -+#elif defined(LNUM_FLOAT) -+# define _LNUM2 "float" -+#elif defined(LNUM_LDOUBLE) -+# define _LNUM2 "ldouble" -+#endif -+#ifdef LNUM_INT32 -+# define _LNUM3 "int32" -+#elif defined(LNUM_INT64) -+# define _LNUM3 "int64" -+#elif defined(LNUM_INT16) -+# define _LNUM3 "int16" -+#endif -+#define LUA_LNUM _LNUM1 _LNUM2 " " _LNUM3 -+ -+/* -+** LUA_NUMBER is the type of floating point number in Lua -+** LUA_NUMBER_SCAN is the format for reading numbers. -+** LUA_NUMBER_FMT is the format for writing numbers. -+*/ -+#ifdef LNUM_FLOAT -+# define LUA_NUMBER float -+# define LUA_NUMBER_SCAN "%f" -+# define LUA_NUMBER_FMT "%g" -+#elif (defined LNUM_DOUBLE) -+# define LUA_NUMBER double -+# define LUA_NUMBER_SCAN "%lf" -+# define LUA_NUMBER_FMT "%.14g" -+#elif (defined LNUM_LDOUBLE) -+# define LUA_NUMBER long double -+# define LUA_NUMBER_SCAN "%Lg" -+# define LUA_NUMBER_FMT "%.20Lg" -+#endif -+ -+ -+/* -+** LUAI_MAXNUMBER2STR: size of a buffer fitting any number->string result. -+** -+** double: 24 (sign, x.xxxxxxxxxxxxxxe+nnnn, and \0) -+** int64: 21 (19 digits, sign, and \0) -+** long double: 43 for 128-bit (sign, x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxe+nnnn, and \0) -+** 30 for 80-bit (sign, x.xxxxxxxxxxxxxxxxxxxxe+nnnn, and \0) -+*/ -+#ifdef LNUM_LDOUBLE -+# define _LUAI_MN2S 44 -+#else -+# define _LUAI_MN2S 24 -+#endif -+ -+#ifdef LNUM_COMPLEX -+# define LUAI_MAXNUMBER2STR (2*_LUAI_MN2S) -+#else -+# define LUAI_MAXNUMBER2STR _LUAI_MN2S -+#endif -+ -+/* -+** LUA_INTEGER is the integer type used by lua_pushinteger/lua_tointeger/lua_isinteger. -+** LUA_INTEGER_SCAN is the format for reading integers -+** LUA_INTEGER_FMT is the format for writing integers -+** -+** Note: Visual C++ 2005 does not have 'strtoull()', use '_strtoui64()' instead. -+*/ -+#ifdef LNUM_INT32 -+# if LUAI_BITSINT > 16 -+# define LUA_INTEGER int -+# define LUA_INTEGER_SCAN "%d" -+# define LUA_INTEGER_FMT "%d" -+# else -+/* Note: 'LUA_INTEGER' being 'ptrdiff_t' (as in Lua 5.1) causes problems with -+ * 'printf()' operations. Also 'unsigned ptrdiff_t' is invalid. -+ */ -+# define LUA_INTEGER long -+# define LUA_INTEGER_SCAN "%ld" -+# define LUA_INTEGER_FMT "%ld" -+# endif -+# define LUA_INTEGER_MAX 0x7FFFFFFF /* 2^31-1 */ -+/* */ -+#elif defined(LNUM_INT64) -+# define LUA_INTEGER long long -+# ifdef _MSC_VER -+# define lua_str2ul _strtoui64 -+# else -+# define lua_str2ul strtoull -+# endif -+# define LUA_INTEGER_SCAN "%lld" -+# define LUA_INTEGER_FMT "%lld" -+# define LUA_INTEGER_MAX 0x7fffffffffffffffLL /* 2^63-1 */ -+# define LUA_INTEGER_MIN (-LUA_INTEGER_MAX - 1LL) /* -2^63 */ -+/* */ -+#elif defined(LNUM_INT16) -+# if LUAI_BITSINT > 16 -+# define LUA_INTEGER short -+# define LUA_INTEGER_SCAN "%hd" -+# define LUA_INTEGER_FMT "%hd" -+# else -+# define LUA_INTEGER int -+# define LUA_INTEGER_SCAN "%d" -+# define LUA_INTEGER_FMT "%d" -+# endif -+# define LUA_INTEGER_MAX 0x7FFF /* 2^16-1 */ -+#endif -+ -+#ifndef lua_str2ul -+# define lua_str2ul (unsigned LUA_INTEGER)strtoul -+#endif -+#ifndef LUA_INTEGER_MIN -+# define LUA_INTEGER_MIN (-LUA_INTEGER_MAX -1) /* -2^16|32 */ -+#endif -+ -+/* -+@@ lua_number2int is a macro to convert lua_Number to int. -+@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. -+** CHANGE them if you know a faster way to convert a lua_Number to -+** int (with any rounding method and without throwing errors) in your -+** system. In Pentium machines, a naive typecast from double to int -+** in C is extremely slow, so any alternative is worth trying. -+*/ -+ -+/* On a Pentium, resort to a trick */ -+#if defined(LNUM_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ -+ (defined(__i386) || defined (_M_IX86) || defined(__i386__)) -+ -+/* On a Microsoft compiler, use assembler */ -+# if defined(_MSC_VER) -+# define lua_number2int(i,d) __asm fld d __asm fistp i -+# else -+ -+/* the next trick should work on any Pentium, but sometimes clashes -+ with a DirectX idiosyncrasy */ -+union luai_Cast { double l_d; long l_l; }; -+# define lua_number2int(i,d) \ -+ { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } -+# endif -+ -+# ifndef LNUM_INT64 -+# define lua_number2integer lua_number2int -+# endif -+ -+/* this option always works, but may be slow */ -+#else -+# define lua_number2int(i,d) ((i)=(int)(d)) -+#endif -+ -+/* Note: Some compilers (OS X gcc 4.0?) may choke on double->long long conversion -+ * since it can lose precision. Others do require 'long long' there. -+ */ -+#ifndef lua_number2integer -+# define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) -+#endif -+ -+/* -+** 'luai_abs()' to give absolute value of 'lua_Integer' -+*/ -+#ifdef LNUM_INT32 -+# define luai_abs abs -+#elif defined(LNUM_INT64) && (__STDC_VERSION__ >= 199901L) -+# define luai_abs llabs -+#else -+# define luai_abs(v) ((v) >= 0 ? (v) : -(v)) -+#endif -+ -+/* -+** LUAI_UACNUMBER is the result of an 'usual argument conversion' over a number. -+** LUAI_UACINTEGER the same, over an integer. -+*/ -+#define LUAI_UACNUMBER double -+#define LUAI_UACINTEGER long -+ -+/* ANSI C only has math funcs for 'double. C99 required for float and long double -+ * variants. -+ */ -+#ifdef LNUM_DOUBLE -+# define _LF(name) name -+#elif defined(LNUM_FLOAT) -+# define _LF(name) name ## f -+#elif defined(LNUM_LDOUBLE) -+# define _LF(name) name ## l -+#endif -+ -+#endif -+ -Binary files ../lua-5.1.3/src/loadlib.o and lua-5.1.3-patched/src/loadlib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lobject.c lua-5.1.3-patched/src/lobject.c ---- ../lua-5.1.3/src/lobject.c 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lobject.c 2008-03-14 11:08:49.000000000 +0200 -@@ -21,7 +21,8 @@ - #include "lstate.h" - #include "lstring.h" - #include "lvm.h" -- -+#include "llex.h" -+#include "lnum.h" - - - const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL}; -@@ -70,12 +71,31 @@ - - - int luaO_rawequalObj (const TValue *t1, const TValue *t2) { -- if (ttype(t1) != ttype(t2)) return 0; -+ if (!ttype_ext_same(t1,t2)) return 0; - else switch (ttype(t1)) { - case LUA_TNIL: - return 1; -+ case LUA_TINT: -+ if (ttype(t2)==LUA_TINT) -+ return ivalue(t1) == ivalue(t2); -+ else { /* t1:int, t2:num */ -+#ifdef LNUM_COMPLEX -+ if (nvalue_img_fast(t2) != 0) return 0; -+#endif -+ /* Avoid doing accuracy losing cast, if possible. */ -+ lua_Integer tmp; -+ if (tt_integer_valued(t2,&tmp)) -+ return ivalue(t1) == tmp; -+ else -+ return luai_numeq( cast_num(ivalue(t1)), nvalue_fast(t2) ); -+ } - case LUA_TNUMBER: -- return luai_numeq(nvalue(t1), nvalue(t2)); -+ if (ttype(t2)==LUA_TINT) -+ return luaO_rawequalObj(t2, t1); /* swap LUA_TINT to left */ -+#ifdef LNUM_COMPLEX -+ if (!luai_numeq(nvalue_img_fast(t1), nvalue_img_fast(t2))) return 0; -+#endif -+ return luai_numeq(nvalue_fast(t1), nvalue_fast(t2)); - case LUA_TBOOLEAN: - return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ - case LUA_TLIGHTUSERDATA: -@@ -86,21 +106,6 @@ - } - } - -- --int luaO_str2d (const char *s, lua_Number *result) { -- char *endptr; -- *result = lua_str2number(s, &endptr); -- if (endptr == s) return 0; /* conversion failed */ -- if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */ -- *result = cast_num(strtoul(s, &endptr, 16)); -- if (*endptr == '\0') return 1; /* most common case */ -- while (isspace(cast(unsigned char, *endptr))) endptr++; -- if (*endptr != '\0') return 0; /* invalid trailing characters? */ -- return 1; --} -- -- -- - static void pushstr (lua_State *L, const char *str) { - setsvalue2s(L, L->top, luaS_new(L, str)); - incr_top(L); -@@ -131,7 +136,11 @@ - break; - } - case 'd': { -- setnvalue(L->top, cast_num(va_arg(argp, int))); -+ /* This is tricky for 64-bit integers; maybe they even cannot be -+ * supported on all compilers; depends on the conversions applied to -+ * variable argument lists. TBD: test! -+ */ -+ setivalue(L->top, (lua_Integer) va_arg(argp, l_uacInteger)); - incr_top(L); - break; - } -@@ -212,3 +221,4 @@ - } - } - } -+ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lobject.h lua-5.1.3-patched/src/lobject.h ---- ../lua-5.1.3/src/lobject.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lobject.h 2008-03-19 11:40:13.000000000 +0200 -@@ -17,7 +17,11 @@ - - - /* tags for values visible from Lua */ --#define LAST_TAG LUA_TTHREAD -+#if LUA_TINT > LUA_TTHREAD -+# define LAST_TAG LUA_TINT -+#else -+# define LAST_TAG LUA_TTHREAD -+#endif - - #define NUM_TAGS (LAST_TAG+1) - -@@ -59,7 +63,12 @@ - typedef union { - GCObject *gc; - void *p; -+#ifdef LNUM_COMPLEX -+ lua_Complex n; -+#else - lua_Number n; -+#endif -+ lua_Integer i; - int b; - } Value; - -@@ -77,7 +86,11 @@ - - /* Macros to test type */ - #define ttisnil(o) (ttype(o) == LUA_TNIL) --#define ttisnumber(o) (ttype(o) == LUA_TNUMBER) -+#define ttisint(o) (ttype(o) == LUA_TINT) -+#define ttisnumber(o) ((ttype(o) == LUA_TINT) || (ttype(o) == LUA_TNUMBER)) -+#ifdef LNUM_COMPLEX -+# define ttiscomplex(o) ((ttype(o) == LUA_TNUMBER) && (nvalue_img_fast(o)!=0)) -+#endif - #define ttisstring(o) (ttype(o) == LUA_TSTRING) - #define ttistable(o) (ttype(o) == LUA_TTABLE) - #define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) -@@ -90,7 +103,25 @@ - #define ttype(o) ((o)->tt) - #define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) - #define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) --#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) -+ -+#define ttype_ext(o) ( ttype(o) == LUA_TINT ? LUA_TNUMBER : ttype(o) ) -+#define ttype_ext_same(o1,o2) ( (ttype(o1)==ttype(o2)) || (ttisnumber(o1) && ttisnumber(o2)) ) -+ -+/* '_fast' variants are for cases where 'ttype(o)' is known to be LUA_TNUMBER. -+ */ -+#ifdef LNUM_COMPLEX -+# define nvalue_complex_fast(o) check_exp( ttype(o)==LUA_TNUMBER, (o)->value.n ) -+# define nvalue_fast(o) ( _LF(creal) ( nvalue_complex_fast(o) ) ) -+# define nvalue_img_fast(o) ( _LF(cimag) ( nvalue_complex_fast(o) ) ) -+# define nvalue_complex(o) check_exp( ttisnumber(o), (ttype(o)==LUA_TINT) ? (o)->value.i : (o)->value.n ) -+# define nvalue_img(o) check_exp( ttisnumber(o), (ttype(o)==LUA_TINT) ? 0 : _LF(cimag)( (o)->value.n ) ) -+# define nvalue(o) check_exp( ttisnumber(o), (ttype(o)==LUA_TINT) ? cast_num((o)->value.i) : _LF(creal)((o)->value.n) ) -+#else -+# define nvalue(o) check_exp( ttisnumber(o), (ttype(o)==LUA_TINT) ? cast_num((o)->value.i) : (o)->value.n ) -+# define nvalue_fast(o) check_exp( ttype(o)==LUA_TNUMBER, (o)->value.n ) -+#endif -+#define ivalue(o) check_exp( ttype(o)==LUA_TINT, (o)->value.i ) -+ - #define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) - #define tsvalue(o) (&rawtsvalue(o)->tsv) - #define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) -@@ -116,8 +147,27 @@ - /* Macros to set values */ - #define setnilvalue(obj) ((obj)->tt=LUA_TNIL) - --#define setnvalue(obj,x) \ -- { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } -+/* Must not have side effects, 'x' may be expression. -+*/ -+#define setivalue(obj,x) \ -+ { TValue *i_o=(obj); i_o->value.i=(x); i_o->tt=LUA_TINT; } -+ -+# define setnvalue(obj,x) \ -+ { TValue *i_o=(obj); i_o->value.n= (x); i_o->tt=LUA_TNUMBER; } -+ -+/* Note: Complex always has "inline", both are C99. -+*/ -+#ifdef LNUM_COMPLEX -+ static inline void setnvalue_complex_fast( TValue *obj, lua_Complex x ) { -+ lua_assert( _LF(cimag)(x) != 0 ); -+ obj->value.n= x; obj->tt= LUA_TNUMBER; -+ } -+ static inline void setnvalue_complex( TValue *obj, lua_Complex x ) { -+ if (_LF(cimag)(x) == 0) { setnvalue(obj, _LF(creal)(x)); } -+ else { obj->value.n= x; obj->tt= LUA_TNUMBER; } -+ } -+#endif -+ - - #define setpvalue(obj,x) \ - { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } -@@ -155,9 +205,6 @@ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ - checkliveness(G(L),i_o); } - -- -- -- - #define setobj(L,obj1,obj2) \ - { const TValue *o2=(obj2); TValue *o1=(obj1); \ - o1->value = o2->value; o1->tt=o2->tt; \ -@@ -185,8 +232,11 @@ - - #define setttype(obj, tt) (ttype(obj) = (tt)) - -- --#define iscollectable(o) (ttype(o) >= LUA_TSTRING) -+#if LUA_TINT >= LUA_TSTRING -+# define iscollectable(o) ((ttype(o) >= LUA_TSTRING) && (ttype(o) != LUA_TINT)) -+#else -+# define iscollectable(o) (ttype(o) >= LUA_TSTRING) -+#endif - - - -@@ -370,12 +420,10 @@ - LUAI_FUNC int luaO_int2fb (unsigned int x); - LUAI_FUNC int luaO_fb2int (int x); - LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); --LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); - LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, - va_list argp); - LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); - LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); - -- - #endif - -Binary files ../lua-5.1.3/src/lobject.o and lua-5.1.3-patched/src/lobject.o differ -Binary files ../lua-5.1.3/src/lopcodes.o and lua-5.1.3-patched/src/lopcodes.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/loslib.c lua-5.1.3-patched/src/loslib.c ---- ../lua-5.1.3/src/loslib.c 2008-01-18 18:38:18.000000000 +0200 -+++ lua-5.1.3-patched/src/loslib.c 2008-03-19 11:02:22.000000000 +0200 -@@ -186,15 +186,30 @@ - } - if (t == (time_t)(-1)) - lua_pushnil(L); -- else -- lua_pushnumber(L, (lua_Number)t); -+ else { -+ /* On float systems the pushed value must be an integer, NOT a number. -+ * Otherwise, accuracy is lost in the time_t->float conversion. -+ */ -+#ifdef LNUM_FLOAT -+ lua_pushinteger(L, (lua_Integer) t); -+#else -+ lua_pushnumber(L, (lua_Number) t); -+#endif -+ } - return 1; - } - - - static int os_difftime (lua_State *L) { -+#ifdef LNUM_FLOAT -+ lua_Integer i= (lua_Integer) -+ difftime( (time_t)(luaL_checkinteger(L, 1)), -+ (time_t)(luaL_optinteger(L, 2, 0))); -+ lua_pushinteger(L, i); -+#else - lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), - (time_t)(luaL_optnumber(L, 2, 0)))); -+#endif - return 1; - } - -Binary files ../lua-5.1.3/src/loslib.o and lua-5.1.3-patched/src/loslib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lparser.c lua-5.1.3-patched/src/lparser.c ---- ../lua-5.1.3/src/lparser.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/lparser.c 2008-03-06 21:58:41.000000000 +0200 -@@ -33,7 +33,6 @@ - - #define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m) - -- - /* - ** nodes for block list (list of active blocks) - */ -@@ -72,7 +71,7 @@ - const char *msg = (fs->f->linedefined == 0) ? - luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : - luaO_pushfstring(fs->L, "function at line %d has more than %d %s", -- fs->f->linedefined, limit, what); -+ (fs->f->linedefined), limit, what); - luaX_lexerror(fs->ls, msg, 0); - } - -@@ -733,6 +732,18 @@ - v->u.nval = ls->t.seminfo.r; - break; - } -+ case TK_INT: { -+ init_exp(v, VKINT, 0); -+ v->u.ival = ls->t.seminfo.i; -+ break; -+ } -+#ifdef LNUM_COMPLEX -+ case TK_NUMBER2: { -+ init_exp(v, VKNUM2, 0); -+ v->u.nval = ls->t.seminfo.r; -+ break; -+ } -+#endif - case TK_STRING: { - codestring(ls, v, ls->t.seminfo.ts); - break; -@@ -1079,7 +1090,7 @@ - if (testnext(ls, ',')) - exp1(ls); /* optional step */ - else { /* default step = 1 */ -- luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); -+ luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_integerK(fs, 1)); - luaK_reserveregs(fs, 1); - } - forbody(ls, base, line, 1, 1); -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lparser.h lua-5.1.3-patched/src/lparser.h ---- ../lua-5.1.3/src/lparser.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lparser.h 2008-03-06 22:01:11.000000000 +0200 -@@ -31,7 +31,11 @@ - VRELOCABLE, /* info = instruction pc */ - VNONRELOC, /* info = result register */ - VCALL, /* info = instruction pc */ -- VVARARG /* info = instruction pc */ -+ VVARARG, /* info = instruction pc */ -+ VKINT /* ival = integer value */ -+#ifdef LNUM_COMPLEX -+ ,VKNUM2 /* nval = imaginary value */ -+#endif - } expkind; - - typedef struct expdesc { -@@ -39,6 +43,7 @@ - union { - struct { int info, aux; } s; - lua_Number nval; -+ lua_Integer ival; - } u; - int t; /* patch list of `exit when true' */ - int f; /* patch list of `exit when false' */ -Binary files ../lua-5.1.3/src/lparser.o and lua-5.1.3-patched/src/lparser.o differ -Binary files ../lua-5.1.3/src/lstate.o and lua-5.1.3-patched/src/lstate.o differ -Binary files ../lua-5.1.3/src/lstring.o and lua-5.1.3-patched/src/lstring.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lstrlib.c lua-5.1.3-patched/src/lstrlib.c ---- ../lua-5.1.3/src/lstrlib.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/lstrlib.c 2008-03-12 23:15:22.000000000 +0200 -@@ -42,8 +42,8 @@ - static int str_sub (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); -- ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l); -- ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l); -+ ptrdiff_t start = posrelat(luaL_checkint32(L, 2), l); -+ ptrdiff_t end = posrelat(luaL_optint32(L, 3, -1), l); - if (start < 1) start = 1; - if (end > (ptrdiff_t)l) end = (ptrdiff_t)l; - if (start <= end) -@@ -105,8 +105,8 @@ - static int str_byte (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); -- ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); -- ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); -+ ptrdiff_t posi = posrelat(luaL_optint32(L, 2, 1), l); -+ ptrdiff_t pose = posrelat(luaL_optint32(L, 3, posi), l); - int n, i; - if (posi <= 0) posi = 1; - if ((size_t)pose > l) pose = l; -@@ -495,7 +495,7 @@ - size_t l1, l2; - const char *s = luaL_checklstring(L, 1, &l1); - const char *p = luaL_checklstring(L, 2, &l2); -- ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; -+ ptrdiff_t init = posrelat(luaL_optint32(L, 3, 1), l1) - 1; - if (init < 0) init = 0; - else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; - if (find && (lua_toboolean(L, 4) || /* explicit request? */ -@@ -689,7 +689,7 @@ - ** maximum size of each format specification (such as '%-099.99d') - ** (+10 accounts for %99.99x plus margin of error) - */ --#define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) -+#define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTEGER_FMT)-2 + 10) - - - static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { -@@ -746,9 +746,9 @@ - static void addintlen (char *form) { - size_t l = strlen(form); - char spec = form[l - 1]; -- strcpy(form + l - 1, LUA_INTFRMLEN); -- form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; -- form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; -+ const char *tmp= LUA_INTEGER_FMT; /* "%lld" or "%ld" */ -+ strcpy(form + l - 1, tmp+1); -+ form[l + sizeof(LUA_INTEGER_FMT)-4] = spec; - } - - -@@ -776,12 +776,12 @@ - } - case 'd': case 'i': { - addintlen(form); -- sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg)); -+ sprintf(buff, form, luaL_checkinteger(L, arg)); - break; - } - case 'o': case 'u': case 'x': case 'X': { - addintlen(form); -- sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); -+ sprintf(buff, form, (unsigned LUA_INTEGER)luaL_checkinteger(L, arg)); - break; - } - case 'e': case 'E': case 'f': -Binary files ../lua-5.1.3/src/lstrlib.o and lua-5.1.3-patched/src/lstrlib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ltable.c lua-5.1.3-patched/src/ltable.c ---- ../lua-5.1.3/src/ltable.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/ltable.c 2008-03-26 13:04:20.000000000 +0200 -@@ -33,6 +33,7 @@ - #include "lobject.h" - #include "lstate.h" - #include "ltable.h" -+#include "lnum.h" - - - /* -@@ -51,25 +52,15 @@ - - #define hashstr(t,str) hashpow2(t, (str)->tsv.hash) - #define hashboolean(t,p) hashpow2(t, p) -- -+#define hashint(t,i) hashpow2(t,i) - - /* - ** for some types, it is better to avoid modulus by power of 2, as - ** they tend to have many 2 factors. - */ - #define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) -- -- - #define hashpointer(t,p) hashmod(t, IntPoint(p)) - -- --/* --** number of ints inside a lua_Number --*/ --#define numints cast_int(sizeof(lua_Number)/sizeof(int)) -- -- -- - #define dummynode (&dummynode_) - - static const Node dummynode_ = { -@@ -80,27 +71,46 @@ - - /* - ** hash for lua_Numbers -+** -+** for non-complex modes, never called with 'lua_Integer' value range (s.a. 0) - */ - static Node *hashnum (const Table *t, lua_Number n) { -- unsigned int a[numints]; -- int i; -- if (luai_numeq(n, 0)) /* avoid problems with -0 */ -- return gnode(t, 0); -- memcpy(a, &n, sizeof(a)); -- for (i = 1; i < numints; i++) a[0] += a[i]; -- return hashmod(t, a[0]); -+ const unsigned int *p= cast(const unsigned int *,&n); -+ unsigned int sum= *p; -+ unsigned int m= sizeof(lua_Number)/sizeof(int); -+ unsigned int i; -+ /* OS X Intel has 'm'==4 and gives "Bus error" if the last integer of -+ * 'n' is read; the actual size of long double is only 80 bits = 10 bytes. -+ * Linux x86 has 'm'==3, and does not require reduction. -+ */ -+#if defined(LNUM_LDOUBLE) && defined(__i386__) -+ if (m>3) m--; -+#endif -+ for (i = 1; i < m; i++) sum += p[i]; -+ return hashmod(t, sum); - } - - -- - /* - ** returns the `main' position of an element in a table (that is, the index - ** of its hash value) -+** -+** Floating point numbers with integer value give the hash position of the -+** integer (so they use the same table position). - */ - static Node *mainposition (const Table *t, const TValue *key) { -+ lua_Integer i; - switch (ttype(key)) { - case LUA_TNUMBER: -- return hashnum(t, nvalue(key)); -+ if (tt_integer_valued(key,&i)) -+ return hashint(t, i); -+#ifdef LNUM_COMPLEX -+ if (nvalue_img_fast(key)!=0 && luai_numeq(nvalue_fast(key),0)) -+ return gnode(t, 0); /* 0 and -0 to give same hash */ -+#endif -+ return hashnum(t, nvalue_fast(key)); -+ case LUA_TINT: -+ return hashint(t, ivalue(key)); - case LUA_TSTRING: - return hashstr(t, rawtsvalue(key)); - case LUA_TBOOLEAN: -@@ -116,16 +126,20 @@ - /* - ** returns the index for `key' if `key' is an appropriate key to live in - ** the array part of the table, -1 otherwise. -+** -+** Anything <=0 is taken as not being in the array part. - */ --static int arrayindex (const TValue *key) { -- if (ttisnumber(key)) { -- lua_Number n = nvalue(key); -- int k; -- lua_number2int(k, n); -- if (luai_numeq(cast_num(k), n)) -- return k; -+static int arrayindex (const TValue *key, int max) { -+ lua_Integer k; -+ switch( ttype(key) ) { -+ case LUA_TINT: -+ k= ivalue(key); break; -+ case LUA_TNUMBER: -+ if (tt_integer_valued(key,&k)) break; -+ default: -+ return -1; /* not to be used as array index */ - } -- return -1; /* `key' did not match some condition */ -+ return ((k>0) && (k <= max)) ? cast_int(k) : -1; - } - - -@@ -137,8 +151,8 @@ - static int findindex (lua_State *L, Table *t, StkId key) { - int i; - if (ttisnil(key)) return -1; /* first iteration */ -- i = arrayindex(key); -- if (0 < i && i <= t->sizearray) /* is `key' inside array part? */ -+ i = arrayindex(key, t->sizearray); -+ if (i>0) /* inside array part? */ - return i-1; /* yes; that's the index (corrected to C) */ - else { - Node *n = mainposition(t, key); -@@ -163,7 +177,7 @@ - int i = findindex(L, t, key); /* find original element */ - for (i++; i < t->sizearray; i++) { /* try first array part */ - if (!ttisnil(&t->array[i])) { /* a non-nil value? */ -- setnvalue(key, cast_num(i+1)); -+ setivalue(key, i+1); - setobj2s(L, key+1, &t->array[i]); - return 1; - } -@@ -209,8 +223,8 @@ - - - static int countint (const TValue *key, int *nums) { -- int k = arrayindex(key); -- if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */ -+ int k = arrayindex(key,MAXASIZE); -+ if (k>0) { /* appropriate array index? */ - nums[ceillog2(k)]++; /* count as such */ - return 1; - } -@@ -308,7 +322,7 @@ - /* re-insert elements from vanishing slice */ - for (i=nasize; iarray[i])) -- setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); -+ setobjt2t(L, luaH_setint(L, t, i+1), &t->array[i]); - } - /* shrink array */ - luaM_reallocvector(L, t->array, oldasize, nasize, TValue); -@@ -409,7 +423,9 @@ - othern = mainposition(t, key2tval(mp)); - if (othern != mp) { /* is colliding node out of its main position? */ - /* yes; move colliding node into free position */ -- while (gnext(othern) != mp) othern = gnext(othern); /* find previous */ -+ while (gnext(othern) != mp) { -+ othern = gnext(othern); /* find previous */ -+ } - gnext(othern) = n; /* redo the chain with `n' in place of `mp' */ - *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - gnext(mp) = NULL; /* now `mp' is free */ -@@ -432,17 +448,18 @@ - /* - ** search function for integers - */ --const TValue *luaH_getnum (Table *t, int key) { -+const TValue *luaH_getint (Table *t, lua_Integer key) { - /* (1 <= key && key <= t->sizearray) */ - if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray)) - return &t->array[key-1]; - else { -- lua_Number nk = cast_num(key); -- Node *n = hashnum(t, nk); -+ Node *n = hashint(t, key); - do { /* check whether `key' is somewhere in the chain */ -- if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk)) -+ if (ttisint(gkey(n)) && (ivalue(gkey(n)) == key)) { - return gval(n); /* that's it */ -- else n = gnext(n); -+ } else { -+ n = gnext(n); -+ } - } while (n); - return luaO_nilobject; - } -@@ -470,14 +487,12 @@ - switch (ttype(key)) { - case LUA_TNIL: return luaO_nilobject; - case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); -+ case LUA_TINT: return luaH_getint(t, ivalue(key)); - case LUA_TNUMBER: { -- int k; -- lua_Number n = nvalue(key); -- lua_number2int(k, n); -- if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ -- return luaH_getnum(t, k); /* use specialized version */ -- /* else go through */ -- } -+ lua_Integer i; -+ if (tt_integer_valued(key,&i)) -+ return luaH_getint(t,i); -+ } /* pass through */ - default: { - Node *n = mainposition(t, key); - do { /* check whether `key' is somewhere in the chain */ -@@ -498,20 +513,25 @@ - return cast(TValue *, p); - else { - if (ttisnil(key)) luaG_runerror(L, "table index is nil"); -- else if (ttisnumber(key) && luai_numisnan(nvalue(key))) -- luaG_runerror(L, "table index is NaN"); -+ else if (ttype(key)==LUA_TNUMBER) { -+ lua_Integer k; -+ if (luai_numisnan(nvalue_fast(key))) -+ luaG_runerror(L, "table index is NaN"); -+ if (tt_integer_valued(key,&k)) -+ return luaH_setint(L, t, k); -+ } - return newkey(L, t, key); - } - } - - --TValue *luaH_setnum (lua_State *L, Table *t, int key) { -- const TValue *p = luaH_getnum(t, key); -+TValue *luaH_setint (lua_State *L, Table *t, lua_Integer key) { -+ const TValue *p = luaH_getint(t, key); - if (p != luaO_nilobject) - return cast(TValue *, p); - else { - TValue k; -- setnvalue(&k, cast_num(key)); -+ setivalue(&k, key); - return newkey(L, t, &k); - } - } -@@ -533,20 +553,21 @@ - unsigned int i = j; /* i is zero or a present index */ - j++; - /* find `i' and `j' such that i is present and j is not */ -- while (!ttisnil(luaH_getnum(t, j))) { -+ while (!ttisnil(luaH_getint(t, j))) { - i = j; - j *= 2; - if (j > cast(unsigned int, MAX_INT)) { /* overflow? */ - /* table was built with bad purposes: resort to linear search */ -- i = 1; -- while (!ttisnil(luaH_getnum(t, i))) i++; -- return i - 1; -+ for( i = 1; i 1) { - unsigned int m = (i+j)/2; -- if (ttisnil(luaH_getnum(t, m))) j = m; -+ if (ttisnil(luaH_getint(t, m))) j = m; - else i = m; - } - return i; -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ltable.h lua-5.1.3-patched/src/ltable.h ---- ../lua-5.1.3/src/ltable.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/ltable.h 2008-03-16 20:49:18.000000000 +0200 -@@ -18,8 +18,8 @@ - #define key2tval(n) (&(n)->i_key.tvk) - - --LUAI_FUNC const TValue *luaH_getnum (Table *t, int key); --LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key); -+LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); -+LUAI_FUNC TValue *luaH_setint (lua_State *L, Table *t, lua_Integer key); - LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); - LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key); - LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); -Binary files ../lua-5.1.3/src/ltable.o and lua-5.1.3-patched/src/ltable.o differ -Binary files ../lua-5.1.3/src/ltablib.o and lua-5.1.3-patched/src/ltablib.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/ltm.c lua-5.1.3-patched/src/ltm.c ---- ../lua-5.1.3/src/ltm.c 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/ltm.c 2008-03-06 22:47:33.000000000 +0200 -@@ -19,7 +19,6 @@ - #include "ltm.h" - - -- - const char *const luaT_typenames[] = { - "nil", "boolean", "userdata", "number", - "string", "table", "function", "userdata", "thread", -@@ -67,6 +66,9 @@ - case LUA_TUSERDATA: - mt = uvalue(o)->metatable; - break; -+ case LUA_TINT: -+ mt = G(L)->mt[LUA_TNUMBER]; -+ break; - default: - mt = G(L)->mt[ttype(o)]; - } -Binary files ../lua-5.1.3/src/ltm.o and lua-5.1.3-patched/src/ltm.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lua.c lua-5.1.3-patched/src/lua.c ---- ../lua-5.1.3/src/lua.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/lua.c 2008-03-26 11:32:25.000000000 +0200 -@@ -16,7 +16,7 @@ - - #include "lauxlib.h" - #include "lualib.h" -- -+#include "llimits.h" - - - static lua_State *globalL = NULL; -@@ -382,6 +382,15 @@ - l_message(argv[0], "cannot create state: not enough memory"); - return EXIT_FAILURE; - } -+ /* Checking 'sizeof(lua_Integer)' cannot be made in preprocessor on all compilers. -+ */ -+#ifdef LNUM_INT16 -+ lua_assert( sizeof(lua_Integer) == 2 ); -+#elif defined(LNUM_INT32) -+ lua_assert( sizeof(lua_Integer) == 4 ); -+#elif defined(LNUM_INT64) -+ lua_assert( sizeof(lua_Integer) == 8 ); -+#endif - s.argc = argc; - s.argv = argv; - status = lua_cpcall(L, &pmain, &s); -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lua.h lua-5.1.3-patched/src/lua.h ---- ../lua-5.1.3/src/lua.h 2008-01-03 17:41:15.000000000 +0200 -+++ lua-5.1.3-patched/src/lua.h 2008-03-19 11:19:34.000000000 +0200 -@@ -19,7 +19,7 @@ - #define LUA_VERSION "Lua 5.1" - #define LUA_RELEASE "Lua 5.1.3" - #define LUA_VERSION_NUM 501 --#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" -+#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" " (" LUA_LNUM ")" - #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" - - -@@ -71,6 +71,16 @@ - */ - #define LUA_TNONE (-1) - -+/* LUA_TINT is an internal type, not visible to applications. There are three -+ * potential values where it can be tweaked to (code autoadjusts to these): -+ * -+ * -2: not 'usual' type value; good since 'LUA_TINT' is not part of the API -+ * LUA_TNUMBER+1: shifts other type values upwards, breaking binary compatibility -+ * not acceptable for 5.1, maybe 5.2 onwards? -+ * 9: greater than existing (5.1) type values. -+*/ -+#define LUA_TINT (-2) -+ - #define LUA_TNIL 0 - #define LUA_TBOOLEAN 1 - #define LUA_TLIGHTUSERDATA 2 -@@ -139,6 +149,8 @@ - LUA_API int (lua_type) (lua_State *L, int idx); - LUA_API const char *(lua_typename) (lua_State *L, int tp); - -+LUA_API int (lua_isinteger) (lua_State *L, int idx); -+ - LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); - LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); - LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); -@@ -244,6 +256,19 @@ - LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); - - -+/* -+* It is unnecessary to break Lua C API 'lua_tonumber()' compatibility, just -+* because the Lua number type is complex. Most C modules would use scalars -+* only. We'll introduce new 'lua_tocomplex' and 'lua_pushcomplex' for when -+* the module really wants to use them. -+*/ -+#ifdef LNUM_COMPLEX -+ #include -+ typedef LUA_NUMBER complex lua_Complex; -+ LUA_API lua_Complex (lua_tocomplex) (lua_State *L, int idx); -+ LUA_API void (lua_pushcomplex) (lua_State *L, lua_Complex v); -+#endif -+ - - /* - ** =============================================================== -@@ -268,7 +293,12 @@ - #define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) - #define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) - #define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) --#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) -+ -+#if LUA_TINT < 0 -+# define lua_isnoneornil(L, n) ( (lua_type(L,(n)) <= 0) && (lua_type(L,(n)) != LUA_TINT) ) -+#else -+# define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) -+#endif - - #define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) -@@ -386,3 +416,4 @@ - - - #endif -+ -Binary files ../lua-5.1.3/src/lua.o and lua-5.1.3-patched/src/lua.o differ -Binary files ../lua-5.1.3/src/luac and lua-5.1.3-patched/src/luac differ -Binary files ../lua-5.1.3/src/luac.o and lua-5.1.3-patched/src/luac.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/luaconf.h lua-5.1.3-patched/src/luaconf.h ---- ../lua-5.1.3/src/luaconf.h 2008-01-18 19:07:48.000000000 +0200 -+++ lua-5.1.3-patched/src/luaconf.h 2008-03-24 20:28:57.000000000 +0200 -@@ -10,7 +10,9 @@ - - #include - #include -- -+#ifdef lua_assert -+# include -+#endif - - /* - ** ================================================================== -@@ -136,14 +138,38 @@ - - - /* --@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. --** CHANGE that if ptrdiff_t is not adequate on your machine. (On most --** machines, ptrdiff_t gives a good choice between int or long.) -+@@ LUAI_BITSINT defines the number of bits in an int. -+** CHANGE here if Lua cannot automatically detect the number of bits of -+** your machine. Probably you do not need to change this. - */ --#define LUA_INTEGER ptrdiff_t -+/* avoid overflows in comparison */ -+#if INT_MAX-20 < 32760 -+#define LUAI_BITSINT 16 -+#elif INT_MAX > 2147483640L -+/* int has at least 32 bits */ -+#define LUAI_BITSINT 32 -+#else -+#error "you must define LUA_BITSINT with number of bits in an integer" -+#endif - - - /* -+@@ LNUM_DOUBLE | LNUM_FLOAT | LNUM_LDOUBLE: Generic Lua number mode -+@@ LNUM_INT32 | LNUM_INT64: Integer type -+@@ LNUM_COMPLEX: Define for using 'a+bi' numbers -+@@ -+@@ You can combine LNUM_xxx but only one of each group. I.e. '-DLNUM_FLOAT -+@@ -DLNUM_INT32 -DLNUM_COMPLEX' gives float range complex numbers, with -+@@ 32-bit scalar integer range optimized. -+** -+** These are kept in a separate configuration file mainly for ease of patching -+** (can be changed if integerated to Lua proper). -+*/ -+/*#define LNUM_DOUBLE*/ -+/*#define LNUM_INT32*/ -+#include "lnum_config.h" -+ -+/* - @@ LUA_API is a mark for all core API functions. - @@ LUALIB_API is a mark for all standard library functions. - ** CHANGE them if you need to define those functions in some special way. -@@ -383,22 +409,6 @@ - - - /* --@@ LUAI_BITSINT defines the number of bits in an int. --** CHANGE here if Lua cannot automatically detect the number of bits of --** your machine. Probably you do not need to change this. --*/ --/* avoid overflows in comparison */ --#if INT_MAX-20 < 32760 --#define LUAI_BITSINT 16 --#elif INT_MAX > 2147483640L --/* int has at least 32 bits */ --#define LUAI_BITSINT 32 --#else --#error "you must define LUA_BITSINT with number of bits in an integer" --#endif -- -- --/* - @@ LUAI_UINT32 is an unsigned integer with at least 32 bits. - @@ LUAI_INT32 is an signed integer with at least 32 bits. - @@ LUAI_UMEM is an unsigned integer big enough to count the total -@@ -425,6 +435,15 @@ - #define LUAI_MEM long - #endif - -+/* -+@@ LUAI_BOOL carries 0 and nonzero (normally 1). It may be defined as 'char' -+** (to save memory), 'int' (for speed), 'bool' (for C++) or '_Bool' (C99) -+*/ -+#ifdef __cplusplus -+# define LUAI_BOOL bool -+#else -+# define LUAI_BOOL int -+#endif - - /* - @@ LUAI_MAXCALLS limits the number of nested calls. -@@ -490,101 +509,6 @@ - /* }================================================================== */ - - -- -- --/* --** {================================================================== --@@ LUA_NUMBER is the type of numbers in Lua. --** CHANGE the following definitions only if you want to build Lua --** with a number type different from double. You may also need to --** change lua_number2int & lua_number2integer. --** =================================================================== --*/ -- --#define LUA_NUMBER_DOUBLE --#define LUA_NUMBER double -- --/* --@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' --@* over a number. --*/ --#define LUAI_UACNUMBER double -- -- --/* --@@ LUA_NUMBER_SCAN is the format for reading numbers. --@@ LUA_NUMBER_FMT is the format for writing numbers. --@@ lua_number2str converts a number to a string. --@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. --@@ lua_str2number converts a string to a number. --*/ --#define LUA_NUMBER_SCAN "%lf" --#define LUA_NUMBER_FMT "%.14g" --#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) --#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ --#define lua_str2number(s,p) strtod((s), (p)) -- -- --/* --@@ The luai_num* macros define the primitive operations over numbers. --*/ --#if defined(LUA_CORE) --#include --#define luai_numadd(a,b) ((a)+(b)) --#define luai_numsub(a,b) ((a)-(b)) --#define luai_nummul(a,b) ((a)*(b)) --#define luai_numdiv(a,b) ((a)/(b)) --#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) --#define luai_numpow(a,b) (pow(a,b)) --#define luai_numunm(a) (-(a)) --#define luai_numeq(a,b) ((a)==(b)) --#define luai_numlt(a,b) ((a)<(b)) --#define luai_numle(a,b) ((a)<=(b)) --#define luai_numisnan(a) (!luai_numeq((a), (a))) --#endif -- -- --/* --@@ lua_number2int is a macro to convert lua_Number to int. --@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. --** CHANGE them if you know a faster way to convert a lua_Number to --** int (with any rounding method and without throwing errors) in your --** system. In Pentium machines, a naive typecast from double to int --** in C is extremely slow, so any alternative is worth trying. --*/ -- --/* On a Pentium, resort to a trick */ --#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ -- (defined(__i386) || defined (_M_IX86) || defined(__i386__)) -- --/* On a Microsoft compiler, use assembler */ --#if defined(_MSC_VER) -- --#define lua_number2int(i,d) __asm fld d __asm fistp i --#define lua_number2integer(i,n) lua_number2int(i, n) -- --/* the next trick should work on any Pentium, but sometimes clashes -- with a DirectX idiosyncrasy */ --#else -- --union luai_Cast { double l_d; long l_l; }; --#define lua_number2int(i,d) \ -- { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } --#define lua_number2integer(i,n) lua_number2int(i, n) -- --#endif -- -- --/* this option always works, but may be slow */ --#else --#define lua_number2int(i,d) ((i)=(int)(d)) --#define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) -- --#endif -- --/* }================================================================== */ -- -- - /* - @@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. - ** CHANGE it if your system requires alignments larger than double. (For -@@ -728,28 +652,6 @@ - #define luai_userstateyield(L,n) ((void)L) - - --/* --@@ LUA_INTFRMLEN is the length modifier for integer conversions --@* in 'string.format'. --@@ LUA_INTFRM_T is the integer type correspoding to the previous length --@* modifier. --** CHANGE them if your system supports long long or does not support long. --*/ -- --#if defined(LUA_USELONGLONG) -- --#define LUA_INTFRMLEN "ll" --#define LUA_INTFRM_T long long -- --#else -- --#define LUA_INTFRMLEN "l" --#define LUA_INTFRM_T long -- --#endif -- -- -- - /* =================================================================== */ - - /* -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lundump.c lua-5.1.3-patched/src/lundump.c ---- ../lua-5.1.3/src/lundump.c 2008-01-18 18:39:11.000000000 +0200 -+++ lua-5.1.3-patched/src/lundump.c 2008-03-26 04:33:51.000000000 +0200 -@@ -74,6 +74,13 @@ - return x; - } - -+static lua_Integer LoadInteger(LoadState* S) -+{ -+ lua_Integer x; -+ LoadVar(S,x); -+ return x; -+} -+ - static TString* LoadString(LoadState* S) - { - size_t size; -@@ -120,6 +127,9 @@ - case LUA_TNUMBER: - setnvalue(o,LoadNumber(S)); - break; -+ case LUA_TINT: /* Integer type saved in bytecode (see lcode.c) */ -+ setivalue(o,LoadInteger(S)); -+ break; - case LUA_TSTRING: - setsvalue2n(S->L,o,LoadString(S)); - break; -@@ -221,5 +231,22 @@ - *h++=(char)sizeof(size_t); - *h++=(char)sizeof(Instruction); - *h++=(char)sizeof(lua_Number); -- *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ -+ -+ /* -+ * Last byte of header (0/1 in unpatched Lua 5.1.3): -+ * -+ * 0: lua_Number is float or double, lua_Integer not used. (nonpatched only) -+ * 1: lua_Number is integer (nonpatched only) -+ * -+ * +2: LNUM_INT16: sizeof(lua_Integer) -+ * +4: LNUM_INT32: sizeof(lua_Integer) -+ * +8: LNUM_INT64: sizeof(lua_Integer) -+ * -+ * +0x80: LNUM_COMPLEX -+ */ -+ *h++ = (char)(sizeof(lua_Integer) -+#ifdef LNUM_COMPLEX -+ | 0x80 -+#endif -+ ); - } -Binary files ../lua-5.1.3/src/lundump.o and lua-5.1.3-patched/src/lundump.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lvm.c lua-5.1.3-patched/src/lvm.c ---- ../lua-5.1.3/src/lvm.c 2007-12-28 17:32:23.000000000 +0200 -+++ lua-5.1.3-patched/src/lvm.c 2008-03-14 11:13:17.000000000 +0200 -@@ -25,22 +25,35 @@ - #include "ltable.h" - #include "ltm.h" - #include "lvm.h" -- -- -+#include "llex.h" -+#include "lnum.h" - - /* limit for table tag-method chains (to avoid loops) */ - #define MAXTAGLOOP 100 - - --const TValue *luaV_tonumber (const TValue *obj, TValue *n) { -- lua_Number num; -+/* -+ * If 'obj' is a string, it is tried to be interpreted as a number. -+ */ -+const TValue *luaV_tonumber ( const TValue *obj, TValue *n) { -+ lua_Number d; -+ lua_Integer i; -+ - if (ttisnumber(obj)) return obj; -- if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { -- setnvalue(n, num); -- return n; -- } -- else -- return NULL; -+ -+ if (ttisstring(obj)) { -+ switch( luaO_str2d( svalue(obj), &d, &i ) ) { -+ case TK_INT: -+ setivalue(n,i); return n; -+ case TK_NUMBER: -+ setnvalue(n,d); return n; -+#ifdef LNUM_COMPLEX -+ case TK_NUMBER2: /* "N.NNNi", != 0 */ -+ setnvalue_complex_fast(n, d*I); return n; -+#endif -+ } -+ } -+ return NULL; - } - - -@@ -49,8 +62,7 @@ - return 0; - else { - char s[LUAI_MAXNUMBER2STR]; -- lua_Number n = nvalue(obj); -- lua_number2str(s, n); -+ luaO_num2buf(s,obj); - setsvalue2s(L, obj, luaS_new(L, s)); - return 1; - } -@@ -218,59 +230,127 @@ - } - - -+#ifdef LNUM_COMPLEX -+void error_complex( lua_State *L, const TValue *l, const TValue *r ) -+{ -+ char buf1[ LUAI_MAXNUMBER2STR ]; -+ char buf2[ LUAI_MAXNUMBER2STR ]; -+ luaO_num2buf( buf1, l ); -+ luaO_num2buf( buf2, r ); -+ luaG_runerror( L, "unable to compare: %s with %s", buf1, buf2 ); -+ /* no return */ -+} -+#endif -+ -+ - int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { - int res; -- if (ttype(l) != ttype(r)) -+ int tl,tr; -+ lua_Integer tmp; -+ -+ if (!ttype_ext_same(l,r)) - return luaG_ordererror(L, l, r); -- else if (ttisnumber(l)) -- return luai_numlt(nvalue(l), nvalue(r)); -- else if (ttisstring(l)) -- return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; -- else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) -+#ifdef LNUM_COMPLEX -+ if ( (nvalue_img(l)!=0) || (nvalue_img(r)!=0) ) -+ error_complex( L, l, r ); -+#endif -+ tl= ttype(l); tr= ttype(r); -+ if (tl==tr) { /* clear arithmetics */ -+ switch(tl) { -+ case LUA_TINT: return ivalue(l) < ivalue(r); -+ case LUA_TNUMBER: return luai_numlt(nvalue_fast(l), nvalue_fast(r)); -+ case LUA_TSTRING: return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; -+ } -+ } else if (tl==LUA_TINT) { /* l:int, r:num */ -+ /* Avoid accuracy losing casts: if 'r' is integer by value, do comparisons -+ * in integer realm. Only otherwise cast 'l' to FP (which might change its -+ * value). -+ */ -+ if (tt_integer_valued(r,&tmp)) -+ return ivalue(l) < tmp; -+ else -+ return luai_numlt( cast_num(ivalue(l)), nvalue_fast(r) ); -+ -+ } else if (tl==LUA_TNUMBER) { /* l:num, r:int */ -+ if (tt_integer_valued(l,&tmp)) -+ return tmp < ivalue(r); -+ else -+ return luai_numlt( nvalue_fast(l), cast_num(ivalue(r)) ); -+ -+ } else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) - return res; -+ - return luaG_ordererror(L, l, r); - } - - - static int lessequal (lua_State *L, const TValue *l, const TValue *r) { - int res; -- if (ttype(l) != ttype(r)) -+ int tl, tr; -+ lua_Integer tmp; -+ -+ if (!ttype_ext_same(l,r)) - return luaG_ordererror(L, l, r); -- else if (ttisnumber(l)) -- return luai_numle(nvalue(l), nvalue(r)); -- else if (ttisstring(l)) -- return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; -- else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ -+#ifdef LNUM_COMPLEX -+ if ( (nvalue_img(l)!=0) || (nvalue_img(r)!=0) ) -+ error_complex( L, l, r ); -+#endif -+ tl= ttype(l); tr= ttype(r); -+ if (tl==tr) { /* clear arithmetics */ -+ switch(tl) { -+ case LUA_TINT: return ivalue(l) <= ivalue(r); -+ case LUA_TNUMBER: return luai_numle(nvalue_fast(l), nvalue_fast(r)); -+ case LUA_TSTRING: return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; -+ } -+ } -+ if (tl==LUA_TINT) { /* l:int, r:num */ -+ if (tt_integer_valued(r,&tmp)) -+ return ivalue(l) <= tmp; -+ else -+ return luai_numle( cast_num(ivalue(l)), nvalue_fast(r) ); -+ -+ } else if (tl==LUA_TNUMBER) { /* l:num, r:int */ -+ if (tt_integer_valued(l,&tmp)) -+ return tmp <= ivalue(r); -+ else -+ return luai_numle( nvalue_fast(l), cast_num(ivalue(r)) ); -+ -+ } else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ - return res; - else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ - return !res; -+ - return luaG_ordererror(L, l, r); - } - - --int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { -+/* Note: 'luaV_equalval()' and 'luaO_rawequalObj()' have largely overlapping -+ * implementation. LUA_TNIL..LUA_TLIGHTUSERDATA cases could be handled -+ * simply by the 'default' case here. -+ */ -+int luaV_equalval (lua_State *L, const TValue *l, const TValue *r) { - const TValue *tm; -- lua_assert(ttype(t1) == ttype(t2)); -- switch (ttype(t1)) { -+ lua_assert(ttype_ext_same(l,r)); -+ switch (ttype(l)) { - case LUA_TNIL: return 1; -- case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); -- case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ -- case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); -+ case LUA_TINT: -+ case LUA_TNUMBER: return luaO_rawequalObj(l,r); -+ case LUA_TBOOLEAN: return bvalue(l) == bvalue(r); /* true must be 1 !! */ -+ case LUA_TLIGHTUSERDATA: return pvalue(l) == pvalue(r); - case LUA_TUSERDATA: { -- if (uvalue(t1) == uvalue(t2)) return 1; -- tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, -- TM_EQ); -+ if (uvalue(l) == uvalue(r)) return 1; -+ tm = get_compTM(L, uvalue(l)->metatable, uvalue(r)->metatable, TM_EQ); - break; /* will try TM */ - } - case LUA_TTABLE: { -- if (hvalue(t1) == hvalue(t2)) return 1; -- tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); -+ if (hvalue(l) == hvalue(r)) return 1; -+ tm = get_compTM(L, hvalue(l)->metatable, hvalue(r)->metatable, TM_EQ); - break; /* will try TM */ - } -- default: return gcvalue(t1) == gcvalue(t2); -+ default: return gcvalue(l) == gcvalue(r); - } - if (tm == NULL) return 0; /* no TM? */ -- callTMres(L, L->top, tm, t1, t2); /* call TM */ -+ callTMres(L, L->top, tm, l, r); /* call TM */ - return !l_isfalse(L->top); - } - -@@ -310,30 +390,6 @@ - } - - --static void Arith (lua_State *L, StkId ra, const TValue *rb, -- const TValue *rc, TMS op) { -- TValue tempb, tempc; -- const TValue *b, *c; -- if ((b = luaV_tonumber(rb, &tempb)) != NULL && -- (c = luaV_tonumber(rc, &tempc)) != NULL) { -- lua_Number nb = nvalue(b), nc = nvalue(c); -- switch (op) { -- 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_POW: setnvalue(ra, luai_numpow(nb, nc)); break; -- case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; -- default: lua_assert(0); break; -- } -- } -- else if (!call_binTM(L, rb, rc, ra, op)) -- luaG_aritherror(L, rb, rc); --} -- -- -- - /* - ** some macros for common tasks in `luaV_execute' - */ -@@ -357,17 +413,154 @@ - #define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } - - --#define arith_op(op,tm) { \ -- TValue *rb = RKB(i); \ -- TValue *rc = RKC(i); \ -- if (ttisnumber(rb) && ttisnumber(rc)) { \ -- lua_Number nb = nvalue(rb), nc = nvalue(rc); \ -- setnvalue(ra, op(nb, nc)); \ -- } \ -- else \ -- Protect(Arith(L, ra, rb, rc, tm)); \ -+/* Note: if called for unary operations, 'rc'=='rb'. -+ */ -+static void Arith (lua_State *L, StkId ra, const TValue *rb, -+ const TValue *rc, TMS op) { -+ TValue tempb, tempc; -+ const TValue *b, *c; -+ lua_Number nb,nc; -+ -+ if ((b = luaV_tonumber(rb, &tempb)) != NULL && -+ (c = luaV_tonumber(rc, &tempc)) != NULL) { -+ -+ /* Keep integer arithmetics in the integer realm, if possible. -+ */ -+ if (ttisint(b) && ttisint(c)) { -+ lua_Integer ib = ivalue(b), ic = ivalue(c); -+ lua_Integer *ri = &ra->value.i; -+ ra->tt= LUA_TINT; /* part of 'setivalue(ra)' */ -+ switch (op) { -+ case TM_ADD: if (try_addint( ri, ib, ic)) return; break; -+ case TM_SUB: if (try_subint( ri, ib, ic)) return; break; -+ case TM_MUL: if (try_mulint( ri, ib, ic)) return; break; -+ case TM_DIV: if (try_divint( ri, ib, ic)) return; break; -+ case TM_MOD: if (try_modint( ri, ib, ic)) return; break; -+ case TM_POW: if (try_powint( ri, ib, ic)) return; break; -+ case TM_UNM: if (try_unmint( ri, ib)) return; break; -+ default: lua_assert(0); -+ } -+ } -+ /* Fallback to floating point, when leaving range. */ -+ -+#ifdef LNUM_COMPLEX -+ if ((nvalue_img(b)!=0) || (nvalue_img(c)!=0)) { -+ lua_Complex r; -+ if (op==TM_UNM) { -+ r= -nvalue_complex_fast(b); /* never an integer (or scalar) */ -+ setnvalue_complex_fast( ra, r ); -+ } else { -+ lua_Complex bb= nvalue_complex(b), cc= nvalue_complex(c); -+ switch (op) { -+ case TM_ADD: r= bb + cc; break; -+ case TM_SUB: r= bb - cc; break; -+ case TM_MUL: r= bb * cc; break; -+ case TM_DIV: r= bb / cc; break; -+ case TM_MOD: -+ luaG_runerror(L, "attempt to use %% on complex numbers"); /* no return */ -+ case TM_POW: r= luai_vectpow( bb, cc ); break; -+ default: lua_assert(0); r=0; -+ } -+ setnvalue_complex( ra, r ); - } -+ return; -+ } -+#endif -+ nb = nvalue(b); nc = nvalue(c); -+ switch (op) { -+ case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); return; -+ case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); return; -+ case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); return; -+ case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); return; -+ case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); return; -+ case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); return; -+ case TM_UNM: setnvalue(ra, luai_numunm(nb)); return; -+ default: lua_assert(0); -+ } -+ } -+ -+ /* Either operand not a number */ -+ if (!call_binTM(L, rb, rc, ra, op)) -+ luaG_aritherror(L, rb, rc); -+} - -+/* Helper macro to sort arithmetic operations into four categories: -+ * TK_INT: integer - integer operands -+ * TK_NUMBER: number - number (non complex, either may be integer) -+ * TK_NUMBER2: complex numbers (at least the other) -+ * 0: non-numeric (at least the other) -+*/ -+#ifdef LNUM_COMPLEX -+static inline int arith_mode( const TValue *rb, const TValue *rc ) { -+ if (ttisint(rb) && ttisint(rc)) return TK_INT; -+ if (ttiscomplex(rb) || ttiscomplex(rc)) return TK_NUMBER2; -+ if (ttisnumber(rb) && ttisnumber(rc)) return TK_NUMBER; -+ return 0; -+} -+#else -+# define arith_mode(rb,rc) \ -+ ( (ttisint(rb) && ttisint(rc)) ? TK_INT : \ -+ (ttisnumber(rb) && ttisnumber(rc)) ? TK_NUMBER : 0 ) -+#endif -+ -+/* arith_op macro for two operators: -+ * automatically chooses, which function (number, integer, complex) to use -+ */ -+#define ARITH_OP2_START( op_num, op_int ) \ -+ int failed= 0; \ -+ switch( arith_mode(rb,rc) ) { \ -+ case TK_INT: \ -+ if (op_int ( &(ra)->value.i, ivalue(rb), ivalue(rc) )) \ -+ { ra->tt= LUA_TINT; break; } /* else flow through */ \ -+ case TK_NUMBER: \ -+ setnvalue(ra, op_num ( nvalue(rb), nvalue(rc) )); break; -+ -+#define ARITH_OP2_END \ -+ default: \ -+ failed= 1; break; \ -+ } if (!failed) continue; -+ -+#define arith_op_continue_scalar( op_num, op_int ) \ -+ ARITH_OP2_START( op_num, op_int ) \ -+ ARITH_OP2_END -+ -+#ifdef LNUM_COMPLEX -+# define arith_op_continue( op_num, op_int, op_complex ) \ -+ ARITH_OP2_START( op_num, op_int ) \ -+ case TK_NUMBER2: \ -+ setnvalue_complex( ra, op_complex ( nvalue_complex(rb), nvalue_complex(rc) ) ); break; \ -+ ARITH_OP2_END -+#else -+# define arith_op_continue(op_num,op_int,_) arith_op_continue_scalar(op_num,op_int) -+#endif -+ -+/* arith_op macro for one operator: -+ */ -+#define ARITH_OP1_START( op_num, op_int ) \ -+ int failed= 0; \ -+ switch( arith_mode(rb,rb) ) { \ -+ case TK_INT: \ -+ if (op_int ( &(ra)->value.i, ivalue(rb) )) \ -+ { ra->tt= LUA_TINT; break; } /* else flow through */ \ -+ case TK_NUMBER: \ -+ setnvalue(ra, op_num (nvalue(rb))); break; \ -+ -+#define ARITH_OP1_END \ -+ default: \ -+ failed= 1; break; \ -+ } if (!failed) continue; -+ -+#ifdef LNUM_COMPLEX -+# define arith_op1_continue( op_num, op_int, op_complex ) \ -+ ARITH_OP1_START( op_num, op_int ) \ -+ case TK_NUMBER2: \ -+ setnvalue_complex( ra, op_complex ( nvalue_complex_fast(rb) )); break; \ -+ ARITH_OP1_END -+#else -+# define arith_op1_continue( op_num, op_int, _ ) \ -+ ARITH_OP1_START( op_num, op_int ) \ -+ ARITH_OP1_END -+#endif - - - void luaV_execute (lua_State *L, int nexeccalls) { -@@ -468,38 +661,45 @@ - continue; - } - case OP_ADD: { -- arith_op(luai_numadd, TM_ADD); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue( luai_numadd, try_addint, luai_vectadd ); -+ Protect(Arith(L, ra, rb, rc, TM_ADD)); \ - continue; - } - case OP_SUB: { -- arith_op(luai_numsub, TM_SUB); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue( luai_numsub, try_subint, luai_vectsub ); -+ Protect(Arith(L, ra, rb, rc, TM_SUB)); - continue; - } - case OP_MUL: { -- arith_op(luai_nummul, TM_MUL); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue(luai_nummul, try_mulint, luai_vectmul); -+ Protect(Arith(L, ra, rb, rc, TM_MUL)); - continue; - } - case OP_DIV: { -- arith_op(luai_numdiv, TM_DIV); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue(luai_numdiv, try_divint, luai_vectdiv); -+ Protect(Arith(L, ra, rb, rc, TM_DIV)); - continue; - } - case OP_MOD: { -- arith_op(luai_nummod, TM_MOD); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue_scalar(luai_nummod, try_modint); /* scalars only */ -+ Protect(Arith(L, ra, rb, rc, TM_MOD)); - continue; - } - case OP_POW: { -- arith_op(luai_numpow, TM_POW); -+ TValue *rb = RKB(i), *rc= RKC(i); -+ arith_op_continue(luai_numpow, try_powint, luai_vectpow); -+ Protect(Arith(L, ra, rb, rc, TM_POW)); - continue; - } - case OP_UNM: { - TValue *rb = RB(i); -- if (ttisnumber(rb)) { -- lua_Number nb = nvalue(rb); -- setnvalue(ra, luai_numunm(nb)); -- } -- else { -- Protect(Arith(L, ra, rb, rb, TM_UNM)); -- } -+ arith_op1_continue(luai_numunm, try_unmint, luai_vectunm); -+ Protect(Arith(L, ra, rb, rb, TM_UNM)); - continue; - } - case OP_NOT: { -@@ -511,11 +711,11 @@ - const TValue *rb = RB(i); - switch (ttype(rb)) { - case LUA_TTABLE: { -- setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); -+ setivalue(ra, luaH_getn(hvalue(rb))); - break; - } - case LUA_TSTRING: { -- setnvalue(ra, cast_num(tsvalue(rb)->len)); -+ setivalue(ra, tsvalue(rb)->len); - break; - } - default: { /* try metamethod */ -@@ -648,14 +848,30 @@ - } - } - case OP_FORLOOP: { -- lua_Number step = nvalue(ra+2); -- lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ -- lua_Number limit = nvalue(ra+1); -- if (luai_numlt(0, step) ? luai_numle(idx, limit) -- : luai_numle(limit, idx)) { -- dojump(L, pc, GETARG_sBx(i)); /* jump back */ -- setnvalue(ra, idx); /* update internal index... */ -- setnvalue(ra+3, idx); /* ...and external index */ -+ /* If start,step and limit are all integers, we don't need to check -+ * against overflow in the looping. -+ */ -+ if (ttisint(ra) && ttisint(ra+1) && ttisint(ra+2)) { -+ lua_Integer step = ivalue(ra+2); -+ lua_Integer idx = ivalue(ra) + step; /* increment index */ -+ lua_Integer limit = ivalue(ra+1); -+ if (step > 0 ? (idx <= limit) : (limit <= idx)) { -+ dojump(L, pc, GETARG_sBx(i)); /* jump back */ -+ setivalue(ra, idx); /* update internal index... */ -+ setivalue(ra+3, idx); /* ...and external index */ -+ } -+ } else { -+ /* non-integer looping (don't use 'nvalue_fast', some may be integer!) -+ */ -+ lua_Number step = nvalue(ra+2); -+ lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ -+ lua_Number limit = nvalue(ra+1); -+ if (luai_numlt(0, step) ? luai_numle(idx, limit) -+ : luai_numle(limit, idx)) { -+ dojump(L, pc, GETARG_sBx(i)); /* jump back */ -+ setnvalue(ra, idx); /* update internal index... */ -+ setnvalue(ra+3, idx); /* ...and external index */ -+ } - } - continue; - } -@@ -664,13 +880,21 @@ - const TValue *plimit = ra+1; - const TValue *pstep = ra+2; - L->savedpc = pc; /* next steps may throw errors */ -+ /* Using same location for tonumber's both arguments, effectively does -+ * in-place modification (string->number). */ - if (!tonumber(init, ra)) - luaG_runerror(L, LUA_QL("for") " initial value must be a number"); - else if (!tonumber(plimit, ra+1)) - luaG_runerror(L, LUA_QL("for") " limit must be a number"); - else if (!tonumber(pstep, ra+2)) - luaG_runerror(L, LUA_QL("for") " step must be a number"); -- setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); -+ /* Step back one value (keep within integers if we can) -+ */ -+ if (!( ttisint(ra) && ttisint(pstep) && -+ try_subint( &ra->value.i, ivalue(ra), ivalue(pstep) ) )) { -+ /* don't use 'nvalue_fast()', values may be integer */ -+ setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); -+ } - dojump(L, pc, GETARG_sBx(i)); - continue; - } -@@ -707,7 +931,7 @@ - luaH_resizearray(L, h, last); /* pre-alloc it at once */ - for (; n > 0; n--) { - TValue *val = ra+n; -- setobj2t(L, luaH_setnum(L, h, last--), val); -+ setobj2t(L, luaH_setint(L, h, last--), val); - luaC_barriert(L, h, val); - } - continue; -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/lvm.h lua-5.1.3-patched/src/lvm.h ---- ../lua-5.1.3/src/lvm.h 2007-12-27 15:02:25.000000000 +0200 -+++ lua-5.1.3-patched/src/lvm.h 2008-03-19 10:49:34.000000000 +0200 -@@ -15,11 +15,9 @@ - - #define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) - --#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ -- (((o) = luaV_tonumber(o,n)) != NULL)) -+#define tonumber(o,n) (ttisnumber(o) || (((o) = luaV_tonumber(o,n)) != NULL)) - --#define equalobj(L,o1,o2) \ -- (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) -+#define equalobj(L,o1,o2) (ttype_ext_same(o1,o2) && luaV_equalval(L, o1, o2)) - - - LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); -Binary files ../lua-5.1.3/src/lvm.o and lua-5.1.3-patched/src/lvm.o differ -Binary files ../lua-5.1.3/src/lzio.o and lua-5.1.3-patched/src/lzio.o differ -diff -urN --exclude=.svn --exclude=.DS_Store ../lua-5.1.3/src/print.c lua-5.1.3-patched/src/print.c ---- ../lua-5.1.3/src/print.c 2007-03-26 03:17:38.000000000 +0300 -+++ lua-5.1.3-patched/src/print.c 2008-03-19 11:04:51.000000000 +0200 -@@ -14,6 +14,7 @@ - #include "lobject.h" - #include "lopcodes.h" - #include "lundump.h" -+#include "lnum.h" - - #define PrintFunction luaU_print - -@@ -59,8 +60,16 @@ - case LUA_TBOOLEAN: - printf(bvalue(o) ? "true" : "false"); - break; -+ case LUA_TINT: -+ printf(LUA_INTEGER_FMT,ivalue(o)); -+ break; - case LUA_TNUMBER: -- printf(LUA_NUMBER_FMT,nvalue(o)); -+#ifdef LNUM_COMPLEX -+ // TBD: Do we get complex values here? -+ { lua_Number b= nvalue_img_fast(o); -+ printf( LUA_NUMBER_FMT "%s" LUA_NUMBER_FMT "i", nvalue_fast(o), b>=0 ? "+":"", b ); } -+#endif -+ printf(LUA_NUMBER_FMT,nvalue_fast(o)); - break; - case LUA_TSTRING: - PrintString(rawtsvalue(o)); -Binary files ../lua-5.1.3/src/print.o and lua-5.1.3-patched/src/print.o differ diff --git a/contrib/package/lua-luci/patches/020-shared_liblua.patch b/contrib/package/lua-luci/patches/020-shared_liblua.patch deleted file mode 100644 index 7942e8760..000000000 --- a/contrib/package/lua-luci/patches/020-shared_liblua.patch +++ /dev/null @@ -1,139 +0,0 @@ -diff -ur lua-5.1.3-pt1/Makefile lua-5.1.3-pt2/Makefile ---- lua-5.1.3-pt1/Makefile 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/Makefile 2008-04-05 15:13:38.000000000 +0200 -@@ -37,8 +37,8 @@ - - # What to install. - TO_BIN= lua luac --TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp --TO_LIB= liblua.a -+TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp lnum_config.h -+TO_LIB= liblua.a liblua.so liblua.so.$R - TO_MAN= lua.1 luac.1 - - # Lua version and release. -diff -ur lua-5.1.3-pt1/src/ldo.h lua-5.1.3-pt2/src/ldo.h ---- lua-5.1.3-pt1/src/ldo.h 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/src/ldo.h 2008-04-05 14:25:40.000000000 +0200 -@@ -46,7 +46,7 @@ - LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); - LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); - LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); --LUAI_FUNC void luaD_growstack (lua_State *L, int n); -+LUA_API void luaD_growstack (lua_State *L, int n); - - LUAI_FUNC void luaD_throw (lua_State *L, int errcode); - LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); -diff -ur lua-5.1.3-pt1/src/lfunc.h lua-5.1.3-pt2/src/lfunc.h ---- lua-5.1.3-pt1/src/lfunc.h 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/src/lfunc.h 2008-04-05 14:25:40.000000000 +0200 -@@ -18,7 +18,7 @@ - cast(int, sizeof(TValue *)*((n)-1))) - - --LUAI_FUNC Proto *luaF_newproto (lua_State *L); -+LUA_API Proto *luaF_newproto (lua_State *L); - LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e); - LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e); - LUAI_FUNC UpVal *luaF_newupval (lua_State *L); -diff -ur lua-5.1.3-pt1/src/lmem.h lua-5.1.3-pt2/src/lmem.h ---- lua-5.1.3-pt1/src/lmem.h 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/src/lmem.h 2008-04-05 14:25:40.000000000 +0200 -@@ -38,9 +38,9 @@ - ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) - - --LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, -+LUA_API void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, - size_t size); --LUAI_FUNC void *luaM_toobig (lua_State *L); -+LUA_API void *luaM_toobig (lua_State *L); - LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, - size_t size_elem, int limit, - const char *errormsg); -diff -ur lua-5.1.3-pt1/src/lstring.h lua-5.1.3-pt2/src/lstring.h ---- lua-5.1.3-pt1/src/lstring.h 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/src/lstring.h 2008-04-05 14:25:40.000000000 +0200 -@@ -25,7 +25,7 @@ - - LUAI_FUNC void luaS_resize (lua_State *L, int newsize); - LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); --LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); -+LUA_API TString *luaS_newlstr (lua_State *L, const char *str, size_t l); - - - #endif -diff -ur lua-5.1.3-pt1/src/lundump.h lua-5.1.3-pt2/src/lundump.h ---- lua-5.1.3-pt1/src/lundump.h 2008-04-05 14:23:14.000000000 +0200 -+++ lua-5.1.3-pt2/src/lundump.h 2008-04-05 14:25:40.000000000 +0200 -@@ -17,7 +17,7 @@ - LUAI_FUNC void luaU_header (char* h); - - /* dump one chunk; from ldump.c */ --LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); -+LUA_API int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); - - #ifdef luac_c - /* print one chunk; from print.c */ -diff -ur lua-5.1.3-pt1/src/Makefile lua-5.1.3-pt2/src/Makefile ---- lua-5.1.3-pt1/src/Makefile 2008-04-05 14:23:31.000000000 +0200 -+++ lua-5.1.3-pt2/src/Makefile 2008-04-05 14:25:40.000000000 +0200 -@@ -23,6 +23,7 @@ - PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris - - LUA_A= liblua.a -+LUA_SO= liblua.so - CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \ - lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \ - lundump.o lvm.o lzio.o lnum.o -@@ -33,11 +34,12 @@ - LUA_O= lua.o - - LUAC_T= luac --LUAC_O= luac.o print.o -+LUAC_O= luac.o print.o lopcodes.o - - ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O) --ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) -+ALL_T= $(LUA_A) $(LUA_SO) $(LUA_T) $(LUAC_T) - ALL_A= $(LUA_A) -+ALL_SO= $(LUA_SO) - - default: $(PLAT) - -@@ -47,14 +49,23 @@ - - a: $(ALL_A) - -+so: $(ALL_SO) -+ - $(LUA_A): $(CORE_O) $(LIB_O) - $(AR) $@ $? - $(RANLIB) $@ - --$(LUA_T): $(LUA_O) $(LUA_A) -- $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) -+$(LUA_SO): $(CORE_O) $(LIB_O) -+ $(LD) -o $@.$(PKG_VERSION) -shared -soname="$@.$(PKG_VERSION)" $? -+ ln -fs $@.$(PKG_VERSION) $@ -+ -+$(LUA_T): $(LUA_O) $(LUA_SO) -+ $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUA_O) $(LIBS) -+ -+$(LUAC_T): $(LUAC_O) $(LUA_SO) -+ $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUAC_O) $(LIBS) - --$(LUAC_T): $(LUAC_O) $(LUA_A) -+$(LUAC_T)-host: $(LUAC_O) $(LUA_A) - $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) - - clean: -@@ -96,7 +107,7 @@ - $(MAKE) all MYCFLAGS= - - linux: -- $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses" -+ $(MAKE) all MYCFLAGS+=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses" - - macosx: - $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline" diff --git a/contrib/package/lua-luci/patches/030-archindependent-bytecode.patch b/contrib/package/lua-luci/patches/030-archindependent-bytecode.patch deleted file mode 100644 index 4ba58ebfb..000000000 --- a/contrib/package/lua-luci/patches/030-archindependent-bytecode.patch +++ /dev/null @@ -1,113 +0,0 @@ -diff -ur lua-5.1.3-pt2/src/ldump.c lua-5.1.3-pt3/src/ldump.c ---- lua-5.1.3-pt2/src/ldump.c 2008-04-05 14:25:13.000000000 +0200 -+++ lua-5.1.3-pt3/src/ldump.c 2008-04-05 14:28:27.000000000 +0200 -@@ -67,12 +67,12 @@ - { - if (s==NULL || getstr(s)==NULL) - { -- size_t size=0; -+ unsigned int size=0; - DumpVar(size,D); - } - else - { -- size_t size=s->tsv.len+1; /* include trailing '\0' */ -+ unsigned int size=s->tsv.len+1; /* include trailing '\0' */ - DumpVar(size,D); - DumpBlock(getstr(s),size,D); - } -diff -ur lua-5.1.3-pt2/src/lundump.c lua-5.1.3-pt3/src/lundump.c ---- lua-5.1.3-pt2/src/lundump.c 2008-04-05 14:25:13.000000000 +0200 -+++ lua-5.1.3-pt3/src/lundump.c 2008-04-05 14:28:27.000000000 +0200 -@@ -25,6 +25,7 @@ - ZIO* Z; - Mbuffer* b; - const char* name; -+ int swap; - } LoadState; - - #ifdef LUAC_TRUST_BINARIES -@@ -40,7 +41,6 @@ - } - #endif - --#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) - #define LoadByte(S) (lu_byte)LoadChar(S) - #define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) - #define LoadVector(S,b,n,size) LoadMem(S,b,n,size) -@@ -52,6 +52,49 @@ - IF (r!=0, "unexpected end"); - } - -+static void LoadMem (LoadState* S, void* b, int n, size_t size) -+{ -+ LoadBlock(S,b,n*size); -+ if (S->swap) -+ { -+ char* p=(char*) b; -+ char c; -+ switch (size) -+ { -+ case 1: -+ break; -+ case 2: -+ while (n--) -+ { -+ c=p[0]; p[0]=p[1]; p[1]=c; -+ p+=2; -+ } -+ break; -+ case 4: -+ while (n--) -+ { -+ c=p[0]; p[0]=p[3]; p[3]=c; -+ c=p[1]; p[1]=p[2]; p[2]=c; -+ p+=4; -+ } -+ break; -+ case 8: -+ while (n--) -+ { -+ c=p[0]; p[0]=p[7]; p[7]=c; -+ c=p[1]; p[1]=p[6]; p[6]=c; -+ c=p[2]; p[2]=p[5]; p[5]=c; -+ c=p[3]; p[3]=p[4]; p[4]=c; -+ p+=8; -+ } -+ break; -+ default: -+ IF(1, "bad size"); -+ break; -+ } -+ } -+} -+ - static int LoadChar(LoadState* S) - { - char x; -@@ -83,7 +126,7 @@ - - static TString* LoadString(LoadState* S) - { -- size_t size; -+ unsigned int size; - LoadVar(S,size); - if (size==0) - return NULL; -@@ -194,6 +237,7 @@ - char s[LUAC_HEADERSIZE]; - luaU_header(h); - LoadBlock(S,s,LUAC_HEADERSIZE); -+ S->swap=(s[6]!=h[6]); s[6]=h[6]; - IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); - } - -@@ -228,7 +272,7 @@ - *h++=(char)LUAC_FORMAT; - *h++=(char)*(char*)&x; /* endianness */ - *h++=(char)sizeof(int); -- *h++=(char)sizeof(size_t); -+ *h++=(char)sizeof(unsigned int); - *h++=(char)sizeof(Instruction); - *h++=(char)sizeof(lua_Number); - diff --git a/contrib/package/lua-luci/patches/100-no_readline.patch b/contrib/package/lua-luci/patches/100-no_readline.patch deleted file mode 100644 index 7368187d8..000000000 --- a/contrib/package/lua-luci/patches/100-no_readline.patch +++ /dev/null @@ -1,53 +0,0 @@ -diff -ur lua-luci-5.1.3/src/luaconf.h lua-luci-5.1.3-new/src/luaconf.h ---- lua-luci-5.1.3/src/luaconf.h 2008-04-14 13:19:54.000000000 +0200 -+++ lua-luci-5.1.3-new/src/luaconf.h 2008-04-14 13:19:17.000000000 +0200 -@@ -38,7 +38,6 @@ - #if defined(LUA_USE_LINUX) - #define LUA_USE_POSIX - #define LUA_USE_DLOPEN /* needs an extra library: -ldl */ --#define LUA_USE_READLINE /* needs some extra libraries */ - #endif - - #if defined(LUA_USE_MACOSX) -Nur in lua-luci-5.1.3-new/src: luaconf.h.orig. -diff -ur lua-luci-5.1.3/src/Makefile lua-luci-5.1.3-new/src/Makefile ---- lua-luci-5.1.3/src/Makefile 2008-04-14 13:19:57.000000000 +0200 -+++ lua-luci-5.1.3-new/src/Makefile 2008-04-14 13:19:17.000000000 +0200 -@@ -17,6 +17,7 @@ - MYCFLAGS= - MYLDFLAGS= - MYLIBS= -+# USE_READLINE=1 - - # == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= - -@@ -86,7 +87,7 @@ - @echo "MYLIBS = $(MYLIBS)" - - # convenience targets for popular platforms -- -+RFLAG=$(if $(USE_READLINE),-DLUA_USE_READLINE) - none: - @echo "Please choose a platform:" - @echo " $(PLATS)" -@@ -101,16 +102,16 @@ - $(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E" - - freebsd: -- $(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline" -+ $(MAKE) all MYCFLAGS="-DLUA_USE_LINUX $(RFLAG)" MYLIBS="-Wl,-E$(if $(USE_READLINE), -lreadline)" - - generic: - $(MAKE) all MYCFLAGS= - - linux: -- $(MAKE) all MYCFLAGS+=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses" -+ $(MAKE) all MYCFLAGS+="-DLUA_USE_LINUX $(RFLAG)" MYLIBS="-Wl,-E -ldl $(if $(USE_READLINE), -lreadline -lhistory -lncurses)" - - macosx: -- $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline" -+ $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX $(if $(USE_READLINE), MYLIBS="-lreadline") - # use this on Mac OS X 10.3- - # $(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX - -Nur in lua-luci-5.1.3-new/src: Makefile.orig. diff --git a/contrib/package/lua-luci/patches/200-lua-path.patch b/contrib/package/lua-luci/patches/200-lua-path.patch deleted file mode 100644 index 60797e98d..000000000 --- a/contrib/package/lua-luci/patches/200-lua-path.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -ur lua-5.1.3/etc/lua.pc lua-5.1.3-new/etc/lua.pc ---- lua-5.1.3/etc/lua.pc 2008-01-11 14:12:59.000000000 +0100 -+++ lua-5.1.3-new/etc/lua.pc 2008-05-18 22:09:24.000000000 +0200 -@@ -8,7 +8,7 @@ - R= 5.1.3 - - # grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' --prefix= /usr/local -+prefix= /usr - INSTALL_BIN= ${prefix}/bin - INSTALL_INC= ${prefix}/include - INSTALL_LIB= ${prefix}/lib -diff -ur lua-5.1.3/Makefile lua-5.1.3-new/Makefile ---- lua-5.1.3/Makefile 2008-05-18 22:06:55.000000000 +0200 -+++ lua-5.1.3-new/Makefile 2008-05-18 22:09:13.000000000 +0200 -@@ -12,7 +12,7 @@ - # doc directory.) You may want to make these paths consistent with LUA_ROOT, - # LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc). - # --INSTALL_TOP= /usr/local -+INSTALL_TOP= /usr - INSTALL_BIN= $(INSTALL_TOP)/bin - INSTALL_INC= $(INSTALL_TOP)/include - INSTALL_LIB= $(INSTALL_TOP)/lib -diff -ur lua-5.1.3/src/luaconf.h lua-5.1.3-new/src/luaconf.h ---- lua-5.1.3/src/luaconf.h 2008-05-18 22:07:11.000000000 +0200 -+++ lua-5.1.3-new/src/luaconf.h 2008-05-18 22:09:50.000000000 +0200 -@@ -95,7 +95,7 @@ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" - - #else --#define LUA_ROOT "/usr/local/" -+#define LUA_ROOT "/usr/" - #define LUA_LDIR LUA_ROOT "share/lua/5.1/" - #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" - #define LUA_PATH_DEFAULT \ diff --git a/contrib/package/luaposix/Makefile b/contrib/package/luaposix/Makefile index 2eef3ad08..09a63798e 100644 --- a/contrib/package/luaposix/Makefile +++ b/contrib/package/luaposix/Makefile @@ -18,7 +18,7 @@ define Package/luaposix CATEGORY:=Libraries TITLE:=Lua Posix library URL:=http://luaforge.net/projects/luaposix/ - DEPENDS:=+liblua-luci + DEPENDS:=+liblua MAINTAINER:=Steven Barth endef diff --git a/core/src/dispatcher.lua b/core/src/dispatcher.lua index 84c665eda..a05c8805c 100644 --- a/core/src/dispatcher.lua +++ b/core/src/dispatcher.lua @@ -137,11 +137,30 @@ function createindex() end end +-- Shortcut for creating a dispatching node +function entry(path, target, title, order, add) + add = add or {} + + local c = node(path) + c.target = target + c.title = title + c.order = order + + for k,v in pairs(add) do + c[k] = v + end + + return c +end -- Fetch a dispatching node function node(...) local c = tree + if arg[1] and type(arg[1]) == "table" then + arg = arg[1] + end + for k,v in ipairs(arg) do if not c.nodes[v] then c.nodes[v] = {nodes={}} -- 2.11.0