Предоставление строки для глобального объекта в JavaScriptCore - PullRequest
2 голосов
/ 10 августа 2011

Я написал переносимый фреймворк на JavaScript, и я хотел бы запустить несколько тестов производительности в различных средах интерпретатора JavaScript.Для этого мне нужно передать аргументы командной строки (argv) в контекст скрипта.Интерпретаторы Rhino и Spidermonkey уже делают это по умолчанию, выставляя все аргументы после файла скрипта в виде массива, привязанного к идентификатору «arguments» в глобальном объекте.Первоначально я намеревался перенести ту же функциональность в образец оболочки v8, а также в оболочку jsc JavaScriptCore, но вскоре я понял, что это потребует гораздо больше усилий, и мне действительно нужен только последний аргумент командной строки, чтобызапустить мои тесты.Итак, я смог заставить это работать в v8, преобразовав последний элемент char * в argv в v8 :: String и связав его с идентификатором «lastArg» в глобальном объекте.

К сожалению, у меня гораздо больше проблем с выполнением того же с помощью JavaScriptCore.Я не смог найти много документации по JavaScriptCore C ++ API, и код в интерпретаторе jsc JavaScriptCore (в Source / JavaScriptCore / jsc.cpp ) мне сложнее понять, чем кодв образце оболочки v8.

В частности, я был бы признателен за любые ресурсы (документация, учебные пособия, пример кода и т. Д.), Которые могли бы помочь проиллюстрировать следующие задачи:

  • создание нового экземпляра JavaScriptCore JSString изchar *
  • связывание экземпляра JSString с идентификатором в экземпляре глобального объекта GlobalObject.

Я намерен просто исправить функцию jscmain из jsc.cpp:

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

Я был бы очень признателен за любые рекомендации, которые может предложить каждый.

1 Ответ

1 голос
/ 27 августа 2011

Чтобы создать 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));

Примечание :: Предполагается, что вы правильно создаете объекты-заглушки.

...