今晚在
Vczh Library++3.0里面實現了C++調用NativeX腳本函數的單元測試代碼,這個Demo其實是從單元測試里面抽出來的。
因為代碼可以在
這里下載到,所以這里只列出當前版本C++調用NativeX腳本函數的例子。首先我們假設有下面的字符串,然后存放在const WString& code;的變量里面:
1 unit simple_function;
2 function int Add(int a, int b){
3 result=a+b;
4 exit;
5 }
6 function int Sub(int a, int b){
7 result=a-b;
8 exit;
9 }
因為NativeX基本上是用來被更加高級的語言做編譯媒介的中間語言,或者拿來寫一點腳本引擎的庫用的,因此語法并沒有設計得十分的簡練。大部分還是從便于分析,并且接近C語言的角度出發。現在的NativeX支持數組、指針、自定義函數和結構體,不過這個Demo為了顯露出本質,就簡單化了,只實現了一個加法函數和減法函數。
那么假設這段代碼已經保存在變量code里面,那么可以通過下面的方法來調用Add和Sub函數:
1 List<Ptr<LanguageAssembly>> references;
2 List<WString> codes;
3 List<Ptr<LanguageException>> errors;
4 codes.Add(code);
5
6 Ptr<ILanguageProvider> provider=GetNativeXProvider().provider;
7 Ptr<LanguageAssembly> assembly=provider->Compile(references.Wrap(), codes.Wrap(), errors.Wrap());
8 BasicLanguageMetadata* metadata=assembly->GetBasicLanguageMetadata();
9 BasicDeclarationInfo add=metadata->GetDeclaration(0);
10 BasicDeclarationInfo sub=metadata->GetDeclaration(1);
11
12 LanguageHost host(65536);
13 host.LoadAssembly(assembly);
14 Ptr<LanguageState> state=host.CreateState();
15 BasicFunctionExecutor<int(int,int)> addFunc(add, state);
16 BasicFunctionExecutor<int(int,int)> subFunc(sub, state);
17
18 TEST_ASSERT(addFunc(1, 2)==3);
19 TEST_ASSERT(subFunc(1, 2)==-1);
不通過BasicFunctionExecutor而想自己設置返回值指針和自己挨個把參數Push進堆棧也行,其實BasicFunctionExecutor的實現正是調用了這些原始接口來做到的。
例子就分享到這里了,完整的代碼請去
這里下載。
posted on 2010-04-10 23:19
陳梓瀚(vczh) 閱讀(2735)
評論(4) 編輯 收藏 引用 所屬分類:
VL++3.0開發紀事