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

在JavaScriptCore中公开全局对象上的字符串,javascript,c++,webkit,embedding,javascriptcore,Javascript,C++,Webkit,Embedding,Javascriptcore,我已经用JavaScript编写了一个可移植的框架,我想在各种JavaScript解释器外壳环境下运行一些性能测试。为了实现这一点,我需要能够将命令行参数(argv)传递到脚本上下文。Rhino和Spidermonkey解释器在默认情况下已经这样做了,将脚本文件之后的所有参数作为绑定到全局对象上“arguments”标识符的数组公开。我最初打算将相同的功能引入v8示例shell以及JavaScriptCore jsc shell,但我很快意识到这需要更多的工作,我只需要最后一个命令行参数来运行测

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

不幸的是,我在用JavaScriptCore完成同样的事情时遇到了更多的困难。在JavaCcript内核C++中,我还没有找到很多文档,而且JavaCcript内核JSC解释器(IN)中的代码比V8示例shell中的代码更难理解。p> 具体而言,我非常感谢能够帮助说明以下任务的任何资源(文档、教程、示例代码等):

  • 从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;
}

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

从字符*创建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));
添加到全局对象:

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));
注意::假设您正确创建了存根对象