2013-07-09 3 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"] 

.. что она была вызвана как часть аргумента функции.

Возможно? Черная магия?

Прежде чем вы придете и скажете, что я делаю это неправильно, и я должен исправить свой код: я утверждаю, что у меня есть один из редких случаев, когда имеет смысл знать такое. Я пишу построитель запросов, и это значительно облегчит использование вложенных условий. В противном случае мне нужно было бы сделать глупый вложенныйAndBegin и позже nestedAndEnd, чтобы реализовать скобки и т. Д. В этом случае было бы неудобно, мой построитель запросов основан на деревьях, и я бы не хотел этого делать (в отличие от строковых сборщиков запросов, которые потребуются, нужно поместить узел для логического выражения).

Update

Так что это не удивительно, не возможно. Для тех, кому интересно, как я работал над этим для своей конкретной проблемы: я сделал так, чтобы все вызовы функций откладывались, поэтому вызовы функции моего построителя запросов помещают объект вызова метода с аргументами функции в список вызовов , В то время он не выполняет какой-либо код метода. Каждый объект вызова имеет идентификатор последовательности с автоматическим включением, поэтому я знаю, когда функция была оценена. Теперь в функциях nestedAnd и т. Д. (Так что те функции, о которых мой вопрос был), я проверяю, соответствует ли идентификатор последовательности хранящихся объектов вызова индексу аргумента вызова функции. Если нет, это подходящее время для их изменения.

Фаза проверки синтаксиса и построения запроса затем откладывается до тех пор, пока пользователь фактически не вызовет метод query() (или ast(), чтобы получить дерево выражений).

ответ

3

Нет, нет (практического) способа сделать это.

Теоретически вы можете добавить код в свой метод, который считывает отладочные символы из вашего двоичного файла, проверяет регистр ссылок и затем использует эту информацию для определения сайта вызова, загружает исходный код из другого места, и вычисляет отображение, анализирует исходный код и выясняет, что он вызывается, как вы описываете.

+0

Я считаю, что это правильный ответ, но, возможно, кто-то знает о возможном обходном пути. В противном случае я мог бы добавить какой-то журнал транзакций, который бы изменил бы последние изменения на внутренние функции и повторно применил их в правильном порядке в момент вызова внешней функции.Но, к сожалению, это означало бы разрыв с некоторыми возможностями проверки правильности построения запроса. – benjist

+0

Вы также можете передавать селектора и аргументы. –

+0

га, может быть, все. Я мог бы, вместо построения дерева напрямую, собрать все (копии) аргументов и селекторов. и применять их в правильном порядке, когда запрашивается строка запроса (в том числе проверка синтаксиса, хотя в более поздней точке) – benjist

Смежные вопросы