aboutsummaryrefslogtreecommitdiffstats
path: root/c-api/compat-5.3.c
diff options
context:
space:
mode:
authorLibravatarLibravatar daurnimator <quae@daurnimator.com> 2020-07-09 22:56:47 +1000
committerLibravatarLibravatar daurnimator <quae@daurnimator.com> 2020-07-09 22:56:47 +1000
commitde60088d19ff006b4feceb780e97a15611fe2905 (patch)
treef33c3c0e1ff38f18b539f5435aef4582473e7f77 /c-api/compat-5.3.c
parent942e9fb5c80368fe93ca195bc14272b2d4cd2881 (diff)
downloadluaossl-de60088d19ff006b4feceb780e97a15611fe2905.tar.gz
luaossl-de60088d19ff006b4feceb780e97a15611fe2905.tar.bz2
luaossl-de60088d19ff006b4feceb780e97a15611fe2905.zip
Squashed 'vendor/compat53/' changes from daebe77..7b783fb
7b783fb Fix repository name in rockspec 7e2b0b5 Add bit32 library 931652a Make it usable on Lua 5.4 a1735f6 Update backports to Lua 5.3.5 versions 01a43c0 Fix feature detection for strerror_r 71293f7 Fix structure initialization in compat53 lua_load 73fb49f Make test C module compile as C++ again. d7f9021 Link to `lua_getextraspace` quirks in README.md. 45ae6fe Improve `lua_getextraspace` tests. c325be4 Add an implementation of `lua_getextraspace()`. 3c76f8f Add rockspec for v0.7 release. git-subtree-dir: vendor/compat53 git-subtree-split: 7b783fb8efac60de8be91522d5731a9716e83d56
Diffstat (limited to 'c-api/compat-5.3.c')
-rw-r--r--c-api/compat-5.3.c66
1 files changed, 63 insertions, 3 deletions
diff --git a/c-api/compat-5.3.c b/c-api/compat-5.3.c
index bf81673..42b0a4b 100644
--- a/c-api/compat-5.3.c
+++ b/c-api/compat-5.3.c
@@ -28,8 +28,9 @@
#endif /* VC++ _fsopen for share-allowed file read */
#ifndef COMPAT53_HAVE_STRERROR_R
-# if defined(__GLIBC__) || defined(_POSIX_VERSION) || defined(__APPLE__) || \
- (!defined (__MINGW32__) && defined(__GNUC__) && (__GNUC__ < 6))
+# if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \
+ (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600) || \
+ defined(__APPLE__)
# define COMPAT53_HAVE_STRERROR_R 1
# else /* none of the defines matched: define to 0 */
# define COMPAT53_HAVE_STRERROR_R 0
@@ -448,7 +449,9 @@ static const char *compat53_reader (lua_State *L, void *ud, size_t *size) {
COMPAT53_API int lua_load (lua_State *L, lua_Reader reader, void *data, const char *source, const char *mode) {
int status = LUA_OK;
- compat53_reader_data compat53_data = { reader, data, 1, 0, 0 };
+ compat53_reader_data compat53_data = { 0, NULL, 1, 0, 0 };
+ compat53_data.reader = reader;
+ compat53_data.ud = data;
compat53_data.peeked_data = reader(L, data, &(compat53_data.peeked_data_size));
if (compat53_data.peeked_data && compat53_data.peeked_data_size &&
compat53_data.peeked_data[0] == LUA_SIGNATURE[0]) /* binary file? */
@@ -720,6 +723,63 @@ COMPAT53_API int lua_geti (lua_State *L, int index, lua_Integer i) {
}
+#ifndef LUA_EXTRASPACE
+#define LUA_EXTRASPACE (sizeof(void*))
+#endif
+
+COMPAT53_API void *lua_getextraspace (lua_State *L) {
+ int is_main = 0;
+ void *ptr = NULL;
+ luaL_checkstack(L, 4, "not enough stack slots available");
+ lua_pushliteral(L, "__compat53_extraspace");
+ lua_pushvalue(L, -1);
+ lua_rawget(L, LUA_REGISTRYINDEX);
+ if (!lua_istable(L, -1)) {
+ lua_pop(L, 1);
+ lua_createtable(L, 0, 2);
+ lua_createtable(L, 0, 1);
+ lua_pushliteral(L, "k");
+ lua_setfield(L, -2, "__mode");
+ lua_setmetatable(L, -2);
+ lua_pushvalue(L, -2);
+ lua_pushvalue(L, -2);
+ lua_rawset(L, LUA_REGISTRYINDEX);
+ }
+ lua_replace(L, -2);
+ is_main = lua_pushthread(L);
+ lua_rawget(L, -2);
+ ptr = lua_touserdata(L, -1);
+ if (!ptr) {
+ lua_pop(L, 1);
+ ptr = lua_newuserdata(L, LUA_EXTRASPACE);
+ if (is_main) {
+ memset(ptr, '\0', LUA_EXTRASPACE);
+ lua_pushthread(L);
+ lua_pushvalue(L, -2);
+ lua_rawset(L, -4);
+ lua_pushboolean(L, 1);
+ lua_pushvalue(L, -2);
+ lua_rawset(L, -4);
+ } else {
+ void* mptr = NULL;
+ lua_pushboolean(L, 1);
+ lua_rawget(L, -3);
+ mptr = lua_touserdata(L, -1);
+ if (mptr)
+ memcpy(ptr, mptr, LUA_EXTRASPACE);
+ else
+ memset(ptr, '\0', LUA_EXTRASPACE);
+ lua_pop(L, 1);
+ lua_pushthread(L);
+ lua_pushvalue(L, -2);
+ lua_rawset(L, -4);
+ }
+ }
+ lua_pop(L, 2);
+ return ptr;
+}
+
+
COMPAT53_API int lua_isinteger (lua_State *L, int index) {
if (lua_type(L, index) == LUA_TNUMBER) {
lua_Number n = lua_tonumber(L, index);