今晚在
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) 阅读(2722)
评论(4) 编辑 收藏 引用 所属分类:
VL++3.0开发纪事