2

我用 JavaScript 编写了一个可移植的框架,我想在各种 JavaScript 解释器 shell 环境下运行一些性能测试。为了实现这一点,我需要能够将命令行参数 (argv) 传递给脚本上下文。默认情况下,Rhino 和 Spidermonkey 解释器已经这样做了,将脚本文件之后的所有参数公开为绑定到全局对象上的“参数”标识符的数组。最初我打算为 v8 示例 shell 以及 JavaScriptCore jsc shell 带来相同的功能,但我很快意识到这需要更多的努力,而且我真的只需要最后一个命令行参数即可运行我的测试。因此,我已经能够在 v8 中使用它,将 argv 中的最后一个 char* 元素转换为 v8::

不幸的是,我在用 JavaScriptCore 完成同样的事情时遇到了更多的麻烦。我找不到太多关于 JavaScriptCore C++ API 的文档,而且 JavaScriptCore jsc 解释器(在Source/JavaScriptCore/jsc.cpp 中)中的代码比 v8 示例 shell 中的代码更难理解。

具体来说,我会感谢任何可以帮助说明以下任务的资源(文档、教程、示例代码等):

  • 从 char* 创建一个新的 JavaScriptCore JSString 实例
  • 将 JSString 实例绑定到 GlobalObject 全局对象实例上的标识符。

我打算简单地修补 jsc.cpp 的函数 jscmain:

int jscmain(int argc, char** argv, JSGlobalData* globalData)
{
    JSLock lock(SilenceAssertionsOnly);

    Options options;
    parseArguments(argc, argv, options, globalData);

    GlobalObject* globalObject = GlobalObject::create(*globalData, GlobalObject::createStructure(*globalData, jsNull()), options.arguments);

    //TODO: my patch would go here: create a new javascript string, and assign it to an identifier on globalObject instance

    bool success = runWithScripts(globalObject, options.scripts, options.dump);
    if (options.interactive && success)
        runInteractive(globalObject);

    return success ? 0 : 3;
}

我非常感谢任何人可以提供的任何指导。

4

1 回答 1

1

从 char* 创建 JSString:

JSC::JSGlobalData * globalData;

JSString * CreateJSString(const char * chars, size_t length)
{   
    const char * string = chars;
    if (0 == length)
    {
        length = strlen(chars);
    }

    if (isASCII(string, length))
    {
        JSString * jsstr = JSC::jsString(globalData, JSC::UString(string, length));
        return jsstr;
    }

    // Fall through
    return NULL;
}

添加到全局对象:

JSC::JSGlobalObject * globalObject;
JSC::JSGlobalData * globalData;
JSC::Identifier name;
JSC::JSString * str;

globalObject->putDirect(*globalData, name, JSC::JSValue(str));

注意::假设您正确创建了存根对象。

于 2011-08-27T08:20:43.903 回答