2013-05-18 66 views
1

我在我的一個Objective-C項目中使用了JavaScriptCore,並且我想隨時知道什麼是當前文件&當陷入JS回調。沒有記錄的API和標題

沒有辦法與public headers做到這一點,所以我把一看sources,似乎可以通過使用一些C++代碼訪問文件&線。

// ctx is a JSContextRef, that's the only type I have an access to 
JSC::JSValue jsCtx = toJS(ctx); 
CodeBlock* codeBlock = jsCtx->codeBlock(); 

// Line 
unsigned sourceOffset = codeBlock->sourceOffset(); 

// Source URL 
SourceProvider* sourceProvider = codeBlock->source(); 
const String& url = sourceProvider->url(); 

它顯然需要的JSCJSValueCodeBlock,並且SourceProvider的定義。我把所有這些放在單獨的標題中,但它確實很龐大。

  • 我應該直接包含這些頭文件嗎?
  • 如果這些文件需要其他頭文件怎麼辦?我可能會有多個頭,我不會使用。
  • 讓我們忘記內部源代碼可能會改變:我甚至想做甚麼?

回答

0

您可以從公共標題本身知道這些信息。在這裏你去:

當異常發生時,異常對象包含以下鍵:

線的sourceID,sourceURL,名稱,消息

您可以訪問值,這些鍵在其中找到文件(sourceURL)以及發生異常的行號(行)。

例子:

JSObjectRef exceptionObj = JSValueToObject(context, exception, NULL); 

//Convert the exceptionObj into dictionary (I leave the implementation of this to you..) 
NSDictionary *exceptionDict = [self convertJSObjectToDictionary:exceptionObj]; 

NSString *lineNumber = [exceptionDict objectForKey:@"line"]; 
NSString *fileName = [exceptionDict objectForKey:@"sourceURL"]; 

NSLog(@"Exception has occurred in file:%@ at line number:%@", fileName, lineNumber); 

希望這有助於!

〜Sunil Phani Manne

+0

感謝Sunil,但我想隨時獲得堆棧跟蹤,不僅在發生異常之後。所以當一個本地C函數被綁定到JS上下文中並且調用了這個函數時,我想知道什麼時候調用了它。 –

+0

我明白你的意思了。 –