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

..它被作爲函數調用的參數的一部分。

可能嗎?黑魔法?

在你來說我做錯了,我應該修正我的代碼:我聲稱我有一個罕見的情況下,知道這樣的事情是有道理的。我在寫一個查詢生成器,這將大大緩解嵌套條件的使用。否則,我不得不做一些愚蠢的nestedAndBegin和後來的nestedAndEnd以實現括號,依此類推。這在這種情況下會很尷尬,我的查詢生成器是基於樹的,我不想這樣做(與字符串雜亂查詢構建器不同,所有需要的都是將邏輯表達式的節點放在適當位置)。

更新

因此,這是勿庸置疑不可能的。對於那些感興趣的人,我是如何解決這個問題的:我做到了,所有對函數的調用都被延遲了,所以對我的查詢生成器的函數的調用將帶有函數參數的方法調用對象放到調用列表中。它當時不執行任何方法代碼。 每個調用對象都有一個auto-inc序列ID,所以我知道函數何時被評估。現在在嵌套和等功能(所以這些功能,我的問題是關於)我檢查存儲的調用對象的序列ID是否對應於函數調用的參數索引。如果不是,這是對他們進行重新排序的正確時間。

然後延遲語法檢查和查詢構建階段,直到用戶實際調用query()方法(或ast()來獲取表達式樹)。

回答

3

不,沒有(實際)的方法來做到這一點。

理論上,您可以在方法中添加一些代碼,從您的二進制文件讀取調試符號,檢查鏈接寄存器,然後使用該信息找出調用站點,從其他地方加載源代碼,並計算出映射,解析源代碼並根據您的描述計算出它的調用。

+0

我相信這是正確的答案,但也許有人知道一個可行的解決方法。否則我可能會添加某種事務日誌,這會在內部函數中反轉上次更改,並在外部函數被調用時以正確順序重新應用它們。但不幸的是,這將意味着打破查詢構建驗證的一些可能性。 – benjist

+0

您也可以傳遞選擇器和參數。 –

+0

公頃,也許就是這樣。我可以不直接構建樹,而是收集所有(副本)的參數和選擇器。並在查詢字符串被請求時以正確的順序應用它們(包括語法檢查,儘管在稍後的點) – benjist

相關問題