我已经用 JavaScript 编写了一个可移植框架,我想在各种 JavaScript 解释器 shell 环境下运行一些性能测试。为了实现这一点,我需要能够将命令行参数 (argv) 传递给脚本上下文。 Rhino 和 Spidermonkey 解释器已经默认执行此操作,将脚本文件后的所有参数公开为绑定(bind)到全局对象上的“arguments”标识符的数组。最初我打算为 v8 示例 shell 以及 JavaScriptCore jsc shell 带来相同的功能,但我很快意识到这需要更多的努力,而且我真的只需要最后一个命令行参数即可运行我的测试。因此,我已经能够在 v8 中实现它,将 argv 中的最后一个 char* 元素转换为 v8::String 并将其绑定(bind)到全局对象上的标识符“lastArg”。
不幸的是,我在使用 JavaScriptCore 完成同样的事情时遇到了更多的麻烦。我没能找到很多关于 JavaScriptCore C++ API 的文档,而且 JavaScriptCore jsc 解释器中的代码(在 Source/JavaScriptCore/jsc.cpp 中)对我来说比 v8 示例 shell 中的代码更难理解。
具体来说,如果有任何资源(文档、教程、示例代码等)可以帮助说明以下任务,我将不胜感激:
- 从 char* 创建一个新的 JavaScriptCore JSString 实例
- 将 JSString 实例绑定(bind)到 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));
注意:假设您正确创建 stub 对象。
关于javascript - 在 JavaScriptCore 中的全局对象上公开一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7014634/