質問

ここで基本に戻りますが、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 で。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top