/* myjs.c * SpiderMonkey を C プログラムから使う例 */ #include #include #include #include "myjs.h" #ifndef MY_JS_DEBUG #define MY_JS_DEBUG 0 #endif /* JSRuntime */ static JSRuntime *jsrt = NULL; /* グローバルオブジェクトのクラス */ 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 }; /* * 組込み関数の定義 */ static JSBool myjs_print( JSContext *jsctx , JSObject *obj , uintN argc , jsval *argv , jsval *rval ) { uintN i = 0; JSString *str = NULL; char *bytes = NULL; for (i = 0; i < argc; i++) { str = JS_ValueToString(jsctx, argv[i]); if (!str) return JS_FALSE; bytes = JS_EncodeString(jsctx, str); if (!bytes) return JS_FALSE; printf("%s%s", i ? " " : "", bytes); JS_free(jsctx, bytes); } *rval = JSVAL_VOID; /* return undefined */ return JS_TRUE; } static JSFunctionSpec myjs_global_functions[] = { JS_FS("print", myjs_print, 0, 0, 0), JS_FS_END }; /* エラーレポート用コールバック関数 */ static void reportError( JSContext *jsctx , const char *message , JSErrorReport *report ) { fprintf(stderr, "%s:%u:%s\n", report->filename ? report->filename : "", (unsigned int) report->lineno, message); } /* * スクリプトファイルを読み込んで実行 * 返り値: * 1:成功 * 0:失敗 */ int my_js_execute_script( JSContext *jsctx /* IN: JSContext */ , char *filename /* IN: スクリプトファイル */ , JSScript **js_script_p /* OUT: コンパイル済みスクリプト */ , jsval *rval /* OUT: スクリプトで最後に評価した式の結果 */ ) { int ret = JS_FALSE; JSScript *js_script=NULL; if (!filename) { return 0; } js_script = JS_CompileFile(jsctx, JS_GetGlobalObject(jsctx), filename); if (! js_script) { return 0; } ret = JS_ExecuteScript(jsctx, JS_GetGlobalObject(jsctx), js_script, rval); if (ret != JS_TRUE) { return 0; } if (js_script_p) { *js_script_p = js_script; } return 1; } /* 関数の実行 int[]→int * 返り値: * 1:成功 * 0:失敗 */ int my_js_call_function_IA_I ( JSContext *jsctx /* IN: JSContext */ , const char *func_name /* IN: 関数名 */ , int argc /* IN: 引数の個数 */ , int *args /* IN: 引数の配列 */ , int *ret /* OUT: 関数の実行結果 */ ) { uintN jargc = argc; jsval *jargs = NULL; if (!func_name) { return 0; } jargs = (jsval*)malloc(sizeof(jsval)*argc); { int i=0; for (; i