/* sm3.c * SpiderMonkey を C プログラムから使う例 * スクリプトファイルで定義した関数を C プログラムの中で使用する。 * ・コマンドライン引数で JavaScript のファイル名を指定する。 * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を * 引数として適用する。 * ・foo は整数値を引数としてとり、整数値を返す関数とする。 * int foo(int) * ・実行例 * % sm3 foo.js 6 * のように実行した場合は、foo.js 内で定義した関数 foo に引数 6 を適用する。 */ #define USAGE "Usage: sm3 " #define FUNC_NAME "foo" #include #include #include #include "jsapi.h" /* グローバルオブジェクトのクラス */ 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_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 }; /* エラーレポート用コールバック関数 */ void reportError( JSContext *jsctx , const char *message , JSErrorReport *report ) { fprintf(stderr, "%s:%u:%s\n", report->filename ? report->filename : "", (unsigned int) report->lineno, message); } JSBool execute_script( JSContext *jsctx , char *filename , JSScript **js_script , jsval *rval ) { if (! filename) { return JS_FALSE; } *js_script = JS_CompileFile(jsctx, JS_GetGlobalObject(jsctx), filename); if (! *js_script) { return JS_FALSE; } return JS_ExecuteScript(jsctx, JS_GetGlobalObject(jsctx), *js_script, rval); } JSBool call_function ( JSContext *jsctx , const char *func_name , int argc , int *args , int *ret ) { uintN jargc = argc; jsval *jargs = NULL; if (!func_name) { return JS_FALSE; } jargs = (jsval*)malloc(sizeof(jsval)*argc); { int i=0; for (; i