lj_udata.c (957B)
1 /* 2 ** Userdata handling. 3 ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h 4 */ 5 6 #define lj_udata_c 7 #define LUA_CORE 8 9 #include "lj_obj.h" 10 #include "lj_gc.h" 11 #include "lj_udata.h" 12 13 GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env) 14 { 15 GCudata *ud = lj_mem_newt(L, sizeof(GCudata) + sz, GCudata); 16 global_State *g = G(L); 17 newwhite(g, ud); /* Not finalized. */ 18 ud->gct = ~LJ_TUDATA; 19 ud->udtype = UDTYPE_USERDATA; 20 ud->len = sz; 21 /* NOBARRIER: The GCudata is new (marked white). */ 22 setgcrefnull(ud->metatable); 23 if (env) { 24 setgcref(ud->env, obj2gco(env)); 25 ud->envtt = ~LJ_TTAB; 26 } else { 27 setgcrefnull(ud->env); 28 ud->envtt = ~LJ_TNIL; 29 } 30 /* Chain to userdata list (after main thread). */ 31 setgcrefr(ud->nextgc, mainthread(g)->nextgc); 32 setgcref(mainthread(g)->nextgc, obj2gco(ud)); 33 return ud; 34 } 35 36 void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud) 37 { 38 lj_mem_free(g, ud, sizeudata(ud)); 39 } 40