3 ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
14 GCudata
*lj_udata_new(lua_State
*L
, MSize sz
, GCtab
*env
)
16 GCudata
*ud
= lj_mem_newt(L
, sizeof(GCudata
) + sz
, GCudata
);
17 global_State
*g
= G(L
);
18 newwhite(g
, ud
); /* Not finalized. */
20 ud
->udtype
= UDTYPE_USERDATA
;
22 /* NOBARRIER: The GCudata is new (marked white). */
23 setgcrefnull(ud
->metatable
);
24 setgcref(ud
->env
, obj2gco(env
));
25 /* Chain to userdata list (after main thread). */
26 setgcrefr(ud
->nextgc
, mainthread(g
)->nextgc
);
27 setgcref(mainthread(g
)->nextgc
, obj2gco(ud
));
31 void LJ_FASTCALL
lj_udata_free(global_State
*g
, GCudata
*ud
)
33 lj_mem_free(g
, ud
, sizeudata(ud
));
37 void *lj_lightud_intern(lua_State
*L
, void *p
)
39 global_State
*g
= G(L
);
40 uint64_t u
= (uint64_t)p
;
41 uint32_t up
= lightudup(u
);
42 uint32_t *segmap
= mref(g
->gc
.lightudseg
, uint32_t);
43 MSize segnum
= g
->gc
.lightudnum
;
46 for (seg
= 0; seg
<= segnum
; seg
++)
47 if (segmap
[seg
] == up
) /* Fast path. */
48 return (void *)(((uint64_t)seg
<< LJ_LIGHTUD_BITS_LO
) | lightudlo(u
));
50 /* Leave last segment unused to avoid clash with ITERN key. */
51 if (segnum
>= (1 << LJ_LIGHTUD_BITS_SEG
)-1) lj_err_msg(L
, LJ_ERR_BADLU
);
53 if (!((segnum
-1) & segnum
) && segnum
!= 1) {
54 lj_mem_reallocvec(L
, segmap
, segnum
, segnum
? 2*segnum
: 2u, uint32_t);
55 setmref(g
->gc
.lightudseg
, segmap
);
57 g
->gc
.lightudnum
= segnum
;
59 return (void *)(((uint64_t)segnum
<< LJ_LIGHTUD_BITS_LO
) | lightudlo(u
));