2011-03-22 101 views
3

这可能听起来像一个愚蠢的问题,但我在这个特定问题的任何地方都看不到。基本上:逐行执行Lua脚本时检测代码块

我想逐行执行一个Lua脚本,主要是为了能够随时随地暂停/恢复执行。我所做的很简单:用luaL_loadbuffer()加载一个块,然后发出一个lua_pcall()。

事情是...如何正确检测Lua块以便以原子方式执行它们?

例如,假设脚本中有一个函数 - 通过使用上述方法逐行执行文件,我似乎无法正确识别该函数,因此其内容是加载并逐一调用。

我可以想象,一种解决方案是手动处理一个栈,在那里我推动控制关键字,我可以在脚本中识别(“函数”,“如果”,“做”等)及其相应的“结束”子句如果我找到嵌套块。一旦我推动最后的“结束”,我打电话给整个街区,但这听起来很糟糕。当然,必须有更好的方式来做到这一点。

希望它有道理,谢谢!

回答

1

请看Lua coroutines来实现脚本游戏实体的功能。这个想法是yield在你提到的sleep()和waitforevent()例程中的协程,然后在resume之后(例如在发生超时或事件之后)。

+0

谢谢,亚历山大也提到了这一点。那么我会研究一下协程。 – 2011-03-23 15:12:33

+0

对不起,回复迟了。协程是我所需要的,它的工作非常好!再次感谢! – 2011-03-31 20:20:46

+0

@Augustín:接受Judge的回答:-) – 2011-03-31 22:44:11

1

使用lua_sethook()

请注意,您可能确实想要测试您所需的确切的挂接调用粒度。我建议执行字节码指令块。一条很长的行可能包含许多指令。

+0

对,感谢您的观察和快速回复!我一定会考虑lua_sethook()。 – 2011-03-22 23:27:34

+1

请注意,如果您要构建一个完整的沙盒,这是不够的,因为一些无辜的标准库函数(如'string.gsub')可以被恶意使用来浪费CPU时间。 – 2011-03-22 23:43:45

+0

不是,我并不关心安全。这是一个游戏脚本,目的是允许使用诸如sleep()和waitforevent()之类的函数。也就是说,游戏脚本的程序员必须有能力随时保持一切。 – 2011-03-23 01:12:01