From 5652475dd22d71b41db23e7eb71be550c623d1a0 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Tue, 17 Feb 2015 22:46:20 -0400 Subject: [PATCH] Use lightuserdata instead of Lua numbers (doubles) to represent touch IDs. --HG-- branch : minor --- src/common/int.h | 2 -- src/modules/event/sdl/Event.cpp | 7 ++++++- src/modules/touch/wrap_Touch.cpp | 14 +++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/common/int.h b/src/common/int.h index 13a6a17ec..5b42c1d4b 100644 --- a/src/common/int.h +++ b/src/common/int.h @@ -22,8 +22,6 @@ #define LOVE_INT_H // C standard sized integer types. -// This header was added to Visual studio in VS 2012, which is LOVE's current -// minimum supported VS version (as of this comment's commit date.) #include #define LOVE_INT8_MAX 0x7F diff --git a/src/modules/event/sdl/Event.cpp b/src/modules/event/sdl/Event.cpp index e15c8eb6c..af36a7424 100644 --- a/src/modules/event/sdl/Event.cpp +++ b/src/modules/event/sdl/Event.cpp @@ -302,7 +302,12 @@ Message *Event::convert(const SDL_Event &e) const if (touchmodule) touchmodule->onEvent(e.type, touchinfo); - vargs.push_back(new Variant((double) touchinfo.id)); + // This is a bit hackish and we lose the higher 32 bits of the id on + // 32-bit systems, but SDL only ever gives id's that at most use as many + // bits as can fit in a pointer (for now.) + // We use lightuserdata instead of a lua_Number (double) because doubles + // can't represent all possible id values on 64-bit systems. + vargs.push_back(new Variant((void *) (intptr_t) touchinfo.id)); vargs.push_back(new Variant(touchinfo.x)); vargs.push_back(new Variant(touchinfo.y)); vargs.push_back(new Variant(touchinfo.dx)); diff --git a/src/modules/touch/wrap_Touch.cpp b/src/modules/touch/wrap_Touch.cpp index bd5ccdfc2..148046325 100644 --- a/src/modules/touch/wrap_Touch.cpp +++ b/src/modules/touch/wrap_Touch.cpp @@ -19,6 +19,7 @@ **/ #include "common/config.h" +#include "common/int.h" // LOVE #include "wrap_Touch.h" @@ -40,8 +41,12 @@ int w_getTouchIDs(lua_State *L) for (size_t i = 0; i < ids.size(); i++) { - // Lets hope the ID can be accurately represented in a Lua number... - lua_pushnumber(L, (lua_Number) ids[i]); + // This is a bit hackish and we lose the higher 32 bits of the id on + // 32-bit systems, but SDL only ever gives id's that at most use as many + // bits as can fit in a pointer (for now.) + // We use lightuserdata instead of a lua_Number (double) because doubles + // can't represent all possible id values on 64-bit systems. + lua_pushlightuserdata(L, (void *) (intptr_t) ids[i]); lua_rawseti(L, -2, i + 1); } @@ -50,7 +55,10 @@ int w_getTouchIDs(lua_State *L) int w_getPosition(lua_State *L) { - int64 id = (int64) luaL_checknumber(L, 1); + if (!lua_islightuserdata(L, 1)) + return luax_typerror(L, 1, "touch id"); + + int64 id = (int64) (intptr_t) lua_touserdata(L, 1); double x = 0; double y = 0;