2016-09-27 7 views
0

tclインタプリタに登録されたすべてのコマンドの前に、プロキシ関数(C/C++)を呼び出す必要があります。カジュアルなコマンドの場合は、簡単ですが、私はTcl_CmdInfoを覚えておいて、フィールドに新しいTcl_CmdInfoを設定してください。私のプロキシが呼び出されたら、私は必要なものを行い、次にobjProcを元のTcl_CmdInfoから呼び出します。それは正常に動作します。'ensemble'コマンド用C/C++プロキシの作成方法

問題はアンサンブルコマンド(info,など)がTcl_SetCommandInfoと呼び出されたときにアンサンブルが停止するという問題です。彼らはうまく動作しますが、もう '名前空間アンサンブル'で変更することはできません。何か案は?

PS。トレースはここでは解決策ではありません:数倍遅く、私はそれを受け入れることができません。

答えて

0

これを行うための公式のAPIは、トレースです。特に、は、バイトコードコンパイルを無効にするので、コマンドトラッキングはバイトコードコンパイルされたコマンドに対して正しく動作します。はい、それは遅いですが、それは正確に何が起こっているのかを正確に追跡するために得られるものです。また、NCL(非再帰的実行エンジン)実装のコマンドもあり、有用な方法ではobjProcフィールドを使用しないので、あなたがやっていることもTcl 8.6で解消されます。私たちは、Tclの将来のバージョン(ネイティブコードのコンパイルなど)のためにさらに大きな変更を見ています。物事を傍受するあなたの能力は、そこではさらに減ります。

要するに、あなたがやろうとしていることが、現在うまく機能しているものに強く反対しているように、別のアプローチを使用する必要があります。たとえば、制御するコードによって作成されたすべてのプロシージャまたはコマンドをインターセプトするだけで十分であり、オーバーヘッドが大幅に削減されます。手順を傍受する最も簡単な方法は、procコマンドを書き換えることである:

rename proc my_real_proc 
my_real_proc proc {name arguments body} { 
    set body "[list my_trace_hook $name];$body" 
    uplevel 1 [list my_real_proc $name $arguments $body] 
} 

あなたは、その後の手順は、あなたが好きな機構によりmy_trace_hookでまで何であるかについての情報を得ることができます。それはフックされた手順の内側から呼び出されます。それはすべてのTclコマンドが何をするのかを追跡することはありませんが、そのレベル追跡を加えることは常にパフォーマンスに大きな影響を与えます(I/Oコマンドだけに追加することは別です)。


なぜ、アンサンブル自体をトラッキングしていますか?その中のサブコマンドを追跡するだけです。 Tcl C APIは、コマンドが簡単にアンサンブルであるかどうかを知ることができ、他のイントロスペクションオプションも提供します。

+0

私はサブコマンドを追跡することを考慮しなかった、私はそれを試してみる、ありがとう! – Bogdan

関連する問題