在JavaScriptCore的全局对象上公开一个字符串
Exposing a string on the global object in JavaScriptCore
我已经用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));
注意::假设您正确创建了存根对象。