Я написал переносимый фреймворк на 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;
}
Я был бы очень признателен за любые рекомендации, которые может предложить каждый.