LUA源码分析五:环境设置
版本日期 2011年4月22日
lua里的环境设置,可以看成是一个临时的域名空间。这个空间里有名字和变量等等。可以试着运行一下以下代码,输出全局的环境
local l_lindp=1
g_lindp=1
for n in pairs(_G) do print(n) end
输出:
string
xpcall
package
tostring
print
os
unpack
require
getfenv
setmetatable
next
assert
tonumber
io
rawequal
collectgarbage
getmetatable
module
rawset
Average
g_lindp //定义的全局
...
相对于整个开发环境讲,全局的表就是一个局部的表。那么同理,也可以为某个函数设置一个环境。在lua里的实现很巧妙,它并不是通过增加一个表系
统来做这事,而是把函数当成了一个对象,环境表只是里面的一个成员:
#define ClosureHeader \
CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
struct Table *env //存放在这
typedef struct CClosure {
ClosureHeader;
lua_CFunction f;
TValue upvalue[1];
} CClosure;
整个设置的过程通过luaB_setfenv和lua_setfenv完成
static int luaB_setfenv (lua_State *L) {
luaL_checktype(L, 2, LUA_TTABLE);
//取得函数的环境
getfunc(L, 0);
lua_pushvalue(L, 2);
//判断setfenv的参数是否合法,也就是level.
if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {
/* change environment of current thread */
lua_pushthread(L);
lua_insert(L, -2);
lua_setfenv(L, -2);
return 0;
}
else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)
luaL_error(L,
LUA_QL("setfenv") " cannot change environment of given object");
return 1;
}
LUA_API int lua_setfenv (lua_State *L, int idx) {
StkId o;
int res = 1;
lua_lock(L);
api_checknelems(L, 1);
o = index2adr(L, idx);
api_checkvalidindex(L, o);
api_check(L, ttistable(L->top - 1));
switch (ttype(o)) {
case LUA_TFUNCTION:
//赋值
clvalue(o)->c.env = hvalue(L->top - 1);
break;
}
在getfunc(L, 0);里面有段代码的封装非常的简单巧妙:
luaL_optint(L, 1, 1)
((int)luaL_optinteger(L, (n), (d)))
LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
lua_Integer def) {
return luaL_opt(L, luaL_checkinteger, narg, def);
}
LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
lua_Integer d = lua_tointeger(L, narg);
if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */
tag_error(L, narg, LUA_TNUMBER);
return d;
}
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
而luaL_optint是外部开放的API
luaL_optinteger负责组合luaL_checkinteger和luaL_opt
luaL_checkinteger 是具体的逻辑
luaL_opt是个最底层的调用函数
当编译器执行到对变量去值时,会先去获取当前宿主的环境表里,然后从里面取值
case OP_GETGLOBAL: {
TValue g;
TValue *rb = KBx(i);
sethvalue(L, &g, cl->env);
lua_assert(ttisstring(rb));
Protect(luaV_gettable(L, &g, rb, ra));
continue;
}
有了这几个关键点后,lua的env工作方式就很明了了
分享到:
相关推荐
为了使Lua代码可以在不同的环境中运行,Lua实现了独立的解析器和字节码编译器,这些工具对于Lua源码分析同样重要。 7. 阅读源代码的次序: 对于理解整个Lua的源码结构,选择合适的阅读顺序至关重要。官方文档中...
《云风-lua源码欣赏-lua-5.21》通过各个章节的深入分析和讲解,为读者提供了一个全面了解Lua内部机制的平台。无论是对Lua语言的底层原理感兴趣,还是希望提高Lua编程技巧,亦或是有志于进行Lua相关技术的扩展开发,...
《lua 源码剖析》是一本深入探讨lua编程语言...通过对lua源码的学习,开发者不仅能掌握lua语言的精髓,还能提升编程技巧,更好地利用lua解决实际问题。同时,源码阅读也能培养程序员的底层思维,增强系统级编程能力。
通过分析lua_test的源码,你可以了解到如何在实际项目中嵌入lua,这对于嵌入式系统开发者来说是非常有价值的。你可以学习到如何在有限的资源环境下利用lua的灵活性和高效性,来增强软件的功能和可维护性。同时,lua_...
《深入剖析:Lua源码分析》 一、引言与背景 Lua,作为一种小巧而强大的脚本语言,凭借其高效性、灵活性以及易嵌入特性,在游戏开发、系统管理、Web应用等多个领域得到了广泛的应用。它由标准C语言编写而成,这不仅...
源码分析有助于提升编程技能,特别是对于想要定制或扩展Lua功能的开发者来说,这是一份宝贵的资源。 Lua的源码结构清晰,易于阅读。主要包含以下几个关键部分: 1. **lprefix.h**: 这个头文件包含了所有Lua源文件...
### lua源码导读---云风 #### 概览 **Lua** 是一门轻量级、高效能的脚本语言,广泛应用于游戏开发、系统管理工具、网络应用等多个领域。本书《lua源码导读》旨在深入剖析 Lua 的源代码,帮助读者理解其内部实现...
这个资源包包含了“Lua中文教程”和“Lua源码赏析”两部分,旨在帮助初学者在短短两小时内快速掌握Lua编程基础,并通过源码分析深入理解其内部机制。 “Lua中文教程”可能涵盖以下内容: 1. **基础语法**:Lua的...
总结来说,Lua源码的分析不仅有助于我们掌握其核心机制,还能够提升我们的编程能力,使我们能够更深入地利用Lua来解决实际问题。无论你是游戏开发者、系统管理员,还是对编程语言感兴趣的爱好者,理解Lua的源码都将...
《打地鼠lua源码解析与学习指南》 在编程世界中,lua语言以其轻量级、易学易用的特点,常被用作游戏开发的脚本语言,尤其是在嵌入式系统和游戏逻辑中。本篇文章将围绕"打地鼠lua源码"这一主题,深入探讨lua在游戏...
以上只是Lua源码中涉及的一部分知识点,实际的源码分析将更为深入,涵盖虚拟机实现、错误处理、字符串操作、线程模型等多个方面。对于想要深入理解和定制Lua的开发者来说,这将是一份宝贵的资源。
- 配置环境:安装C++编译器(如Visual Studio)和Lua环境。 - 分析源码:理解C++代码中的Lua绑定部分,识别游戏逻辑和资源管理模块。 - 编译和运行:使用VC2008编译源码,检查和解决任何新出现的问题。 - 测试和...
文档的标题中出现了“Lua源码欣赏”,表明作者云风意在与读者分享他对Lua语言源码的理解和分析。由于Lua是一门开源的脚本语言,因此它具有较高的透明度,源码的开放允许社区成员对其进行细致的研究和欣赏。云风在...
Lua 源码的实现机制是非常复杂的,涉及到多个方面的知识,包括 Load 机制、闭包机制、语法分析、词法分析等。本文只是对 Lua 源码的实现机制进行了初步的解析,旨在帮助读者更好地理解 Lua 语言的内部机制。
《Lua 源码鉴赏》是一份高清的文档,旨在深入解析 Lua 语言的源代码,帮助读者理解和掌握 Lua 的内部设计原理。Lua 是一种轻量级的、高效的脚本语言,广泛应用于游戏开发、嵌入式系统、服务器端编程等多个领域。通过...
这个"捉鬼脚本,捉鬼脚本代码,Lua源码.rar"压缩包包含了捉鬼脚本的源代码,你可以通过解压并阅读代码来进一步学习和理解作者如何利用Lua实现自动化问题检测和解决。记得在查看和运行脚本之前,确保你的环境已经安装了...
通过研究Lua源码,我们可以深入了解其内部工作原理,这对于优化性能、编写高效的库函数以及定制化Lua环境都是非常有帮助的。对于想要深入学习Lua或者进行嵌入式开发的开发者来说,阅读和理解源码是一项必不可少的...
【cocos2d-x+lua游戏demo源码】是一个基于cocos2d-x游戏引擎和lua脚本语言的游戏示例项目。cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于移动设备,如iOS和Android。lua是一种轻量级的、面向过程的编程语言,...
移植Lua到STM32F407首先需要准备以下资源:Lua源码、STM32的交叉编译工具链,以及一个合适的嵌入式Lua库,如luac跨编译器和lua虚拟机。这里的关键步骤包括: 1. **构建Lua环境**:下载Lua的源代码,使用针对STM32的...
标题中的“lua网络验证系统 lua代码 php后台源码”表明这是一个使用Lua语言构建的网络验证系统,配合PHP作为后端服务器处理数据的项目。这个系统可能涉及到用户登录验证、权限控制以及与前端交互等功能。 首先,...