首页 > 其他分享 >lua/c开发:lua增加自定义require方式

lua/c开发:lua增加自定义require方式

时间:2024-03-23 14:22:18浏览次数:13  
标签:searcher 自定义 require loader nloader lua

我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁;
lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader;

static const lua_CFunction searchers[] = {
    searcher_preload,
    searcher_Lua,
    searcher_C,
    searcher_Croot,
    NULL
};

需要自定义require方式,只需要替换或者增加一个新的loader即可;(了解 ll_require 函数实现)

int myloader(lua_State* L){
	// ... do something else
	luaL_loadbuffer(L, (const char*)buffer, size, fname);
	reurn 1;
}

void addloader(lua_State* L){
	lua_getfield(L, LUA_GLOBALSINDEX, "package");
	lua_getfield(L, -1, "loaders");
	lua_remove(L, -2);

	int nloader = 0;
	lua_pushnil(L);
	while (lua_next(L, -2) != 0){
		lua_pop(L, 1);
		nloader++;
	}
	lua_pushinteger(L, nloader + 1);
	lua_pushcfunction(L, nloader);
	lua_rawset(L, -3);
	lua_pop(L, 1);
}

标签:searcher,自定义,require,loader,nloader,lua
From: https://www.cnblogs.com/linxx-/p/18091072

相关文章

  • lua/c开发:只读数据共享方案
    这里只讨论单一进程内的只读数据共享。同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需......
  • 鸿蒙自定义控件实现罗盘数字时钟效果
    前言:DevEcoStudio版本:4.0.0.600关注过我的小伙伴一定知道我之前写过一篇基于Android的 仿抖音效果的数字时钟罗盘 最近看了鸿蒙的Canvas组件,今天通过Canvas组件也实现下罗盘数字时钟的效果。参考链接:OpenHarmonyCanvas  OpenHarmonyCanvasrenderingcontext2d效果:......
  • 使用Django-Simple-Captcha在Django项目加入验证码模块并自定义样式
    在Django项目中加入验证码功能,通常需要借助第三方库,比如Django-Smple-Captch、Django-reCAPTCHA、DEF-reCAPTCHA、Wagtail-Django-ReCaptcha、Django-Friendly-Captcha等。其中,Django-Smple-Captcha是一个流行的选择,它提供了一个简单而强大的Django应用,无需调用第三方API,......
  • 深度解析webpack5以及打包实践攻略,看完这篇带你玩转高级自定义打包
    1.webpack5对比webpack4做了哪些优化Webpack5对比Webpack4存在一些重要的优化。Webpack5在性能、构建速度、TreeShaking等方面都有所改进:性能改进:Webpack5在构建速度和性能方面有所提升。这主要是通过改进缓存策略、优化构建算法以及增强的持久化缓存等方式......
  • Vue开发日志:自定义组件:通用开发流程
    自定义组件:通用开发流程通用流程一组概念:key,value,labelProps:required和default同时存在的必要性让我们简单梳理一下通用流程在Vue.js中开发自定义组件的通用流程如下:定义组件模板:创建一个.vue文件,里面包含模板、样式和脚本部分。例如:<!--MyCustomCompone......
  • python 教你如何创建一个自定义库 colorlib.py
    目录Colorlib生成代码模块代码导入测试测试一测试二应用测试颜色列表colorList随机颜色元组randcolorTuples随机颜色字串randcolorStringsColor类测试测试一测试二题外话Colorlib有没有碰到过这样的场景:写代码时想要用上丰富的色彩,但苦思冥想搜肠刮肚只记......
  • 自定义类型--结构体、联合体、枚举类型
    **Ladiesandgentlemen**,今天,我们将来进行对自定义类型的学习!目录1.结构的特殊声明2.结构体内存对齐2.1对齐规则2.1.12.1.22.1.32.1.42.2为什么存在内存对齐?1.平台原因(移植原因):2.性能原因:2.3修改默认对齐数3.结构体传参4.结构体实现位段4.1什么......
  • uni-app/小程序自定义导航栏下拉刷新loading图标看不到问题解决
    实际效果图 我们在page.json中开启了自定义导航栏属性和下拉刷新属性后//开启下拉刷新"enablePullDownRefresh":true//自定义导航栏"navigationStyle":"custom"此时,页面中的下拉刷新三个小圆点会被我们的导航栏遮盖住,导致用户下拉刷新看不到loading效果,如下图:......
  • ROS2自定义msg
    在ROS2中,您可以通过编写自己的自定义消息来扩展消息类型。以下是如何创建自定义消息的一般步骤:1.**创建消息文件夹**:在功能包下创建msg的文件夹2.**编写消息文件**:在`msg`文件夹内创建一个`xxx.msg`文件,命名为所需的消息类型,例如`MyCustomMsg.msg`。3.**定义消息结构**:在消......
  • ThinkPHP自定义指令
    官网文档https://www.kancloud.cn/manual/thinkphp6_0/1037651创建命令类文件运行指令创建一个自定义命令类文件phpthinkmake:commandHellohello生成内容如下<?phpnamespaceapp\command;usethink\console\Command;usethink\console\Input;usethink\console\in......