Jam
Jam
在C02\dummylua-2-2\vm\luagc.c中 propagatemark函数有个问题 对于LUA_TTHREAD类型,会先从灰变黑,然后又变灰,从gray链表删除,加到grayagain链表中 gc进行到atomic阶段,g->gray = g->grayagain; g->grayagain = NULL; 然后再次调用 propagatemark,执行完之后LUA_TTHREAD类型还是灰色的 不参与gc就算了,因为本来也不需要gc掉。但是因为是灰色,下一次debt到达阈值的时候,第一步就是把mainthread加入gray。调用了markobject宏,这个宏会判断GCObject是不是白色,如果是白色才会reallymarkobject。但是灰色并不是白色,所以说mainthread永远也不会加入gray链表。 那么gray链表就永远是空的,所以不会有任何对象被标记为黑色,所有luaC_newobj出来的东西都会被gc掉 其实第一章的代码也是有问题的 l_alloc这个函数,如果仅仅只是用realloc(ptr, nsize);分配空间,其中的所有字段可能都是随机数 在luado.c中,调用函数reset_unuse_stack可能会有问题 判断if (top->value_.p)时,由于top->value_.p可能并不是0,会错误的释放空间。 但是!!这里其实不应该释放!因为这个函数的空间并不是代码new出来的,没有空间需要释放 需要释放的空间应该只有: 除了base_ci以外的CallInfo + 释放栈空间 + 全局状态(LG)