diff options
Diffstat (limited to 'src/lua51/lstring.c')
| -rw-r--r-- | src/lua51/lstring.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/lua51/lstring.c b/src/lua51/lstring.c index ec1fcdb..73d34c4 100644 --- a/src/lua51/lstring.c +++ b/src/lua51/lstring.c @@ -110,6 +110,8 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { Udata *u; if (s > MAX_SIZET - sizeof(Udata)) luaM_toobig(L); + + // 创建并赋值 u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata))); //c udata和普通对象在GC上的区别在于不调用luaC_link,因为不会加在 //c G(L)->rootgc链上,而是加在G(L)->mainthread后面 @@ -119,12 +121,14 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { u->uv.len = s; u->uv.metatable = NULL; u->uv.env = e; - /* chain it on udata list (after main thread) */ - u->uv.next = G(L)->mainthread->next; + // 可见所有userdata都跟在mainthread之后第一个 // 这样是为了方便,是一个hack // 由于userdata可能会定义了__gc,所以统一处理 + /* chain it on udata list (after main thread) */ + u->uv.next = G(L)->mainthread->next; G(L)->mainthread->next = obj2gco(u); + return u; } |
