1

我在我的一个 Objective-C 项目中使用 JavaScriptCore,我想随时知道当陷入 JS 回调时当前文件和行是什么。

没有办法用public headers来做,所以我看了一下源代码,似乎可以通过使用一些 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。我将所有这些都放在单独的标题中,但它确实很大。

  • 我应该直接包含这些标题吗?
  • 如果这些文件需要其他头文件怎么办?我可能会以拥有多个我不会使用的标题结束。
  • 让我们忘记内部源代码可能会改变:我想要做的甚至可能吗?
4

1 回答 1

0

您可以从公共标头本身了解此信息。干得好:

当异常发生时,异常对象包含以下键:

行、sourceId、sourceURL、名称、消息

您可以访问这些键的值以查找发生异常的文件 (sourceURL) 和行号 (line)。

例子:

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

于 2013-08-27T12:27:14.647 回答