cpgf如何实现lua script binding的?
Lib:
https://github.com/cpgf/cpgf/tree/master
代码
以下是operator的实现函数
int UserData_operator(lua_State * L)
{
ENTER_LUA() GOperatorGlueDataPointer glueData = static_cast<GGlueDataWrapper *>(lua_touserdata(L, lua_upvalueindex()))->getAs<GOperatorGlueData>(); return invokeOperator(glueData->getBindingContext(), glueData->getObjectData(), glueData->getMetaClass(), glueData->getOp()); LEAVE_LUA(L, return )
}
可见cpgf 设置 一个GGlueDataWrapper *指针作为upvalue,从而可以方便的调用相关实现
而注册函数如下
由于对lua api不很熟悉,这段代码还没有完全搞懂
有时间仔细研究下
void helperBindOperator(const GContextPointer & context, const GObjectGlueDataPointer & objectData, IMetaClass * metaClass, GMetaOpType op)
{
lua_State * L = getLuaState(context); for(size_t i = 0; i < sizeof(metaOpTypes) / sizeof(metaOpTypes[0]); ++i) {
if(metaOpTypes[i] == op) {
GOperatorGlueDataPointer operatorData(context->newOperatorGlueData(objectData, metaClass, op));
GLuaRefUserData * glueUserData = operatorData->getUserDataAs<GLuaRefUserData>();
if(glueUserData != nullptr) {
glueUserData->get();
if(! lua_isnil(L, -1)) {
return;
}
lua_pop(L, 1);
} lua_pushstring(L, luaOperators[i]);
void * userData = lua_newuserdata(L, getGlueDataWrapperSize<GOperatorGlueData>());
newGlueDataWrapper(userData, operatorData); lua_newtable(L);
setMetaTableSignature(L);
setMetaTableGC(L);
lua_setmetatable(L, -2); lua_pushcclosure(L, &UserData_operator, 1);
lua_rawset(L, -3); glueUserData = new GLuaRefUserData(L, false);
operatorData->setUserData(glueUserData);
glueUserData->retainAndPop(); glueUserData->get(); return;
}
}
}
cpgf如何实现lua script binding的?的更多相关文章
- Lua C++ Binding之Lunar, Luna
服务端引擎的脚本, 我们项目在老端游项目上发展, 采取的是Lua脚本. 当前服务端的发展趋势是瘦引擎, 胖脚本模式, 基本上引擎负责的功能非常少, 主要是网络, 定帧, 定时器, 引擎通过导出相应的接 ...
- Redis 的Lua Script脚本功能
从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值 Redis2.6内置的Lua Script支持,可以在Redis的Server端一次 ...
- Redis 与 Lua Script
[Redis Script] 1.EVAL script numkeys key [key ...] arg [arg ...] 从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以 ...
- Lua Script
注意事项: 1:Lua 只支持数字类型,浮点类型的值,在转换成Redis 协议值得时候,小数点会被忽略(如果需要在Lua中使用浮点值,建议用字符串代替) 2:Lua 返回表中如果遇到nils(空),转 ...
- C/C++ Lua Parsing Engine
catalog . Lua语言简介 . 使用 Lua 编写可嵌入式脚本 . VS2010编译Lua . 嵌入和扩展: C/C++中执行Lua脚本 . 将C++函数导出到Lua引擎中: 在Lua脚本中执 ...
- 【转】cocos2d-x Lua
Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functi ...
- Lua与javascript的差异
Lua与javascript的差异 2010-03-08 Lua模拟器js方案 1.语法级模拟 lua与js语言差异 1.1注释 js 为//,lua为--. 1.2变量 js利用var来声明全局变量 ...
- 在redis中使用lua脚本让你的灵活性提高5个逼格
在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...
- 《转》Unity3D研究院编辑器之创建Lua脚本模板
Unity里能创建 c#脚本模板,但是如果我想创建Lua脚本模板怎么办呢?拓展一下编辑器吧. 设置一下Lua脚本的模板地址 : Assets/Editor/Lua/Template/lua.lua ...
随机推荐
- vue的技巧代码
转载:https://segmentfault.com/a/1190000014085613 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList ...
- 第 8 章 容器网络 - 069 - Calico 的默认连通性
相同calico 网络之间的连通性 测试一下 bbox1 与 bbox2 的连通性: ping 成功,数据包流向如下图所示. 1)根据 bbox1 的路由表,将数据包从 cal0 发出. 2)数据经过 ...
- 英语发音规则---I字母常见发音组合有哪些
英语发音规则---I字母常见发音组合有哪些 一.总结 一句话总结: I/y在开音节中发/aɪ/,例如:bite /baɪt/ n. 咬 I/y在闭音节中发 /ɪ/,例如:clinic /'klɪnɪk ...
- word常用功能
1. 安装office2013 cn_office_professional_plus_2013_x86_dvd_1134005 密钥激活 (1)用专用软件彻底卸载原来的 (2)安装 (3)用暴风激活 ...
- [数据结构]P1.1 链表结构
* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 2019年4月8日 Stan Zhang 2019年4月8日 格物致知,经世致用. [面试题]1.为什么要用链表? 数组具有的缺陷 ...
- pipenv使用总结
一.pipenv默认虚拟环境路径在用户目录下的.\virtualenvs下,不同虚拟环境目录不同,如果要更改为在当前项目根目录下,可以在项目根目录下手动创建.venv目录. 1.linux环境下设置环 ...
- 基于socket实现http请求
异步非阻塞模块原理 # 基于socket实现http请求 import socket # 多路IO复用模块 import select socket_list= [] url_list = [&quo ...
- Eclipse 手动增加linker library
多个cu文件nvcc -cubin -m64 -lcudadevrt -lcublas_device -gencode arch=compute_35,code=sm_35 -o test.cubin ...
- 跟随我在oracle学习php(7)
盒子模型布局 盒子模型:每个标签都是一个盒子 计算宽高:box-sizing:border-box盒子的宽度就是设置的宽度,里面的内容自适应 从里到外:padding(内边距) Border(边框) ...
- vue轮播图实现
1.先安装组件 cnpm install vue-awesome-swiper; 2.在main.js下引入文件: import VueAwsomeSwiper from 'vue-awesome-s ...