2

我是蜘蛛猴的新手,想用它来将 java 脚本文件转换为字节码序列。我得到蜘蛛猴并在调试模式下构建它。

我想使用 jsapi.h 中的 JS_CompileScript 函数来编译 javascript 代码并对其进行分析以获取字节码,但是在编译下面的代码并运行它时,我得到运行时错误。错误是“spiderMonkeyTest.exe 中 0x0f55c020 (mozjs185-1.0.dll) 处的未处理异常: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;
}
4

2 回答 2

1

您使用的是哪个版本的蜘蛛猴?我使用的是 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()调用只是尝试检索尚未创建的全局对象,这可能会导致异常。

于 2013-12-01T12:08:39.057 回答
0

如何使用函数“SaveCompiled”?它将对象/操作码(已编译的 javascript)保存到文件中

于 2014-01-10T20:37:35.453 回答