随笔-341  评论-2670  文章-0  trackbacks-0
    今晚在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(12)==3);
19 TEST_ASSERT(subFunc(12)==-1);

    不通过BasicFunctionExecutor而想自己设置返回值指针和自己挨个把参数Push进堆栈也行,其实BasicFunctionExecutor的实现正是调用了这些原始接口来做到的。

    例子就分享到这里了,完整的代码请去这里下载。
posted on 2010-04-10 23:19 陈梓瀚(vczh) 阅读(2707) 评论(4)  编辑 收藏 引用 所属分类: VL++3.0开发纪事

评论:
# re: Vczh Library++3.0之C++调用NativeX脚本函数Demo(就算去美帝出差也要坚持写代码) 2010-04-10 23:29 | Davy.xu
感觉不错,有.NET的感觉  回复  更多评论
  
# re: Vczh Library++3.0之C++调用NativeX脚本函数Demo(就算去美帝出差也要坚持写代码) 2010-04-11 00:45 | expter
呵呵。。  回复  更多评论
  
# re: Vczh Library++3.0之C++调用NativeX脚本函数Demo(就算去美帝出差也要坚持写代码) 2010-04-11 03:34 | flair
牛逼!支持开源。就是代码有点整齐过头了,感觉像是机器生成的,看起来没什么"人味",标识符也有点过于一致,以致看到一个标志符要搞清楚其是类名还是函数名还是变量名或者其他什么的,需要几毫秒:).总之,牛逼!!  回复  更多评论
  
# re: Vczh Library++3.0之C++调用NativeX脚本函数Demo(就算去美帝出差也要坚持写代码) 2010-04-11 09:35 | 陈梓瀚(vczh)
@flair
嘛,你没看清楚,我里面有六七个.h.fpm文本文件是代码模板,对应的那几个头文件就是生成的……生成工具在Tools\Fpmacro.exe,源代码位于Tools\Fpmacro\Fpmacro.sln  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理