Lua を使用して関数の本体にアクセスする
-
21-08-2019 - |
質問
ここで基本に戻りますが、Lua では次のようにテーブルを定義できます。
myTable = {}
myTable [1] = 12
テーブル参照自体を出力すると、それへのポインタが返されます。その要素にアクセスするには、インデックスを指定する必要があります (つまり、配列とまったく同じように)
print(myTable ) --prints pointer
print(myTable[1]) --prints 12
さて、関数は別の話になります。次のように関数を定義して出力できます。
myFunc = function() local x = 14 end --Defined function
print(myFunc) --Printed pointer to function
定義された関数の本体にアクセスする方法はありますか。小さなコードビジュアライザをまとめようとしていますが、特定の関数に特別な関数/変数を「シード」して、ビジュアライザ自体をコードに「フック」できるようにしたいと考えています。変数または文字列。
解決
平野Luaの中で与えられた関数の本体のソースコードへのアクセスを取得する方法はありません。ソースコードはバイトコードにコンパイルした後に捨てられます。
注BTWその機能がloadStringは状設備と、実行時に定義されてもよい。
部分的なソリューションが可能です - あなたが実際に達成したいのかに応じて、
。あなたはデバッグライブラリからソースコードの位置を得ることができます - デバッグライブラリが有効になっていると、デバッグシンボルはバイトコードから削除されていない場合。その後、あなたはそこから実際のソースファイルと抽出コードをロードすることがあります。
あなたが必要なメタデータと手動に興味を持っている機能を飾ることがあります。 Luaの中で機能が有効なテーブルのキーであることに注意してください、あなたは機能・ツー・メタデータテーブルを作成することができます。あなたはそれがGCによって収集されるの機能を妨げないので、このテーブルは弱キーにしたいでしょう。
あなたはLuaのコードを分析するためのソリューションを必要とする場合は、、 Metalua のを見てみます。
他のヒント
デバッグライブラリを使用すると、あなたの唯一の賭けです。または関数が定義されたファイルの名前(機能が「loadStringは」でロードされたチャンクに定義されている場合)は、その使用すると、いずれかの文字列を取得することができます。一緒に関数定義の開始と終了行番号を持ちます。 ドキュメントを参照してください。
ここに私の現在の仕事で、それも機能の開始と終了のためにあなたに列番号を与えるように、我々はLuaのパッチを適用しているので、あなたはそれを使用して、関数のソースを取得することができます。パッチは再現するのは非常に難しいことではありませんが、私はそれをここに投稿を許可されますとは思わない: - (
デバッグライブラリで Luaの内省施設にチェックしてください。
の主な内省機能 デバッグライブラリはdebug.getinfoです 関数。その最初のパラメータであってもよいです 機能やスタックレベル。ときにあなたを debug.getinfo(fooが)いくつかのために呼び出します 関数foo、あなたが持つテーブルを取得します その関数についてのいくつかのデータ。ザ・ テーブルには、次のフィールドを持っていることがあります:
あなたが望むフィールドには、私が思うFUNCです。
これは、 環境 関数ごとに (を参照) セットフェンブ) およびグローバル (ローカルではなく) 変数を使用します。関数内で作成された変数は、関数の実行後に環境テーブルに表示されます。
env = {}
myFunc = function() x = 14 end
setfenv(myFunc, env)
myFunc()
print(myFunc) -- prints pointer
print(env.x) -- prints 14
あるいは、以下を利用することもできます。 デバッグライブラリ:
> myFunc = function() local x = 14 ; debug.debug() end
> myFunc()
> lua_debug> _, x = debug.getlocal(3, 1)
> lua_debug> print(x) -- prints 14
おそらく、ローカル変数を取得する方が便利でしょう。 フック関数 明示的にデバッグ モードに入る代わりに (つまり、debug.debug() 呼び出しの追加)
もあります。 デバッグインターフェース Lua C API で。