diff --git a/src/common/Variant.cpp b/src/common/Variant.cpp index b4def9e52..64cdca009 100644 --- a/src/common/Variant.cpp +++ b/src/common/Variant.cpp @@ -227,7 +227,7 @@ void Variant::toLua(lua_State *L) const char *name = NULL; love::types.find(udatatype, name); ((love::Object *) data.userdata)->retain(); - luax_newtype(L, name, flags, data.userdata); + luax_pushtype(L, name, flags, (love::Object *) data.userdata); } else lua_pushlightuserdata(L, data.userdata); diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index c085203c8..00ea9f687 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -18,6 +18,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ +#include "config.h" #include "runtime.h" // LOVE @@ -36,6 +37,7 @@ namespace love static thread::Mutex *gcmutex = 0; void *_gcmutex = 0; + /** * Called when an object is collected. The object is released * once in this function, possibly deleting it. @@ -47,13 +49,21 @@ static int w__gc(lua_State *L) gcmutex = thread::newMutex(); _gcmutex = (void *) gcmutex; } + Proxy *p = (Proxy *)lua_touserdata(L, 1); Object *t = (Object *)p->data; - if (p->own) - { - thread::Lock lock(gcmutex); + + thread::Lock lock(gcmutex); + + int numretains = p->retains; + if (numretains >= 0) + numretains = std::min(numretains, t->getReferenceCount()); + + for (int i = numretains; i > 0; i--) t->release(); - } + + // Signal that this Proxy is dead. + p->retains = -1; return 0; } @@ -214,10 +224,10 @@ void luax_setfuncs(lua_State *L, const luaL_Reg *l) int luax_register_module(lua_State *L, const WrappedModule &m) { // Put a reference to the C++ module in Lua. - luax_getregistry(L, REGISTRY_MODULES); + luax_insistregistry(L, REGISTRY_MODULES); Proxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); - p->own = true; + p->retains = 1; p->data = m.module; p->flags = m.flags; @@ -273,6 +283,31 @@ int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f) if (!love::getType(tname, ltype)) printf("Missing type entry for type name: %s\n", tname); + // Get the place for storing and re-using instantiated love types. + luax_getregistry(L, REGISTRY_TYPES); + + // Create registry._lovetypes if it doesn't exist yet. + if (!lua_istable(L, -1)) + { + lua_newtable(L); + lua_replace(L, -2); + + // Create a metatable. + lua_newtable(L); + + // metatable.__mode = "v". Weak userdata values. + lua_pushliteral(L, "v"); + lua_setfield(L, -2, "__mode"); + + // setmetatable(newtable, metatable) + lua_setmetatable(L, -2); + + // registry._lovetypes = newtable + lua_setfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + } + else + lua_pop(L, 1); + luaL_newmetatable(L, tname); // m.__index = m @@ -358,18 +393,74 @@ int luax_register_searcher(lua_State *L, lua_CFunction f, int pos) return 0; } -void luax_newtype(lua_State *L, const char *name, bits flags, void *data, bool own) +void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own) { Proxy *u = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); - u->data = data; + u->data = (void *) data; u->flags = flags; - u->own = own; + u->retains = own ? 1 : 0; luaL_newmetatable(L, name); lua_setmetatable(L, -2); } +void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own) +{ + // Fetch the registry table of instantiated types. + luax_getregistry(L, REGISTRY_TYPES); + + // The table might not exist - it should be insisted in luax_register_type. + if (!lua_istable(L, -1)) + { + lua_pop(L, 1); + return luax_rawnewtype(L, name, flags, data, own); + } + + // Get the value of lovetypes[data] on the stack. + lua_pushlightuserdata(L, (void *) data); + lua_gettable(L, -2); + + // If the Proxy userdata isn't in the instantiated types table yet, add it. + if (lua_type(L, -1) != LUA_TUSERDATA) + { + lua_pop(L, 1); + + luax_rawnewtype(L, name, flags, data, own); + + lua_pushlightuserdata(L, (void *) data); + lua_pushvalue(L, -2); + + // lovetypes[data] = Proxy. + lua_settable(L, -4); + + // Remove the lovetypes table from the stack. + lua_remove(L, -2); + + // The Proxy userdata remains at the top of the stack. + return; + } + + // Remove the lovetypes table from the stack. + lua_remove(L, -2); + + // If the object should be released on GC and we already have a stored + // Proxy, we should tell the Proxy that the object was retained again. + if (own) + { + Proxy *p = (Proxy *) lua_touserdata(L, -1); + + thread::EmptyLock lock; + if (gcmutex) + lock.setLock(gcmutex); + + if (p->retains >= 0) + ++(p->retains); + } + + // Keep the Proxy userdata on the stack. +} + bool luax_istype(lua_State *L, int idx, love::bits type) { if (lua_isuserdata(L, idx) == 0) @@ -499,7 +590,20 @@ int luax_insistlove(lua_State *L, const char *k) return 1; } -int luax_getregistry(lua_State *L, Registry r) +int luax_getlove(lua_State *L, const char *k) +{ + lua_getglobal(L, "love"); + + if (!lua_isnil(L, -1)) + { + lua_getfield(L, -1, k); + lua_replace(L, -2); + } + + return 1; +} + +int luax_insistregistry(lua_State *L, Registry r) { switch (r) { @@ -507,6 +611,24 @@ int luax_getregistry(lua_State *L, Registry r) return luax_insistlove(L, "_gc"); case REGISTRY_MODULES: return luax_insistlove(L, "_modules"); + case REGISTRY_TYPES: + return luax_insist(L, LUA_REGISTRYINDEX, "_lovetypes"); + default: + return luaL_error(L, "Attempted to use invalid registry."); + } +} + +int luax_getregistry(lua_State *L, Registry r) +{ + switch (r) + { + case REGISTRY_GC: + return luax_getlove(L, "_gc"); + case REGISTRY_MODULES: + return luax_getlove(L, "_modules"); + case REGISTRY_TYPES: + lua_getfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + return 1; default: return luaL_error(L, "Attempted to use invalid registry."); } diff --git a/src/common/runtime.h b/src/common/runtime.h index 8abf5ad2c..62f47a2ab 100644 --- a/src/common/runtime.h +++ b/src/common/runtime.h @@ -23,6 +23,7 @@ // LOVE #include "types.h" +#include "Object.h" // Lua extern "C" { @@ -41,16 +42,16 @@ class Reference; // Exposed mutex of the GC extern void *_gcmutex; -extern unsigned int _gcthread; /** * Registries represent special tables which can be accessed with - * luax_getregistry. + * luax_insistregistry and luax_getregistry. **/ enum Registry { REGISTRY_GC = 1, - REGISTRY_MODULES + REGISTRY_MODULES, + REGISTRY_TYPES }; /** @@ -64,11 +65,11 @@ struct Proxy // Holds type information (see types.h). bits flags; - // The light userdata. + // The light userdata (pointer to the love::Object). void *data; - // True if Lua should delete on GC. - bool own; + // The number of times release() should be called on GC. + int retains; }; /** @@ -99,7 +100,7 @@ struct WrappedModule * * In any case, the top stack element is popped, regardless of its type. **/ -Reference *luax_refif (lua_State *L, int type); +Reference *luax_refif(lua_State *L, int type); /** * Prints the current contents of the stack. Only useful for debugging. @@ -265,14 +266,29 @@ int luax_table_insert(lua_State *L, int tindex, int vindex, int pos = -1); int luax_register_searcher(lua_State *L, lua_CFunction f, int pos = -1); /** - * Creates a new Lua-accessible object of the given type, and put it on the stack. + * Pushes a Lua representation of the given object onto the stack, creating and + * storing the Lua representation in a weak table if it doesn't exist yet. * @param L The Lua state. - * @param name The name of the type. This must match the used earlier with luax_register_type. - * @param flags The type information. + * @param name The name of the type. This must match the name used with luax_register_type. + * @param flags The type information of the object. * @param data The pointer to the actual object. - * @own Set this to true (default) if the object should be released upon garbage collection. + * @param own Set this to true (default) if the object should be released upon garbage collection. **/ -void luax_newtype(lua_State *L, const char *name, bits flags, void *data, bool own = true); +void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own = true); + +/** + * Creates a new Lua representation of the given object *without* checking if it + * exists yet, and *without* storing it in a weak table. + * This should only be used when performance is an extreme concern and the + * object is not ever expected to be pushed to Lua again, as it prevents the + * Lua-side objects from working in all cases when used as keys in tables. + * @param L The Lua state. + * @param name The name of the type. This must match the name used with luax_register_type. + * @param flags The type information of the object. + * @param data The pointer to the actual object. + * @param own Set this to true (default) if the object should be released upon garbage collection. + **/ +void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own = true); /** * Checks whether the value at idx is a certain type. @@ -348,8 +364,23 @@ int luax_insistglobal(lua_State *L, const char *k); int luax_insistlove(lua_State *L, const char *k); /** - * Gets (creates if needed) the specified Registry, and puts it on top - * of the stack. + * Pushes the table 'k' in the love table onto the stack. Pushes nil if the + * table doesn't exist. + * @param k The name of the table we want to get. + **/ +int luax_getlove(lua_State *L, const char *k); + +/** + * Gets (creates if needed) the specified Registry, and pushes it into the + * stack. + * @param L The Lua state. + * @param r The Registry to get. + **/ +int luax_insistregistry(lua_State *L, Registry r); + +/** + * Gets the specified Registry, and pushes it onto the stack. Pushes nil if the + * registry hasn't been created (see luax_insistregistry.) * @param L The Lua state. * @param r The Registry to get. **/ @@ -384,7 +415,7 @@ T *luax_checktype(lua_State *L, int idx, const char *name, love::bits type) template T *luax_getmodule(lua_State *L, const char *k, love::bits type) { - luax_getregistry(L, REGISTRY_MODULES); + luax_insistregistry(L, REGISTRY_MODULES); lua_getfield(L, -1, k); if (!lua_isuserdata(L, -1)) @@ -403,7 +434,7 @@ T *luax_getmodule(lua_State *L, const char *k, love::bits type) template T *luax_optmodule(lua_State *L, const char *k, love::bits type) { - luax_getregistry(L, REGISTRY_MODULES); + luax_insistregistry(L, REGISTRY_MODULES); lua_getfield(L, -1, k); if (!lua_isuserdata(L, -1)) diff --git a/src/modules/audio/wrap_Audio.cpp b/src/modules/audio/wrap_Audio.cpp index c2f6ffaaa..513fcc0a0 100644 --- a/src/modules/audio/wrap_Audio.cpp +++ b/src/modules/audio/wrap_Audio.cpp @@ -65,7 +65,7 @@ int w_newSource(lua_State *L) if (t) { - luax_newtype(L, "Source", AUDIO_SOURCE_T, (void *)t); + luax_pushtype(L, "Source", AUDIO_SOURCE_T, t); return 1; } else @@ -227,7 +227,7 @@ int w_getRecordedData(lua_State *L) if (!sd) lua_pushnil(L); else - luax_newtype(L, "SoundData", SOUND_SOUND_DATA_T, (void *)sd); + luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); return 1; } @@ -237,7 +237,7 @@ int w_stopRecording(lua_State *L) { love::sound::SoundData *sd = instance->stopRecording(true); if (!sd) lua_pushnil(L); - else luax_newtype(L, "SoundData", SOUND_SOUND_DATA_T, (void *)sd); + else luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); return 1; } instance->stopRecording(false); diff --git a/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/src/modules/filesystem/physfs/wrap_Filesystem.cpp index bdffb756e..a46007bf5 100644 --- a/src/modules/filesystem/physfs/wrap_Filesystem.cpp +++ b/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -170,7 +170,7 @@ int w_newFile(lua_State *L) } } - luax_newtype(L, "File", FILESYSTEM_FILE_T, (void *)t); + luax_pushtype(L, "File", FILESYSTEM_FILE_T, t); return 1; } @@ -196,7 +196,7 @@ int w_newFileData(lua_State *L) { return ioError(L, "%s", e.what()); } - luax_newtype(L, "FileData", FILESYSTEM_FILE_DATA_T, (void *) data); + luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, data); return 1; } else @@ -227,7 +227,7 @@ int w_newFileData(lua_State *L) return luaL_error(L, "Invalid FileData decoder: %s", decstr); } - luax_newtype(L, "FileData", FILESYSTEM_FILE_DATA_T, (void *)t); + luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, t); return 1; } @@ -395,7 +395,7 @@ int w_lines(lua_State *L) { return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "File", FILESYSTEM_FILE_T, file); + luax_pushtype(L, "File", FILESYSTEM_FILE_T, file); } else return luaL_error(L, "Expected filename."); diff --git a/src/modules/font/freetype/wrap_Font.cpp b/src/modules/font/freetype/wrap_Font.cpp index 12002fcf0..9aa7b254f 100644 --- a/src/modules/font/freetype/wrap_Font.cpp +++ b/src/modules/font/freetype/wrap_Font.cpp @@ -64,7 +64,7 @@ int w_newRasterizer(lua_State *L) return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t); + luax_pushtype(L, "Rasterizer", FONT_RASTERIZER_T, t); return 1; } @@ -92,7 +92,7 @@ int w_newGlyphData(lua_State *L) t = instance->newGlyphData(r, g); } - luax_newtype(L, "GlyphData", FONT_GLYPH_DATA_T, t); + luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, t); return 1; } diff --git a/src/modules/font/wrap_Rasterizer.cpp b/src/modules/font/wrap_Rasterizer.cpp index 862ed576c..e2499c89e 100644 --- a/src/modules/font/wrap_Rasterizer.cpp +++ b/src/modules/font/wrap_Rasterizer.cpp @@ -91,7 +91,7 @@ int w_Rasterizer_getGlyphData(lua_State *L) return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "GlyphData", FONT_GLYPH_DATA_T, (void *) g); + luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, g); return 1; } diff --git a/src/modules/graphics/opengl/wrap_Canvas.cpp b/src/modules/graphics/opengl/wrap_Canvas.cpp index 84b5a3bcf..02c575387 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.cpp +++ b/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -66,7 +66,7 @@ int w_Canvas_getImageData(lua_State *L) Canvas *canvas = luax_checkcanvas(L, 1); love::image::Image *image = luax_getmodule(L, "image", MODULE_IMAGE_T); love::image::ImageData *img = canvas->getImageData(image); - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)img); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, img); return 1; } diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index acfb3af2f..233dfd40b 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -195,7 +195,7 @@ int w_newImage(lua_State *L) // Push the type. - luax_newtype(L, "Image", GRAPHICS_IMAGE_T, (void *)image); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, image); return 1; } @@ -335,7 +335,9 @@ int w_newGeometry(lua_State *L) geom->setVertexColors(hasvertexcolors); - luax_newtype(L, "Geometry", GRAPHICS_GEOMETRY_T, (void *) geom); + // Note: This should be changed to luax_pushtype if the new Geometry is ever + // expected to be pushed to Lua from another C++ function! + luax_rawnewtype(L, "Geometry", GRAPHICS_GEOMETRY_T, geom); return 1; } @@ -350,7 +352,9 @@ int w_newQuad(lua_State *L) Geometry *quad = instance->newQuad(x, y, w, h, sw, sh); - luax_newtype(L, "Geometry", GRAPHICS_GEOMETRY_T, (void *)quad); + // Note: This should be changed to luax_pushtype if the new Geometry is ever + // expected to be pushed to Lua from another C++ function! + luax_rawnewtype(L, "Geometry", GRAPHICS_GEOMETRY_T, quad); return 1; } @@ -384,7 +388,7 @@ int w_newFont(lua_State *L) return luaL_error(L, "Could not load font."); // Push the type. - luax_newtype(L, "Font", GRAPHICS_FONT_T, (void *)font); + luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); return 1; } @@ -404,7 +408,7 @@ int w_newImageFont(lua_State *L) love::image::ImageData *id = i->getImageData(); if (!id) return luaL_argerror(L, 1, "Image cannot be compressed."); - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)id, false); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, id, false); lua_replace(L, 1); } @@ -424,7 +428,7 @@ int w_newImageFont(lua_State *L) return luaL_error(L, "Could not load font."); // Push the type. - luax_newtype(L, "Font", GRAPHICS_FONT_T, (void *)font); + luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); return 1; } @@ -449,7 +453,7 @@ int w_newSpriteBatch(lua_State *L) { return luaL_error(L, e.what()); } - luax_newtype(L, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T, (void *)t); + luax_pushtype(L, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T, t); return 1; } @@ -468,7 +472,7 @@ int w_newParticleSystem(lua_State *L) { return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T, (void *) t); + luax_pushtype(L, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T, t); return 1; } @@ -496,7 +500,7 @@ int w_newCanvas(lua_State *L) if (NULL == canvas) return luaL_error(L, "Canvas not created, but no error thrown. I don't even..."); - luax_newtype(L, "Canvas", GRAPHICS_CANVAS_T, (void *)canvas); + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, canvas); return 1; } @@ -581,7 +585,7 @@ int w_newShader(lua_State *L) try { Shader *shader = instance->newShader(sources); - luax_newtype(L, "Shader", GRAPHICS_SHADER_T, (void *)shader); + luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); } catch (const love::Exception &e) { @@ -683,7 +687,7 @@ int w_getFont(lua_State *L) return 0; f->retain(); - luax_newtype(L, "Font", GRAPHICS_FONT_T, (void *)f); + luax_pushtype(L, "Font", GRAPHICS_FONT_T, f); return 1; } @@ -937,7 +941,7 @@ int w_newScreenshot(lua_State *L) { return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)i); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); return 1; } @@ -1002,13 +1006,13 @@ int w_getCanvas(lua_State *L) if (canvas) { canvas->retain(); - luax_newtype(L, "Canvas", GRAPHICS_CANVAS_T, (void *) canvas); + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, canvas); const std::vector &attachments = canvas->getAttachedCanvases(); for (size_t i = 0; i < attachments.size(); i++) { attachments[i]->retain(); - luax_newtype(L, "Canvas", GRAPHICS_CANVAS_T, (void *) attachments[i]); + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, attachments[i]); n++; } } @@ -1037,7 +1041,7 @@ int w_getShader(lua_State *L) if (shader) { shader->retain(); - luax_newtype(L, "Shader", GRAPHICS_SHADER_T, (void *) shader); + luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); } else lua_pushnil(L); diff --git a/src/modules/graphics/opengl/wrap_Image.cpp b/src/modules/graphics/opengl/wrap_Image.cpp index 7b62c6cdb..a53aa96dd 100644 --- a/src/modules/graphics/opengl/wrap_Image.cpp +++ b/src/modules/graphics/opengl/wrap_Image.cpp @@ -206,7 +206,7 @@ int w_Image_getData(lua_State *L) if (t) { t->retain(); - luax_newtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, (void *) t); + luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); } else lua_pushnil(L); @@ -217,7 +217,7 @@ int w_Image_getData(lua_State *L) if (t) { t->retain(); - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *) t); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); } else lua_pushnil(L); diff --git a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp index 374627ef1..a8028120c 100644 --- a/src/modules/graphics/opengl/wrap_ParticleSystem.cpp +++ b/src/modules/graphics/opengl/wrap_ParticleSystem.cpp @@ -49,7 +49,7 @@ int w_ParticleSystem_getImage(lua_State *L) ParticleSystem *t = luax_checkparticlesystem(L, 1); Image *i = t->getImage(); i->retain(); - luax_newtype(L, "Image", GRAPHICS_IMAGE_T, (void *) i); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, i); return 1; } diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp index 7c05fd6f0..ba99958b5 100644 --- a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -152,7 +152,7 @@ int w_SpriteBatch_getImage(lua_State *L) SpriteBatch *t = luax_checkspritebatch(L, 1); Image *image = t->getImage(); image->retain(); - luax_newtype(L, "Image", GRAPHICS_IMAGE_T, (void *)image); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, image); return 1; } diff --git a/src/modules/image/wrap_Image.cpp b/src/modules/image/wrap_Image.cpp index 8ba5d5479..1f075f506 100644 --- a/src/modules/image/wrap_Image.cpp +++ b/src/modules/image/wrap_Image.cpp @@ -51,7 +51,7 @@ int w_newImageData(lua_State *L) { return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *)t); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); return 1; } @@ -73,7 +73,7 @@ int w_newImageData(lua_State *L) return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void *) t); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); return 1; } @@ -96,7 +96,7 @@ int w_newCompressedData(lua_State *L) return luaL_error(L, "%s", e.what()); } - luax_newtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, (void *) t); + luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); return 1; } diff --git a/src/modules/joystick/sdl/wrap_JoystickModule.cpp b/src/modules/joystick/sdl/wrap_JoystickModule.cpp index 58e620b61..295170789 100644 --- a/src/modules/joystick/sdl/wrap_JoystickModule.cpp +++ b/src/modules/joystick/sdl/wrap_JoystickModule.cpp @@ -39,7 +39,7 @@ int w_getJoysticks(lua_State *L) { love::joystick::Joystick *stick = instance->getJoystick(i); stick->retain(); - luax_newtype(L, "Joystick", JOYSTICK_JOYSTICK_T, (void *) stick); + luax_pushtype(L, "Joystick", JOYSTICK_JOYSTICK_T, stick); lua_rawseti(L, -2, i + 1); } diff --git a/src/modules/math/wrap_BezierCurve.cpp b/src/modules/math/wrap_BezierCurve.cpp index 67e721fad..040432130 100644 --- a/src/modules/math/wrap_BezierCurve.cpp +++ b/src/modules/math/wrap_BezierCurve.cpp @@ -44,7 +44,7 @@ int w_BezierCurve_getDerivative(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); BezierCurve *deriv = new BezierCurve(curve->getDerivative()); - luax_newtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, (void *)deriv); + luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, deriv); return 1; } diff --git a/src/modules/math/wrap_Math.cpp b/src/modules/math/wrap_Math.cpp index eedcff6aa..2a245a077 100644 --- a/src/modules/math/wrap_Math.cpp +++ b/src/modules/math/wrap_Math.cpp @@ -90,7 +90,7 @@ int w_newRandomGenerator(lua_State *L) } } - luax_newtype(L, "RandomGenerator", MATH_RANDOM_GENERATOR_T, (void *) t); + luax_pushtype(L, "RandomGenerator", MATH_RANDOM_GENERATOR_T, t); return 1; } @@ -128,7 +128,7 @@ int w_newBezierCurve(lua_State *L) } BezierCurve *curve = Math::instance.newBezierCurve(points); - luax_newtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, (void *)curve); + luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, curve); return 1; } diff --git a/src/modules/mouse/wrap_Mouse.cpp b/src/modules/mouse/wrap_Mouse.cpp index 052243b30..f543489f2 100644 --- a/src/modules/mouse/wrap_Mouse.cpp +++ b/src/modules/mouse/wrap_Mouse.cpp @@ -71,7 +71,7 @@ int w_newCursor(lua_State *L) } } - luax_newtype(L, "Cursor", MOUSE_CURSOR_T, (void *) cursor); + luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); return 1; } @@ -96,7 +96,7 @@ int w_getCursor(lua_State *L) if (cursor) { cursor->retain(); - luax_newtype(L, "Cursor", MOUSE_CURSOR_T, (void *) cursor); + luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); } else lua_pushnil(L); diff --git a/src/modules/physics/box2d/Body.cpp b/src/modules/physics/box2d/Body.cpp index 1783ed73c..2e9cb3f29 100644 --- a/src/modules/physics/box2d/Body.cpp +++ b/src/modules/physics/box2d/Body.cpp @@ -428,7 +428,7 @@ int Body::getFixtureList(lua_State *L) const if (!fixture) throw love::Exception("A fixture has escaped Memoizer!"); fixture->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)fixture); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); lua_rawseti(L, -2, i); i++; } diff --git a/src/modules/physics/box2d/Physics.cpp b/src/modules/physics/box2d/Physics.cpp index 35253dbb9..b39aab489 100644 --- a/src/modules/physics/box2d/Physics.cpp +++ b/src/modules/physics/box2d/Physics.cpp @@ -153,7 +153,7 @@ int Physics::newPolygonShape(lua_State *L) s->Set(vecs, vcount); PolygonShape *p = new PolygonShape(s); - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void *)p); + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, p); return 1; } @@ -185,7 +185,7 @@ int Physics::newChainShape(lua_State *L) ChainShape *c = new ChainShape(s); delete[] vecs; - luax_newtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, (void *)c); + luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, c); return 1; } diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index 5cf8581c9..bc919fda6 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -59,7 +59,7 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse if (a != 0) { a->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)a); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); } else throw love::Exception("A fixture has escaped Memoizer!"); @@ -71,7 +71,7 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse if (b != 0) { b->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)b); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); } else throw love::Exception("A fixture has escaped Memoizer!"); @@ -83,7 +83,7 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse else cobj->retain(); - luax_newtype(L, "Contact", (PHYSICS_CONTACT_T), (void *)cobj); + luax_pushtype(L, "Contact", (PHYSICS_CONTACT_T), cobj); int args = 3; if (impulse) @@ -133,8 +133,8 @@ bool World::ContactFilter::process(Fixture *a, Fixture *b) { lua_State *L = ref->getL(); ref->push(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)a); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)b); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); lua_call(L, 2, 1); return luax_toboolean(L, -1); } @@ -162,7 +162,7 @@ bool World::QueryCallback::ReportFixture(b2Fixture *fixture) if (!f) throw love::Exception("A fixture has escaped Memoizer!"); f->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)f); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); lua_call(L, 1, 1); return luax_toboolean(L, -1); } @@ -190,7 +190,7 @@ float32 World::RayCastCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 & if (!f) throw love::Exception("A fixture has escaped Memoizer!"); f->retain(); - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)f); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); b2Vec2 scaledPoint = Physics::scaleUp(point); lua_pushnumber(L, scaledPoint.x); lua_pushnumber(L, scaledPoint.y); @@ -441,7 +441,7 @@ int World::getBodyList(lua_State *L) const if (!body) throw love::Exception("A body has escaped Memoizer!"); body->retain(); - luax_newtype(L, "Body", PHYSICS_BODY_T, (void *)body); + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); lua_rawseti(L, -2, i); i++; } @@ -460,7 +460,7 @@ int World::getJointList(lua_State *L) const Joint *joint = (Joint *)Memoizer::find(j); if (!joint) throw love::Exception("A joint has escaped Memoizer!"); joint->retain(); - luax_newtype(L, "Joint", PHYSICS_JOINT_T, (void *)joint); + luax_pushtype(L, "Joint", PHYSICS_JOINT_T, joint); lua_rawseti(L, -2, i); i++; } @@ -481,7 +481,7 @@ int World::getContactList(lua_State *L) const contact = new Contact(c); else contact->retain(); - luax_newtype(L, "Contact", PHYSICS_CONTACT_T, (void *)contact); + luax_pushtype(L, "Contact", PHYSICS_CONTACT_T, contact); lua_rawseti(L, -2, i); i++; } diff --git a/src/modules/physics/box2d/wrap_ChainShape.cpp b/src/modules/physics/box2d/wrap_ChainShape.cpp index 5cc905e1b..bebd030d9 100644 --- a/src/modules/physics/box2d/wrap_ChainShape.cpp +++ b/src/modules/physics/box2d/wrap_ChainShape.cpp @@ -65,7 +65,7 @@ int w_ChainShape_getChildEdge(lua_State *L) int index = luaL_checkint(L, 2) - 1; // Convert from 1-based index EdgeShape *e = 0; ASSERT_GUARD(e = c->getChildEdge(index);) - luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, e); + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, e); return 1; } diff --git a/src/modules/physics/box2d/wrap_Fixture.cpp b/src/modules/physics/box2d/wrap_Fixture.cpp index 4adeb0996..2b4698bc2 100644 --- a/src/modules/physics/box2d/wrap_Fixture.cpp +++ b/src/modules/physics/box2d/wrap_Fixture.cpp @@ -112,7 +112,7 @@ int w_Fixture_getBody(lua_State *L) if (body == 0) return 0; body->retain(); - luax_newtype(L, "Body", PHYSICS_BODY_T, (void *)body); + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); return 1; } @@ -125,19 +125,19 @@ int w_Fixture_getShape(lua_State *L) switch (shape->getType()) { case Shape::SHAPE_EDGE: - luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, (void *)shape); + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); break; case Shape::SHAPE_CHAIN: - luax_newtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, (void *)shape); + luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, shape); break; case Shape::SHAPE_CIRCLE: - luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void *)shape); + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); break; case Shape::SHAPE_POLYGON: - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void *)shape); + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); break; default: - luax_newtype(L, "Shape", PHYSICS_SHAPE_T, (void *)shape); + luax_pushtype(L, "Shape", PHYSICS_SHAPE_T, shape); break; } return 1; diff --git a/src/modules/physics/box2d/wrap_Physics.cpp b/src/modules/physics/box2d/wrap_Physics.cpp index 1c0bc357c..ca1a5174d 100644 --- a/src/modules/physics/box2d/wrap_Physics.cpp +++ b/src/modules/physics/box2d/wrap_Physics.cpp @@ -58,7 +58,7 @@ int w_newWorld(lua_State *L) World *w; ASSERT_GUARD(w = instance->newWorld(gx, gy, sleep);) - luax_newtype(L, "World", PHYSICS_WORLD_T, (void *)w); + luax_pushtype(L, "World", PHYSICS_WORLD_T, w); return 1; } @@ -76,7 +76,7 @@ int w_newBody(lua_State *L) Body *body; ASSERT_GUARD(body = instance->newBody(world, x, y, btype);) - luax_newtype(L, "Body", PHYSICS_BODY_T, (void *)body); + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); return 1; } @@ -87,7 +87,7 @@ int w_newFixture(lua_State *L) float density = (float)luaL_optnumber(L, 3, 1.0f); Fixture *fixture; ASSERT_GUARD(fixture = instance->newFixture(body, shape, density);) - luax_newtype(L, "Fixture", PHYSICS_FIXTURE_T, (void *)fixture); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); return 1; } @@ -100,7 +100,7 @@ int w_newCircleShape(lua_State *L) float radius = (float)luaL_checknumber(L, 1); CircleShape *shape; ASSERT_GUARD(shape = instance->newCircleShape(radius);) - luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void *)shape); + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); return 1; } else if (top == 3) @@ -110,7 +110,7 @@ int w_newCircleShape(lua_State *L) float radius = (float)luaL_checknumber(L, 3); CircleShape *shape; ASSERT_GUARD(shape = instance->newCircleShape(x, y, radius);) - luax_newtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, (void *)shape); + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); return 1; } else @@ -127,7 +127,7 @@ int w_newRectangleShape(lua_State *L) float h = (float)luaL_checknumber(L, 2); PolygonShape *shape; ASSERT_GUARD(shape = instance->newRectangleShape(w, h);) - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void *)shape); + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); return 1; } else if (top == 4 || top == 5) @@ -139,7 +139,7 @@ int w_newRectangleShape(lua_State *L) float angle = (float)luaL_optnumber(L, 5, 0); PolygonShape *shape; ASSERT_GUARD(shape = instance->newRectangleShape(x, y, w, h, angle);) - luax_newtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, (void *)shape); + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); return 1; } else @@ -154,7 +154,7 @@ int w_newEdgeShape(lua_State *L) float y2 = (float)luaL_checknumber(L, 4); EdgeShape *shape; ASSERT_GUARD(shape = instance->newEdgeShape(x1, y1, x2, y2);) - luax_newtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, (void *)shape); + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); return 1; } @@ -179,7 +179,7 @@ int w_newDistanceJoint(lua_State *L) bool collideConnected = luax_optboolean(L, 7, false); DistanceJoint *j; ASSERT_GUARD(j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected);) - luax_newtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, (void *)j); + luax_pushtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, j); return 1; } @@ -190,7 +190,7 @@ int w_newMouseJoint(lua_State *L) float y = (float)luaL_checknumber(L, 3); MouseJoint *j; ASSERT_GUARD(j = instance->newMouseJoint(body, x, y);) - luax_newtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, (void *)j); + luax_pushtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, j); return 1; } @@ -203,7 +203,7 @@ int w_newRevoluteJoint(lua_State *L) bool collideConnected = luax_optboolean(L, 5, false); RevoluteJoint *j; ASSERT_GUARD(j = instance->newRevoluteJoint(body1, body2, x, y, collideConnected);) - luax_newtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, (void *)j); + luax_pushtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, j); return 1; } @@ -233,7 +233,7 @@ int w_newPrismaticJoint(lua_State *L) } PrismaticJoint *j; ASSERT_GUARD(j = instance->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) - luax_newtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, (void *)j); + luax_pushtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, j); return 1; } @@ -254,7 +254,7 @@ int w_newPulleyJoint(lua_State *L) PulleyJoint *j; ASSERT_GUARD(j = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected);) - luax_newtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, (void *)j); + luax_pushtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, j); return 1; } @@ -267,7 +267,7 @@ int w_newGearJoint(lua_State *L) GearJoint *j; ASSERT_GUARD(j = instance->newGearJoint(joint1, joint2, ratio, collideConnected);) - luax_newtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, (void *)j); + luax_pushtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, j); return 1; } @@ -293,7 +293,7 @@ int w_newFrictionJoint(lua_State *L) } FrictionJoint *j; ASSERT_GUARD(j = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected);) - luax_newtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, (void *)j); + luax_pushtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, j); return 1; } @@ -319,7 +319,7 @@ int w_newWeldJoint(lua_State *L) } WeldJoint *j; ASSERT_GUARD(j = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected);) - luax_newtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, (void *)j); + luax_pushtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, j); return 1; } @@ -350,7 +350,7 @@ int w_newWheelJoint(lua_State *L) WheelJoint *j; ASSERT_GUARD(j = instance->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) - luax_newtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, (void *)j); + luax_pushtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, j); return 1; } @@ -366,7 +366,7 @@ int w_newRopeJoint(lua_State *L) bool collideConnected = luax_optboolean(L, 8, false); RopeJoint *j; ASSERT_GUARD(j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected);) - luax_newtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, (void *)j); + luax_pushtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, j); return 1; } diff --git a/src/modules/sound/wrap_Sound.cpp b/src/modules/sound/wrap_Sound.cpp index 0ef52e425..795ffceb8 100644 --- a/src/modules/sound/wrap_Sound.cpp +++ b/src/modules/sound/wrap_Sound.cpp @@ -72,8 +72,7 @@ int w_newSoundData(lua_State *L) } } - luax_newtype(L, "SoundData", SOUND_SOUND_DATA_T, (void *)t); - + luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, t); return 1; } @@ -92,7 +91,7 @@ int w_newDecoder(lua_State *L) Decoder *t = instance->newDecoder(data, bufferSize); if (t == 0) return luaL_error(L, "Extension \"%s\" not supported.", data->getExtension().c_str()); - luax_newtype(L, "Decoder", SOUND_DECODER_T, (void *)t); + luax_pushtype(L, "Decoder", SOUND_DECODER_T, t); } catch(love::Exception &e) { diff --git a/src/modules/thread/wrap_ThreadModule.cpp b/src/modules/thread/wrap_ThreadModule.cpp index 9d6d6306b..56d971f10 100644 --- a/src/modules/thread/wrap_ThreadModule.cpp +++ b/src/modules/thread/wrap_ThreadModule.cpp @@ -54,14 +54,14 @@ int w_newThread(lua_State *L) } LuaThread *t = instance->newThread(name, data); - luax_newtype(L, "Thread", THREAD_THREAD_T, (void *)t); + luax_pushtype(L, "Thread", THREAD_THREAD_T, t); return 1; } int w_newChannel(lua_State *L) { Channel *c = instance->newChannel(); - luax_newtype(L, "Channel", THREAD_CHANNEL_T, (void *)c); + luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); return 1; } @@ -69,7 +69,7 @@ int w_getChannel(lua_State *L) { std::string name = luax_checkstring(L, 1); Channel *c = instance->getChannel(name); - luax_newtype(L, "Channel", THREAD_CHANNEL_T, (void *)c); + luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); return 1; } diff --git a/src/modules/window/wrap_Window.cpp b/src/modules/window/wrap_Window.cpp index 6874bef88..52d551914 100644 --- a/src/modules/window/wrap_Window.cpp +++ b/src/modules/window/wrap_Window.cpp @@ -275,7 +275,7 @@ int w_getIcon(lua_State *L) if (i) { i->retain(); - luax_newtype(L, "ImageData", IMAGE_IMAGE_DATA_T, (void*) i); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); } else lua_pushnil(L);