2013-10-24 4 views
2

나는 거미 원숭이를 처음 사용하며 바이트 코드 시퀀스로 변환 자바 스크립트 파일을 위해 사용하고 싶습니다. 나는 거미 원숭이를 얻고 그것을 디버그 모드로 만든다.spidermonkey를 사용하여 opcode로 자바 스크립트 변환

jsapi.h에서 JS_CompileScript 함수를 사용하여 자바 스크립트 코드를 컴파일하고 바이트 코드를 얻으 려면이 코드를 컴파일하고 실행하면 런타임 오류가 발생합니다. 오류는 "spiderMonkeyTest.exe의 처리되지 않은 예외 (0x200f55c020 (mozjs185-1.0.dll)) : 0xC0000005 : 0x00000d4c 위치를 읽는 액세스 위반입니다." 나는 그것을 해결하지 못합니다.

어떤 몸이라도이 문제를 해결하거나 스파이더 원숭이를 사용하여 자바 스크립트 코드에서 바이트 코드를 가져 오는 다른 솔루션을 도입하는 데 도움이 될 수 있습니까?

 // 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

어떤 스파이더 맨 키 버전을 사용하고 있습니까? 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"사용 방법은 어떻습니까? 객체/연산 코드 (컴파일 된 자바 스크립트)를 파일

에 저장합니다.