summaryrefslogtreecommitdiff
path: root/src/lua51/lstring.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua51/lstring.c')
-rw-r--r--src/lua51/lstring.c8
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;
}