4 #define ARG_ERR_MSG "Wrong argument. Aborting…\n"
6 #include <JavascriptCore/JavascriptCore.h>//-framework JavaScriptCoreオプションを使用の事
8 extern void functionLoader(JSGlobalContextRef ctx, JSObjectRef jobjGlobal);
9 void classWrapper(JSGlobalContextRef ctx, JSObjectRef jobjGlobal, char* name, JSObjectRef* classObject);
10 void functionWrapper(JSGlobalContextRef ctx, JSObjectRef parentObj, char* name, JSObjectCallAsFunctionCallback jsGlobalFunction);
12 int interpreter(char* code)
15 printf("JavaScript interpreter has been started.\n");
19 printf("Creating Global context..");
22 JSGlobalContextRef ctx = JSGlobalContextCreate(NULL);
28 // グローバル実行コンテキストが持つグローバルオブジェクトを取得する
29 // ブラウザでいうところの window オブジェクトのようなもの
30 JSObjectRef jobjGlobal = JSContextGetGlobalObject(ctx);
32 functionLoader(ctx, jobjGlobal);
34 // JavaScript のソースを JS の文字列にする
35 JSStringRef jstrSource = JSStringCreateWithUTF8CString(code);
38 printf("JavaScript source is now ready to execute. Starting ..\n\n");
41 // 実行、 this を NULL とするとグローバルオブジェクトが this になるらしい
42 JSEvaluateScript(ctx, jstrSource, NULL, NULL, 1, NULL);
43 // 文字列のリファレンスカウンタをデクリメント
44 JSStringRelease(jstrSource);
47 printf("Script execution has came to the end. Terminating JavaScript instance ..\n");
51 JSGlobalContextRelease(ctx);
52 // 解放実行?EXC_BAD_ACCESSが来る。
53 //JSGarbageCollect(ctx);
58 void classWrapper(JSGlobalContextRef ctx, JSObjectRef jobjGlobal, char* name, JSObjectRef* classObject)
61 JSClassDefinition classDefinition = kJSClassDefinitionEmpty;
63 JSClassRef classSubstance;
65 classDefinition.className = name;
66 // プロトタイプ は 手動 で作成という事にする
67 classDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
69 classSubstance = JSClassCreate(&classDefinition);
71 *classObject = JSObjectMakeConstructor(ctx, classSubstance, NULL);
73 JSObjectSetPrototype(ctx, *classObject, JSObjectGetPrototype(ctx, jobjGlobal));
75 JSStringRef jstr = JSStringCreateWithUTF8CString(name);
77 JSObjectSetProperty(ctx, jobjGlobal, jstr, *classObject, kJSPropertyAttributeNone, NULL);
78 // 文字列のリファレンスカウンタをデクリメント
79 JSStringRelease(jstr);
82 void functionWrapper(JSGlobalContextRef ctx, JSObjectRef parentObj, char* name, JSObjectCallAsFunctionCallback jsGlobalFunction)
84 // JavaScript で扱える文字列を作る
85 JSStringRef jstr = JSStringCreateWithUTF8CString(name);
86 // C の関数を JS の関数オブジェクトにする
87 JSObjectRef jfunc = JSObjectMakeFunctionWithCallback(ctx, jstr, jsGlobalFunction);
89 JSObjectSetPrototype(ctx, jfunc, JSObjectGetPrototype(ctx, parentObj));
90 // オブジェクトのPrototypeのプロパティとして追加
91 JSObjectSetProperty(ctx, JSObjectGetPrototype(ctx, parentObj), jstr, jfunc, kJSPropertyAttributeNone, NULL);
92 // 文字列のリファレンスカウンタをデクリメント
93 JSStringRelease(jstr);