spidermonkey simple demo

#define STATIC_JS_API 1
#ifdef JS_THREADSAFE
#undef JS_THREADSAFE
#endif
#include <iostream>
#include "jsapi.h"

using namespace JS;


/* spidermonkey
1.runtime
2.context
3.global object
*/


static JSClass globalClass = 
{
	"global",
    JSCLASS_GLOBAL_FLAGS,
    JS_PropertyStub,
    JS_DeletePropertyStub,
    JS_PropertyStub,
    JS_StrictPropertyStub,
    JS_EnumerateStub,
    JS_ResolveStub,
    JS_ConvertStub,
    nullptr,nullptr,nullptr,nullptr,
    nullptr,//JS_GlobalObjectTraceHook
};

/*/---------------
static JSFunctionSpec myjs_global_functions[] = {
    JS_FS("rand",   myjs_rand,   0, 0),
    JS_FS("srand",  myjs_srand,  0, 0),
    JS_FS("system", myjs_system, 1, 0),
    JS_FS_END
};
*///------------------------------

// The error reporter callback.
void reportError(JSContext *cx, const char *message, JSErrorReport *report) {
     fprintf(stderr, "%s:%u:%s\n",
             report->filename ? report->filename : "[no filename]",
             (unsigned int) report->lineno,
             message);
}


int run(JSContext *cx) {
    // Enter a request before running anything in the context.
    JSAutoRequest ar(cx);

    // Create the global object and a new compartment.
    RootedObject global(cx);
    global = JS_NewGlobalObject(cx, &globalClass, nullptr,
                                JS::DontFireOnNewGlobalHook);
    if (!global)
        return 1;

    // Enter the new global object's compartment.
    JSAutoCompartment ac(cx, global);

    // Populate the global object with the standard globals, like Object and
    // Array.
    if (!JS_InitStandardClasses(cx, global))
        return 1;

    // Your application code here. This may include JSAPI calls to create your
    // own custom JS objects and run scripts.
#if 1
    char* script = "var today = Date(); today.toString();";
    jsval rval;
    uint lineno = 0;
    bool ok = JS_EvaluateScript(
    		cx, 
            global, 		// The scope in which to execute the script. This parameter is 						// documented in detail at JS_ExecuteScript. 
            script,
            strlen(script), 
            
            //---------------
            "script", 		// Name of file or URL containing the script. Used to report filename or 			// URL in error messages.
            lineno, 		// Line number. Used to report the offending line in the file or URL if 			// an error occurs.
            //---------------
            &rval			// Out parameter. On success, if rval is not NULL, *rval receives the 				// result value.
            );
                             
	JSString* str = JS_ValueToSource(cx, rval);
   	size_t str_len = JS_GetStringLength(str);
    
    const jschar* p = JS_GetStringCharsAndLength(cx,str,&str_len);
	char*pp = JS_EncodeString(cx,str);
    fprintf(stderr,"%s\n",pp);
    JS_free(cx,pp);
#endif
    //free(pp);
    
            	    return 0;
}


int main(int argc, const char *argv[]) {
    // Initialize the JS engine.
    if (!JS_Init())
       return 1;

    // Create a JS runtime.
    JSRuntime *rt = JS_NewRuntime(8L * 1024L * 1024L,JS_USE_HELPER_THREADS);
    if (!rt)
       return 1;

    // Create a context.
    JSContext *cx = JS_NewContext(rt, 8192);
    if (!cx)
       return 1;
    JS_SetErrorReporter(cx, &reportError);

    int status = run(cx);

    // Shut everything down.
    JS_DestroyContext(cx);
    JS_DestroyRuntime(rt);
    JS_ShutDown();

    return status;
}



你可能感兴趣的:(spidermonkey simple demo)