sm4.c
最終更新:2009/11/18
001: /* sm4.c 002: * SpiderMonkey を C プログラムから使う例 003: * スクリプトファイルで定義した関数を C プログラムの中で使用する。 004: * ・コマンドライン引数で JavaScript のファイル名を指定する。 005: * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を 006: * 引数として適用する。 007: * ・foo は整数値を引数としてとり、整数値を返す関数とする。 008: * int foo(int) 009: * ・実行例 010: * % sm4 foo.js 6 011: * のように実行した場合は、foo.js 内で定義した関数 foo に引数 6 を適用する。 012: */ 013: 014: #define USAGE "Usage: sm4 <script_file_of_foo> <arg_of_foo>" 015: 016: #define FUNC_NAME "foo" 017: 018: #include <stdio.h> 019: #include <stdlib.h> 020: #include <string.h> 021: #include "myjs.h" 022: 023: int main(int ac, char **av) 024: { 025: int error_flag = 0; 026: 027: JSContext *jsctx = NULL; 028: 029: char *filename = NULL; 030: int foo_arg = 0; 031: 032: if (ac < 3) { 033: fprintf(stderr, "%s\n", USAGE); 034: error_flag = 1; 035: goto _FINALLY_; 036: } 037: filename = av[1]; 038: foo_arg = atoi(av[2]); 039: 040: /* 初期化 */ 041: 042: /* プロセス単位でランタイムを生成 */ 043: if (!my_js_rt_init()) { 044: error_flag = 1; 045: goto _FINALLY_; 046: } 047: 048: /* スレッド単位でコンテクスト生成 */ 049: jsctx = my_js_ctx_init(); 050: if (!jsctx) { 051: error_flag = 1; 052: goto _FINALLY_; 053: } 054: 055: /* スクリプトの実行 */ 056: 057: { 058: JSScript *js_script = NULL; 059: jsval rval; 060: if(!my_js_execute_script(jsctx, filename, &js_script, &rval)) { 061: fprintf(stderr, "ERROR: execute_script "); 062: error_flag = 1; 063: goto _FINALLY_; 064: } 065: if (js_script) { 066: //JS_MaybeGC(jsctx); 067: JS_DestroyScript(jsctx, js_script); /* このスクリプトは再利用しない */ 068: } 069: } 070: 071: /* 関数 foo の実行 */ 072: { 073: int ret = 0; 074: int args[1]; 075: args[0] = foo_arg; 076: if (! my_js_call_function_IA_I(jsctx, FUNC_NAME, 1, args, &ret)) { 077: fprintf(stderr, "ERROR: call_function "); 078: error_flag = 1; 079: goto _FINALLY_; 080: } 081: printf("%s(%d)=%d\n", FUNC_NAME, args[0], ret); 082: } 083: 084: _FINALLY_: 085: 086: /* JSContext と JSRuntime リソースの解放 */ 087: if (jsctx) { 088: my_js_ctx_clear(jsctx); 089: jsctx = NULL; 090: } 091: 092: my_js_rt_clear(); 093: 094: if (error_flag) { 095: fprintf(stderr, "failed.\n"); 096: return 1; 097: } 098: 099: return 0; 100: } /* End of main */
KAKU PROJECT (2009) |