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

标签 javascript c++ webkit embedding javascriptcore

我已经用 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/

相关文章:

c++ - "char* string[]"等同于 C++ 中的 "char** string"吗?

css - Webkit CSS-hack 已弃用?

html - -webkit-border-image 可能的线性渐变?

javascript - 使用 RhinoMock 或 Moq 测试方法的内部结构

javascript - 防止一行 html 出现在 Google 搜索中

javascript - Map.has 与 Map.get 之间的性能差异

webkit - 重定向到 AIR 应用程序 :/scheme from remote URI in a WebKit iframe

Javascript addEventListener 两个不同元素冲突

c++ - 彩色位图文件转为黑白

c++ - 如何将 char 数组元素传递给 C++ 中的函数?