преобразовать javascript в код операции с помощью spidermonkey

Я новичок в паукообразных обезьянах и хочу использовать его для преобразования файла java-скрипта в последовательность байтового кода. я получаю обезьяну-паука и строю ее в режиме отладки.

я хочу использовать функцию JS_CompileScript в jsapi.h для компиляции кода javascript и анализа его для получения байт-кода, но когда я компилирую код ниже и запускаю его, я получаю ошибку времени выполнения. ошибка «Необработанное исключение по адресу 0x0f55c020 (mozjs185-1.0.dll) в файле spiderMonkeyTest.exe: 0xC0000005: место чтения с нарушением прав доступа 0x00000d4c». а я не решаю.

любой орган может помочь мне решить эту проблему или представить другие решения для получения байтового кода из кода javascript с помощью обезьяны-паука?

     // spiderMonkeyTest.cpp : Defines the entry point for the console application.
    //
    #define XP_WIN
    #include <iostream>
    #include <fstream>
    #include "stdafx.h"
    #include "jsapi.h"
    #include "jsanalyze.h"
    using namespace std;
    using namespace js;


    static JSClass global_class = { "global",
                                    JSCLASS_NEW_RESOLVE | JSCLASS_GLOBAL_FLAGS,
                                    JS_PropertyStub,
                                    NULL,
                                    JS_PropertyStub,
                                    JS_StrictPropertyStub,
                                    JS_EnumerateStub,
                                JS_ResolveStub,
                                JS_ConvertStub,
                                NULL,
                                JSCLASS_NO_OPTIONAL_MEMBERS
};





int _tmain(int argc, _TCHAR* argv[]) {

    /* Create a JS runtime. */
    JSRuntime *rt = JS_NewRuntime(16L * 1024L * 1024L);
    if (rt == NULL)
       return 1;

    /* Create a context. */
    JSContext *cx = JS_NewContext(rt, 8192);
    if (cx == NULL)
       return 1;
    JS_SetOptions(cx, JSOPTION_VAROBJFIX);

    JSScript *script;
    JSObject *obj;
    const char *js = "function a() { var tmp; tmp = 1 + 2; temp = temp * 2; alert(tmp); return 1; }";
    obj = JS_CompileScript(cx,JS_GetGlobalObject(cx),js,strlen(js),"code.js",NULL);
    script = obj->getScript();
    if (script == NULL)
       return JS_FALSE;   /* compilation error */
    js::analyze::Script *sc = new js::analyze::Script();
    sc->analyze(cx,script);

    JS_DestroyContext(cx);
    JS_DestroyRuntime(rt);

    /* Shut down the JS engine. */
    JS_ShutDown();

    return 1;
}

person Mehran Jodavi    schedule 24.10.2013    source источник


Ответы (2)


Какую версию Spidermonkey вы используете? Я использую тот, который поставляется с FireFox 10, поэтому API может отличаться.

Вы должны создать новый глобальный объект и инициализировать его, вызвав JS_NewCompartmentAndGlobalObject() и JS_InitStandardClasses() перед компиляцией скрипта:

.....
 /*
 * Create the global object in a new compartment.
 * You always need a global object per context.
 */
global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
if (global == NULL)
    return 1;
/*
 * Populate the global object with the standard JavaScript
 * function and object classes, such as Object, Array, Date.
 */
if (!JS_InitStandardClasses(cx, global))
  return 1;
......

Обратите внимание, что функция JS_NewCompartmentAndGlobalObject() сейчас устарела, проверьте последнюю документацию JSAPI для используемой вами версии. Ваш вызов JS_CompileScript() просто пытается получить глобальный объект, который не был создан, и, вероятно, это вызывает исключение.

person JavaMan    schedule 01.12.2013

как насчет использования функции "SaveCompiled"? он сохранит объект/код операции (скомпилированный javascript) в файл

person Zam    schedule 10.01.2014