Git Product home page Git Product logo

luareload's People

Contributors

bkacjios avatar cloudwu avatar t0350 avatar xionglikarl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

luareload's Issues

吴老师能简单介绍一下这个 luareload 工具吗?

看代码 luareload 大致明白在reload的时候做了这些事情:

  1. 构建了一个沙盒, 将运行reload时已经加载的模块保护起来
  2. 在沙盒中调用lua加载器来加载update模块
  3. 将新加载的模块与老模块进行合并和替换

但还是有些不明白(毕竟代码里面注释也写的少)其所以然,
吴老师能讲一下这个reload工具去做lua reload 的一些思路吗?

万分感谢

[BUG FIX]如果更新的文件中新定义了一个function,使用了global变量,会更新错误

1.不能正确热更的代码:

local a = 10
local data = {
    a = a,
    c = c,
}

function data.globalTest()
   return c
end

return data

如果原有模块没有定义globalTest函数,因为globalTest在沙盒中被require,其env指向的是沙盒内的global,会有错误。

原始代码如下:
489行
https://github.com/cloudwu/luareload/blob/master/reload.lua#:~:text=end-,for%20_%2C%20item%20in%20ipairs(data.objects)%20do,end,-else

2.修改方案:
假如有原有函数,可以设置原有函数的env;但是因为是新增函数,按照一般理解来看,这里的env应该可以理解成_G,根据项目约束,我们可以增加代码如下:

if type(v) == "function" then
    debug.setfenv(v, _G)
end

reload思路清晰,根据理解发现了几处问题

  1. 实现中有数个 error 调用参数写错(145 行、162 行、176 行)
  2. 对于其他 thread 从 level 为 2 的栈帧开始更新会导致 level 为 0 和 1 的栈帧没有更新到(668 行)
  3. solve_global 的时候没有考虑到模块名可能包含"."的情况(524 行)
  4. solve_global 函数中第 527 行和第 532 行的 break 会导致直接中断对 global_dummy 的遍历,从逻辑上来说应该是改成 goto
  5. reload 一个模块,其依赖的模块也会被 reload,导致所有依赖的模块都必须遵循 reload 的限制(123 行设置的 require 函数)

新增函数upvalue无法关联问题

例如新增
function mod.foo4()
print(a)
end
a无法和旧的a做关联。

经过排查觉得 function match_objects(objects, old_module, map, globals)内的 map[obj] = old_one有误。
我现在是改为 map[obj] = old_one or map[obj] or false,经过测试能解决这个问题。

mymod_update.lua 中的 mod.getinfo 没有被替换

在 reload 重新加载 mymod 后添加下面打印报错了

print("===mymod.getinfo", mymod.getinfo)

下面是报错

lua: ./reload.lua:41: attempt to index a nil value (upvalue 'dummy_module_cache')
stack traceback:
        ./reload.lua:41: in function <./reload.lua:41>
        [C]: in function 'tostring'
        [C]: in function 'print'
        test.lua:34: in main chunk
        [C]: in ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.