2013-07-09 16 views
6

これは不可能だと思います。しかしそれにもかかわらず:メソッドが関数呼び出しの一部として呼び出された場合、メソッド呼び出しの内部を知ることは可能ですか?関数の引数が関数呼び出しの一部であるかどうか調べる

例(と私の実際の関数呼び出し):

  • 引数は任意の順序で評価されている(順序は 指定されていません。

    HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease]; 
    [sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil]; 
    

    はここからで起こっ二つのことがありますC標準でコンパイラと の設定を変更します)

  • これはすべてのプログラマには明らかですが、内部の 関数は次のようになります。

は、今私は、このメソッドの呼び出しの内側たとえば知りたい前に、それは、関数の引数の一部として呼び出されたことを... ...

[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"] 

を評価しました。

可能ですか?黒魔術?

私が間違っていると言う前に、私は自分のコードを修正する必要があります。私は、そのようなことを知ることができるまれなケースの1つを持っていると主張します。私はクエリビルダーを書いています。これはネストされた条件の使用を大幅に緩和します。それ以外の場合は、括弧を実装するために、いくつかの愚かなnestedAndBegin以降のNestedAndEndを実行する必要があります。この場合、私のクエリービルダーはツリーベースであり、これをやりたがりません(文字列ジャグリングクエリービルダーとは異なり、論理式のノードを配置する必要があります)。

更新

だから、これは当然不可能です。これらの問題を回避する方法を知りたい人は、関数呼び出しをすべて延期するようにしたので、クエリビルダの関数呼び出しによって、関数引数を持つメソッド呼び出しオブジェクトが呼び出しリストに追加されます。その時点ではメソッドコードは実行されません。 各呼び出しオブジェクトはauto-incシーケンスIDを持っているので、関数が評価されたときを知っています。今、nestedAnd関数(私の質問があったような関数)で、格納されている呼び出しオブジェクトのシーケンスIDが関数呼び出しの引数インデックスに対応するかどうかを確認します。そうでない場合、これはそれらを並べ替える正しい時です。

構文チェックとクエリ構築フェーズは、ユーザーが実際にquery()メソッド(または式ツリーを取得するast()を呼び出すまで延期されます。

答えて

3

いいえ、そうする(実際的な)方法はありません。

理論的には、バイナリからデバッグシンボルを読み取り、リンクレジスタを検査し、その情報を使用してコールサイトを把握し、他の場所からソースコードをロードしたり、マッピングを見つけ出し、ソースコードを解析し、あなたが記述しているように呼び出されていることを確かめます。

+0

私はこれが正しい答えだと考えていますが、誰かが実現可能な回避策を知っている可能性があります。私は別の方法では、トランザクションログを追加して、内部関数の最後の変更を元に戻し、外部関数が呼び出された時点でそれらを正しい順序で再適用するでしょう。しかし、残念なことに、これはクエリ構築の検証のいくつかの可能性を破ることを意味します。 – benjist

+0

セレクタと引数も渡すことができます。 –

+0

ha、それは多分それです。ツリーを直接構築する代わりに、すべての(コピー)引数とセレクタを収集できます。クエリ文字列が要求されたときに正しい順序で適用します(後でシンタックスチェックを含む) – benjist

関連する問題