2011-03-22 96 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