今晚在
Vczh Library++3.0里面實(shí)現(xiàn)了C++調(diào)用NativeX腳本函數(shù)的單元測試代碼,這個(gè)Demo其實(shí)是從單元測試?yán)锩娉槌鰜淼摹?br>
因?yàn)榇a可以在
這里下載到,所以這里只列出當(dāng)前版本C++調(diào)用NativeX腳本函數(shù)的例子。首先我們假設(shè)有下面的字符串,然后存放在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 }
因?yàn)镹ativeX基本上是用來被更加高級的語言做編譯媒介的中間語言,或者拿來寫一點(diǎn)腳本引擎的庫用的,因此語法并沒有設(shè)計(jì)得十分的簡練。大部分還是從便于分析,并且接近C語言的角度出發(fā)。現(xiàn)在的NativeX支持?jǐn)?shù)組、指針、自定義函數(shù)和結(jié)構(gòu)體,不過這個(gè)Demo為了顯露出本質(zhì),就簡單化了,只實(shí)現(xiàn)了一個(gè)加法函數(shù)和減法函數(shù)。
那么假設(shè)這段代碼已經(jīng)保存在變量code里面,那么可以通過下面的方法來調(diào)用Add和Sub函數(shù):
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而想自己設(shè)置返回值指針和自己挨個(gè)把參數(shù)Push進(jìn)堆棧也行,其實(shí)BasicFunctionExecutor的實(shí)現(xiàn)正是調(diào)用了這些原始接口來做到的。
例子就分享到這里了,完整的代碼請去
這里下載。
posted on 2010-04-10 23:19
陳梓瀚(vczh) 閱讀(2733)
評論(4) 編輯 收藏 引用 所屬分類:
VL++3.0開發(fā)紀(jì)事