2013-10-24 48 views
2

我是新來的蜘蛛猴,想用它來轉換Java腳本文件以字節碼的順序。 我得到蜘蛛猴,並建立它在調試模式。將javascript轉換爲使用spidermonkey的操作碼

我想在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; 
} 

回答

1

您正在使用哪個版本的Spidermonkey?我正在使用FireFox 10附帶的API,因此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()調用只是嘗試檢索尚未創建的全局對象,可能會導致異常。

0

如何使用函數「SaveCompiled」?它會將對象/操作碼(編譯的javascript)保存到文件