let-us-build-a-lua-interpreter icon indicating copy to clipboard operation
let-us-build-a-lua-interpreter copied to clipboard

《Lua解释器构建:从虚拟机到编译器》随书源码

Results 7 let-us-build-a-lua-interpreter issues
Sort by recently updated
recently updated
newest added

dummylua-2-4工程编译后luavm.c第67、81、82行提示"switch"、"return"、"}"C2059语法错误问题,详情如下图所示: ![dummylua-2-4工程编译报错](https://github.com/Manistein/let-us-build-a-lua-interpreter/assets/107289346/3120d3c2-bc55-4828-8199-67a40db41f22)

page 35, 图2-10 demo中object5为栈里的对象,程序出栈后对象都会自动清除。 书中描述:在本例中,object5被清除,最终得到图2-13所示的结果。 由于不敢肯定,也搜索过JVM里GC的相关内容: 因为栈帧对应的方法执行完后,栈会将该方法对应的栈帧弹出栈,释放内存,因此垃圾回收不涉及栈内存. so 用栈内存中的对象进行gc举例是不是不太合理?

页20, 倒数第三段 #define LUA_TNUMFLT (LUA_NUMBER | (0

![PF_{GUFKO$H9QFE$936U($1](https://github.com/user-attachments/assets/3e52d002-48e9-4ed9-b4cc-0dcf30bdc618)

[build] Starting build [proc] Executing command: /usr/bin/cmake --build /mnt/e/LuaLearing/let-us-build-a-lua-interpreter/C02/dummylua-2-4/build --config Debug --target all -j 16 -- [build] Consolidate compiler generated dependencies of target dummylua [build] [ 6%] Linking C executable...

[main] Building folder: /mnt/e/LuaLearing/let-us-build-a-lua-interpreter/C02/dummylua-2-3/build [build] Starting build [proc] Executing command: /usr/bin/cmake --build /mnt/e/LuaLearing/let-us-build-a-lua-interpreter/C02/dummylua-2-3/build --config Debug --target dummylua -j 16 -- [build] Consolidate compiler generated dependencies of target dummylua [build] gmake[3]:...

在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)