mirror of
https://github.com/love2d/megasource.git
synced 2026-08-17 19:24:09 +02:00
Update LuaJIT to the latest 2.1.0 source (0bee44c)
This commit is contained in:
+27
-13
@@ -9,7 +9,6 @@
|
||||
|
||||
#include "lj_gc.h"
|
||||
#include "lj_err.h"
|
||||
#include "lj_str.h"
|
||||
#include "lj_tab.h"
|
||||
#include "lj_ctype.h"
|
||||
#include "lj_cconv.h"
|
||||
@@ -27,12 +26,12 @@ GCcdata *lj_cdata_newref(CTState *cts, const void *p, CTypeID id)
|
||||
}
|
||||
|
||||
/* Allocate variable-sized or specially aligned C data object. */
|
||||
GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align)
|
||||
GCcdata *lj_cdata_newv(lua_State *L, CTypeID id, CTSize sz, CTSize align)
|
||||
{
|
||||
global_State *g;
|
||||
MSize extra = sizeof(GCcdataVar) + sizeof(GCcdata) +
|
||||
(align > CT_MEMALIGN ? (1u<<align) - (1u<<CT_MEMALIGN) : 0);
|
||||
char *p = lj_mem_newt(cts->L, extra + sz, char);
|
||||
char *p = lj_mem_newt(L, extra + sz, char);
|
||||
uintptr_t adata = (uintptr_t)p + sizeof(GCcdataVar) + sizeof(GCcdata);
|
||||
uintptr_t almask = (1u << align) - 1u;
|
||||
GCcdata *cd = (GCcdata *)(((adata + almask) & ~almask) - sizeof(GCcdata));
|
||||
@@ -40,7 +39,7 @@ GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align)
|
||||
cdatav(cd)->offset = (uint16_t)((char *)cd - p);
|
||||
cdatav(cd)->extra = extra;
|
||||
cdatav(cd)->len = sz;
|
||||
g = cts->g;
|
||||
g = G(L);
|
||||
setgcrefr(cd->nextgc, g->gc.root);
|
||||
setgcref(g->gc.root, obj2gco(cd));
|
||||
newwhite(g, obj2gco(cd));
|
||||
@@ -50,6 +49,15 @@ GCcdata *lj_cdata_newv(CTState *cts, CTypeID id, CTSize sz, CTSize align)
|
||||
return cd;
|
||||
}
|
||||
|
||||
/* Allocate arbitrary C data object. */
|
||||
GCcdata *lj_cdata_newx(CTState *cts, CTypeID id, CTSize sz, CTInfo info)
|
||||
{
|
||||
if (!(info & CTF_VLA) && ctype_align(info) <= CT_MEMALIGN)
|
||||
return lj_cdata_new(cts, id, sz);
|
||||
else
|
||||
return lj_cdata_newv(cts->L, id, sz, ctype_align(info));
|
||||
}
|
||||
|
||||
/* Free a C data object. */
|
||||
void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
|
||||
{
|
||||
@@ -76,21 +84,22 @@ void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd)
|
||||
}
|
||||
}
|
||||
|
||||
TValue * LJ_FASTCALL lj_cdata_setfin(lua_State *L, GCcdata *cd)
|
||||
void lj_cdata_setfin(lua_State *L, GCcdata *cd, GCobj *obj, uint32_t it)
|
||||
{
|
||||
global_State *g = G(L);
|
||||
GCtab *t = ctype_ctsG(g)->finalizer;
|
||||
GCtab *t = ctype_ctsG(G(L))->finalizer;
|
||||
if (gcref(t->metatable)) {
|
||||
/* Add cdata to finalizer table, if still enabled. */
|
||||
TValue *tv, tmp;
|
||||
setcdataV(L, &tmp, cd);
|
||||
lj_gc_anybarriert(L, t);
|
||||
tv = lj_tab_set(L, t, &tmp);
|
||||
cd->marked |= LJ_GC_CDATA_FIN;
|
||||
return tv;
|
||||
} else {
|
||||
/* Otherwise return dummy TValue. */
|
||||
return &g->tmptv;
|
||||
if (it == LJ_TNIL) {
|
||||
setnilV(tv);
|
||||
cd->marked &= ~LJ_GC_CDATA_FIN;
|
||||
} else {
|
||||
setgcV(L, tv, obj, it);
|
||||
cd->marked |= LJ_GC_CDATA_FIN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +132,12 @@ collect_attrib:
|
||||
idx = (ptrdiff_t)intV(key);
|
||||
goto integer_key;
|
||||
} else if (tvisnum(key)) { /* Numeric key. */
|
||||
idx = LJ_64 ? (ptrdiff_t)numV(key) : (ptrdiff_t)lj_num2int(numV(key));
|
||||
#ifdef _MSC_VER
|
||||
/* Workaround for MSVC bug. */
|
||||
volatile
|
||||
#endif
|
||||
lua_Number n = numV(key);
|
||||
idx = LJ_64 ? (ptrdiff_t)n : (ptrdiff_t)lj_num2int(n);
|
||||
integer_key:
|
||||
if (ctype_ispointer(ct->info)) {
|
||||
CTSize sz = lj_ctype_size(cts, ctype_cid(ct->info)); /* Element size. */
|
||||
|
||||
Reference in New Issue
Block a user