aboutsummaryrefslogtreecommitdiff
path: root/c-api
diff options
context:
space:
mode:
authorPhilipp Janda <siffiejoe@gmx.net>2018-07-27 07:35:24 +0200
committerPhilipp Janda <siffiejoe@gmx.net>2018-07-27 07:35:24 +0200
commitc325be435c64be57cf2210fa6936af0d425d0ce0 (patch)
tree0a6398c67346ff8df989994e7e29d4110c515889 /c-api
parent3c76f8f5edf602b023672f8d8f317b0eea2f1195 (diff)
downloadlua-compat-5.3-c325be435c64be57cf2210fa6936af0d425d0ce0.tar.gz
lua-compat-5.3-c325be435c64be57cf2210fa6936af0d425d0ce0.tar.bz2
lua-compat-5.3-c325be435c64be57cf2210fa6936af0d425d0ce0.zip
Add an implementation of `lua_getextraspace()`.
Diffstat (limited to 'c-api')
-rw-r--r--c-api/compat-5.3.c57
-rw-r--r--c-api/compat-5.3.h4
2 files changed, 60 insertions, 1 deletions
diff --git a/c-api/compat-5.3.c b/c-api/compat-5.3.c
index bf81673..590e3c8 100644
--- a/c-api/compat-5.3.c
+++ b/c-api/compat-5.3.c
@@ -720,6 +720,63 @@ COMPAT53_API int lua_geti (lua_State *L, int index, lua_Integer i) {
720} 720}
721 721
722 722
723#ifndef LUA_EXTRASPACE
724#define LUA_EXTRASPACE (sizeof(void*))
725#endif
726
727COMPAT53_API void *lua_getextraspace (lua_State *L) {
728 int is_main = 0;
729 void *ptr = NULL;
730 luaL_checkstack(L, 4, "not enough stack slots available");
731 lua_pushliteral(L, "__compat53_extraspace");
732 lua_pushvalue(L, -1);
733 lua_rawget(L, LUA_REGISTRYINDEX);
734 if (!lua_istable(L, -1)) {
735 lua_pop(L, 1);
736 lua_createtable(L, 0, 2);
737 lua_createtable(L, 0, 1);
738 lua_pushliteral(L, "k");
739 lua_setfield(L, -2, "__mode");
740 lua_setmetatable(L, -2);
741 lua_pushvalue(L, -2);
742 lua_pushvalue(L, -2);
743 lua_rawset(L, LUA_REGISTRYINDEX);
744 }
745 lua_replace(L, -2);
746 is_main = lua_pushthread(L);
747 lua_rawget(L, -2);
748 ptr = lua_touserdata(L, -1);
749 if (!ptr) {
750 lua_pop(L, 1);
751 ptr = lua_newuserdata(L, LUA_EXTRASPACE);
752 if (is_main) {
753 memset(ptr, '\0', LUA_EXTRASPACE);
754 lua_pushthread(L);
755 lua_pushvalue(L, -2);
756 lua_rawset(L, -4);
757 lua_pushboolean(L, 1);
758 lua_pushvalue(L, -2);
759 lua_rawset(L, -4);
760 } else {
761 void* mptr = NULL;
762 lua_pushboolean(L, 1);
763 lua_rawget(L, -3);
764 mptr = lua_touserdata(L, -1);
765 if (mptr)
766 memcpy(ptr, mptr, LUA_EXTRASPACE);
767 else
768 memset(ptr, '\0', LUA_EXTRASPACE);
769 lua_pop(L, 1);
770 lua_pushthread(L);
771 lua_pushvalue(L, -2);
772 lua_rawset(L, -4);
773 }
774 }
775 lua_pop(L, 2);
776 return ptr;
777}
778
779
723COMPAT53_API int lua_isinteger (lua_State *L, int index) { 780COMPAT53_API int lua_isinteger (lua_State *L, int index) {
724 if (lua_type(L, index) == LUA_TNUMBER) { 781 if (lua_type(L, index) == LUA_TNUMBER) {
725 lua_Number n = lua_tonumber(L, index); 782 lua_Number n = lua_tonumber(L, index);
diff --git a/c-api/compat-5.3.h b/c-api/compat-5.3.h
index 8e10893..082a6a0 100644
--- a/c-api/compat-5.3.h
+++ b/c-api/compat-5.3.h
@@ -293,6 +293,9 @@ typedef int (*lua_KFunction)(lua_State *L, int status, lua_KContext ctx);
293#define lua_geti COMPAT53_CONCAT(COMPAT53_PREFIX, _geti) 293#define lua_geti COMPAT53_CONCAT(COMPAT53_PREFIX, _geti)
294COMPAT53_API int lua_geti (lua_State *L, int index, lua_Integer i); 294COMPAT53_API int lua_geti (lua_State *L, int index, lua_Integer i);
295 295
296#define lua_getextraspace COMPAT53_CONCAT(COMPAT53_PREFIX, _getextraspace)
297COMPAT53_API void *lua_getextraspace (lua_State *L);
298
296#define lua_isinteger COMPAT53_CONCAT(COMPAT53_PREFIX, _isinteger) 299#define lua_isinteger COMPAT53_CONCAT(COMPAT53_PREFIX, _isinteger)
297COMPAT53_API int lua_isinteger (lua_State *L, int index); 300COMPAT53_API int lua_isinteger (lua_State *L, int index);
298 301
@@ -339,7 +342,6 @@ COMPAT53_API void luaL_requiref (lua_State *L, const char *modname,
339 342
340/* XXX not implemented: 343/* XXX not implemented:
341 * lua_isyieldable 344 * lua_isyieldable
342 * lua_getextraspace
343 * lua_arith (new operators) 345 * lua_arith (new operators)
344 * lua_pushfstring (new formats) 346 * lua_pushfstring (new formats)
345 */ 347 */