/* sm5.c * SpiderMonkey を C プログラムから使う例 * スクリプトファイルで定義した関数を C プログラムの中で使用する。 * ・コマンドライン引数で JavaScript のファイル名を指定する。 * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を * 引数として適用する。 * ・foo は文字列を二つ引数としてとり、文字列を返す関数とする。 * char* foo(char*, char*) * ・実行例 * % sm5 foo.js "str1" "str2" * のように実行した場合は、foo.js 内で定義した関数 foo に引数 "str1", "str2" を適用する。 */ #define USAGE "Usage: sm5 " #define FUNC_NAME "foo" #include #include #include #include "myjs.h" int main(int ac, char **av) { int error_flag = 0; JSContext *jsctx = NULL; char *filename = NULL; char *foo_arg1 = NULL; char *foo_arg2 = NULL; if (ac < 4) { fprintf(stderr, "%s\n", USAGE); error_flag = 1; goto _FINALLY_; } filename = av[1]; foo_arg1 = av[2]; foo_arg2 = av[3]; /* 初期化 */ /* プロセス単位でランタイムを生成 */ if (!my_js_rt_init()) { error_flag = 1; goto _FINALLY_; } /* スレッド単位でコンテクスト生成 */ jsctx = my_js_ctx_init(); if (!jsctx) { error_flag = 1; goto _FINALLY_; } /* スクリプトの実行 */ { JSScript *js_script = NULL; jsval rval; if(!my_js_execute_script(jsctx, filename, &js_script, &rval)) { fprintf(stderr, "ERROR: execute_script "); error_flag = 1; goto _FINALLY_; } if (js_script) { //JS_MaybeGC(jsctx); JS_DestroyScript(jsctx, js_script); /* このスクリプトは再利用しない */ } } /* 関数 foo の実行 */ { char *ret = NULL; char* args[2]; args[0] = foo_arg1; args[1] = foo_arg2; if (! my_js_call_function_SA_S(jsctx, FUNC_NAME, 2, args, &ret)) { fprintf(stderr, "ERROR: call_function "); error_flag = 1; goto _FINALLY_; } printf("%s(%s,%s)=%s\n", FUNC_NAME, args[0], args[1], ret); } _FINALLY_: /* JSContext と JSRuntime リソースの解放 */ if (jsctx) { my_js_ctx_clear(jsctx); jsctx = NULL; } my_js_rt_clear(); if (error_flag) { fprintf(stderr, "failed.\n"); return 1; } return 0; } /* End of main */