在JavaScriptCore的全局对象上公开一个字符串

Exposing a string on the global object in JavaScriptCore

本文关键字:字符串 一个 JavaScriptCore 全局 对象      更新时间:2023-10-16

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

不幸的是,我有更多的麻烦完成同样的事情与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;
}

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

从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));

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

相关文章: