ljx

FORK: LuaJIT with native 5.2 and 5.3 support
git clone https://git.neptards.moe/neptards/ljx.git
Log | Files | Refs | README

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