2011-03-29 157 views
0

我是C的初学者,我试图使用SpiderMonkey JS引擎。我不明白为什么它不工作(上mdc的例子不是非常有帮助)SpiderMonkey JS引擎C故障

#define XP_UNIX 
#include <stdio.h> 
#include <string.h> 
#include "jsapi.h" 

/* The class of the global object. */ 
#ifndef JSCLASS_GLOBAL_FLAGS 
#define JSCLSAS_GLOBAL_FLAGS 0 
#endif 

static JSClass global_class = { 
    "global", JSCLASS_GLOBAL_FLAGS, 
    JS_PropertyStub, JS_PropertyStub, 
    JS_PropertyStub, JS_PropertyStub, 
    JS_EnumerateStub, JS_ResolveStub, 
    JS_ConvertStub, JS_FinalizeStub, 
    JSCLASS_NO_OPTIONAL_MEMBERS  
}; 

JSBool myjs_rand(JSContext *cx, uintN argc, jsval *vp) 
{ 
    int r = rand(); 
    JS_SET_RVAL(cx, vp, DOUBLE_TO_JSVAL(r)); 
    return JS_TRUE; 
} 

static JSFunctionSpec custom_global_functions[] = { 
    JS_FS("rand", myjs_rand, 0, 0, 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 main(int argc, const char *argv[]) 
{ 
    /* JS variables. */ 
    JSRuntime *rt; 
    JSContext *cx; 
    JSObject *global; 

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

    /* Create a context. */ 
    cx = JS_NewContext(rt, 8192); 
    if (cx == NULL) 
     return 1; 
    JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT); 
    JS_SetVersion(cx, JSVERSION_LATEST); 
    JS_SetErrorReporter(cx, reportError); 

    /* Create the global object in a new compartment. */ 
    global = JS_NewObject(cx, &global_class, 0, 0); 
    if (global == NULL) 
     return 1; 

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

    /* Add custom methods like log */ 
    if (!JS_DefineFunctions(cx, global, custom_global_functions)) 
     return JS_FALSE; 

    /* Run Script */ 

    char *filename; 
    uintN lineno; 

    jsval rval; 
    JSBool ok; 

    char *source = "rand()"; 

    ok = JS_EvaluateScript(cx, global, source, strlen(source), filename, lineno, &rval); 

    if (ok) { 
     // do stuff 
    } 


    JS_DestroyContext(cx); 
    JS_DestroyRuntime(rt); 
    JS_ShutDown(); 
    return 0; 
} 
 
SpiderMonkeyFun.c: In function ‘myjs_rand’: 
SpiderMonkeyFun.c:23: warning: passing argument 1 of ‘DOUBLE_TO_JSVAL’ makes pointer from integer without a cast 
SpiderMonkeyFun.c:23: error: called object ‘rand()’ is not a function 
SpiderMonkeyFun.c: At top level: 
SpiderMonkeyFun.c:28: warning: initialization from incompatible pointer type 
+0

什么“不工作”?你究竟有什么问题? – 2011-03-29 20:40:40

+0

好吧,我得到了警告(在源代码的底部),当我尝试运行它时,我得到这个:'sh:line 1:911 Segmentation fault。/ a.out' – errorhandler 2011-03-29 20:43:48

+0

仅供参考,SpiderMonkey嵌入不是用于成为一个适合新手的环境。许多正确的API使用责任被分流到程序员身上,通常是C方式。 – cdleary 2013-04-29 16:38:30

回答

1

貌似你之后rand()

编辑忘了一个分号:看起来你'也错误地使用API​​。按照文档解释,DOUBLE_TO_JSVAL预计为​​。尝试(我没有自己建立这个测试):

JSBool myjs_rand(JSContext *cx, uintN argc, jsval *vp) 
{ 
    int r = rand(); 
    return JS_NewNumberValue(cx, (double)r, vp); 
} 
+0

嗯,仍然会收到警告:'SpiderMonkeyFun.c:30:警告:从不兼容的指针类型初始化' – errorhandler 2011-03-29 20:51:46

+0

哪个版本?我编辑了我的文章几次。试着将r加倍。另外,我看到我拼错了ctx变量,它应该是cx。 (约编辑) – yan 2011-03-29 20:52:46

+0

仍然得到的警告,但现在在第28行:'静态JSFunctionSpec custom_global_functions [] = { JS_FS( “兰特”,myjs_rand,0,0,0), JS_FS_END };' – errorhandler 2011-03-29 20:54:46