The Proxy struct now stores an actual love::Object pointer (rather than void*), which makes code using Proxies a bit cleaner.

--HG--
branch : minor
This commit is contained in:
Alex Szpakowski
2015-02-21 20:52:29 -04:00
parent e26e170f78
commit 33d20620b5
5 changed files with 30 additions and 33 deletions
+2 -2
View File
@@ -102,8 +102,8 @@ Variant::Variant(love::Type udatatype, void *userdata)
{ {
Proxy *p = (Proxy *) userdata; Proxy *p = (Proxy *) userdata;
flags = p->flags; flags = p->flags;
data.userdata = p->data; data.userdata = p->object;
((love::Object *) data.userdata)->retain(); p->object->retain();
} }
else else
data.userdata = userdata; data.userdata = userdata;
+4 -7
View File
@@ -42,10 +42,7 @@ namespace love
static int w__gc(lua_State *L) static int w__gc(lua_State *L)
{ {
Proxy *p = (Proxy *) lua_touserdata(L, 1); Proxy *p = (Proxy *) lua_touserdata(L, 1);
Object *object = (Object *) p->data; p->object->release();
object->release();
return 0; return 0;
} }
@@ -67,7 +64,7 @@ static int w__eq(lua_State *L)
{ {
Proxy *p1 = (Proxy *)lua_touserdata(L, 1); Proxy *p1 = (Proxy *)lua_touserdata(L, 1);
Proxy *p2 = (Proxy *)lua_touserdata(L, 2); Proxy *p2 = (Proxy *)lua_touserdata(L, 2);
luax_pushboolean(L, p1->data == p2->data); luax_pushboolean(L, p1->object == p2->object);
return 1; return 1;
} }
@@ -209,7 +206,7 @@ int luax_register_module(lua_State *L, const WrappedModule &m)
luax_insistregistry(L, REGISTRY_MODULES); luax_insistregistry(L, REGISTRY_MODULES);
Proxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); Proxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy));
p->data = m.module; p->object = m.module;
p->flags = m.flags; p->flags = m.flags;
luaL_newmetatable(L, m.module->getName()); luaL_newmetatable(L, m.module->getName());
@@ -383,7 +380,7 @@ void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *o
object->retain(); object->retain();
u->data = (void *) object; u->object = object;
u->flags = flags; u->flags = flags;
luaL_newmetatable(L, name); luaL_newmetatable(L, name);
+6 -6
View File
@@ -65,8 +65,8 @@ struct Proxy
// Holds type information (see types.h). // Holds type information (see types.h).
bits flags; bits flags;
// The light userdata (pointer to the love::Object). // Pointer to the actual object.
void *data; Object *object;
}; };
/** /**
@@ -409,7 +409,7 @@ T *luax_checktype(lua_State *L, int idx, const char *name, love::bits type)
if ((u->flags & type) != type) if ((u->flags & type) != type)
luax_typerror(L, idx, name); luax_typerror(L, idx, name);
return (T *)u->data; return (T *)u->object;
} }
template <typename T> template <typename T>
@@ -428,7 +428,7 @@ T *luax_getmodule(lua_State *L, const char *k, love::bits type)
lua_pop(L, 2); lua_pop(L, 2);
return (T *)u->data; return (T *)u->object;
} }
template <typename T> template <typename T>
@@ -450,7 +450,7 @@ T *luax_optmodule(lua_State *L, const char *k, love::bits type)
lua_pop(L, 2); lua_pop(L, 2);
return (T *) u->data; return (T *) u->object;
} }
/** /**
@@ -465,7 +465,7 @@ T *luax_optmodule(lua_State *L, const char *k, love::bits type)
template <typename T> template <typename T>
T *luax_totype(lua_State *L, int idx, const char * /* name */, love::bits /* type */) T *luax_totype(lua_State *L, int idx, const char * /* name */, love::bits /* type */)
{ {
return (T *)(((Proxy *)lua_touserdata(L, idx))->data); return (T *)(((Proxy *)lua_touserdata(L, idx))->object);
} }
Type luax_type(lua_State *L, int idx); Type luax_type(lua_State *L, int idx);
+17 -17
View File
@@ -352,11 +352,11 @@ Message *Event::convert(const SDL_Event &e) const
else else
{ {
Proxy proxy; Proxy proxy;
proxy.data = new love::filesystem::DroppedFile(e.drop.file); proxy.object = new love::filesystem::DroppedFile(e.drop.file);
proxy.flags = FILESYSTEM_DROPPED_FILE_T; proxy.flags = FILESYSTEM_DROPPED_FILE_T;
vargs.push_back(new Variant(FILESYSTEM_DROPPED_FILE_ID, &proxy)); vargs.push_back(new Variant(FILESYSTEM_DROPPED_FILE_ID, &proxy));
msg = new Message("filedropped", vargs); msg = new Message("filedropped", vargs);
((Object *) proxy.data)->release(); proxy.object->release();
} }
} }
SDL_free(e.drop.file); SDL_free(e.drop.file);
@@ -401,8 +401,8 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONDOWN:
case SDL_JOYBUTTONUP: case SDL_JOYBUTTONUP:
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
proxy.data = joymodule->getJoystickFromID(e.jbutton.which); proxy.object = joymodule->getJoystickFromID(e.jbutton.which);
if (!proxy.data) if (!proxy.object)
break; break;
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
@@ -414,8 +414,8 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
case SDL_JOYAXISMOTION: case SDL_JOYAXISMOTION:
{ {
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
proxy.data = joymodule->getJoystickFromID(e.jaxis.which); proxy.object = joymodule->getJoystickFromID(e.jaxis.which);
if (!proxy.data) if (!proxy.object)
break; break;
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
@@ -430,8 +430,8 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
break; break;
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
proxy.data = joymodule->getJoystickFromID(e.jhat.which); proxy.object = joymodule->getJoystickFromID(e.jhat.which);
if (!proxy.data) if (!proxy.object)
break; break;
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
@@ -448,8 +448,8 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
break; break;
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
proxy.data = joymodule->getJoystickFromID(e.cbutton.which); proxy.object = joymodule->getJoystickFromID(e.cbutton.which);
if (!proxy.data) if (!proxy.object)
break; break;
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
@@ -464,8 +464,8 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
break; break;
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
proxy.data = joymodule->getJoystickFromID(e.caxis.which); proxy.object = joymodule->getJoystickFromID(e.caxis.which);
if (!proxy.data) if (!proxy.object)
break; break;
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
@@ -478,9 +478,9 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
break; break;
case SDL_JOYDEVICEADDED: case SDL_JOYDEVICEADDED:
// jdevice.which is the joystick device index. // jdevice.which is the joystick device index.
proxy.data = joymodule->addJoystick(e.jdevice.which); proxy.object = joymodule->addJoystick(e.jdevice.which);
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
if (proxy.data) if (proxy.object)
{ {
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
msg = new Message("joystickadded", vargs); msg = new Message("joystickadded", vargs);
@@ -488,11 +488,11 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const
break; break;
case SDL_JOYDEVICEREMOVED: case SDL_JOYDEVICEREMOVED:
// jdevice.which is the joystick instance ID now. // jdevice.which is the joystick instance ID now.
proxy.data = joymodule->getJoystickFromID(e.jdevice.which); proxy.object = joymodule->getJoystickFromID(e.jdevice.which);
proxy.flags = JOYSTICK_JOYSTICK_T; proxy.flags = JOYSTICK_JOYSTICK_T;
if (proxy.data) if (proxy.object)
{ {
joymodule->removeJoystick((joystick::Joystick *) proxy.data); joymodule->removeJoystick((joystick::Joystick *) proxy.object);
vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy));
msg = new Message("joystickremoved", vargs); msg = new Message("joystickremoved", vargs);
} }
+1 -1
View File
@@ -110,7 +110,7 @@ void LuaThread::onError()
Proxy p; Proxy p;
p.flags = THREAD_THREAD_T; p.flags = THREAD_THREAD_T;
p.data = this; p.object = this;
std::vector<StrongRef<Variant>> vargs = { std::vector<StrongRef<Variant>> vargs = {
new Variant(THREAD_THREAD_ID, &p), new Variant(THREAD_THREAD_ID, &p),