2

JavaScript で移植可能なフレームワークを作成しました。さまざまな JavaScript インタープリター シェル環境でいくつかのパフォーマンス テストを実行したいと考えています。これを実現するには、コマンド ライン引数 (argv) をスクリプト コンテキストに渡すことができる必要があります。Rhino および Spidermonkey インタープリターはデフォルトで既にこれを行っており、スクリプト ファイルの後にすべての引数を、グローバル オブジェクトの「arguments」識別子にバインドされた配列として公開しています。当初は、同じ機能を v8 のサンプル シェルと JavaScriptCore jsc シェルに導入するつもりでしたが、これにはさらに多くの労力が必要であることにすぐに気付きました。テストを実行します。したがって、argv の最後の char* 要素を v8:: に変換して、これを v8 で機能させることができました。

残念ながら、私は JavaScriptCore で同じことを達成するのにはるかに苦労しています。JavaScriptCore C++ API に関する多くのドキュメントを見つけることができませんでした。また、JavaScriptCore jsc インタープリター ( Source/JavaScriptCore/jsc.cpp 内) のコードは、v8 サンプル シェルのコードよりも理解しにくいものです。

具体的には、次のタスクを説明するのに役立つリソース (ドキュメント、チュートリアル、サンプル コードなど) をいただければ幸いです。

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

誰でも提供できるガイダンスをいただければ幸いです。

4

1 に答える 1

1

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

注::スタブ化されたオブジェクトが適切に作成されていることを前提としています。

于 2011-08-27T08:20:43.903 に答える