LUA upvalues】的更多相关文章

1 upvalue概念 upvalue:嵌套函数的外部函数的局部变量 function func(a) <== 这个函数返回值是一个函数 return function () a = a + 1    <== 这里可以访问外部函数func的局部变量a,这个变量a就是upvalue return a end end func返回一个匿名函数,可用变量接取之.该匿名函数有一个upvalue a(有点像C函数的static变量),初值为首次调用func时的参数 2 closure概念: closur…
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a", "b" foo = a 生成的字节码如下所示: 之前lua是在luaY_parser函数(入口)中完成了lua脚本的解析生成字节码的整个过程的,在生成了main func(过程见“lua解析赋值类型代码的过程“)后luaY_parser会返回一个Proto结构体指针tf,Pr…
在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.lobject.h和lopcode.h. 在llex.h中 typedef struct Token { int token; SemInfo seminfo; } Token; Token代表了一个词法单元,其中token表示词法类型如TK_NAME.TK_NUMBER等如果不是这些类型则存放则词素…
string库提供了字符串处理的通用函数. 例如字符串查找.子串.模式匹配等. 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 ). 索引可以是负数,它指从字符串末尾反向解析. 即,最后一个字符在 -1 位置处,等等. 字符串库中的所有函数都在表string 中. 它还将其设置为字符串元表的__index 域. 因此,你可以以面向对象的形式使用字符串函数. 例如,string.byte(s,i) 可以写成 s:byte(i). 字符串库假定采用单字节字符编码…
Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  读写Lua全局变量的函数: 2.  调用Lua函数的函数: 3.  运行Lua代码片段的函数: 4.  注册C函数后可以在Lua中被调用的函数: 在C和LUA之间交互的关键在于一个虚拟栈(virtual stack),数据交互通过栈进行.操作数据时,首先将数据拷贝到栈上,然后获取数据,栈中的每个数据…
Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingnow.com Copyright © 2006 Lua.org, PUC-Rio. All rights reserved. 1 - 介绍 Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施. Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持.…
C函数可以通过堆栈来和Lua交换数据,但有时候C函数需要在函数体的作用域之外保存某些Lua数据,那么我们想到全局变量或static变量,这样做的缺点是:(1)为Lua设计C函数库时,导致不可重入:(2)不是所有的Lua值都能很好的保存到C变量中.那么可不可以将值保存在Lua全局变量里面呢,可以,Lua就提供了一个独立的被称为registry的表,但是Lua代码本身不能访问它. 1.registry全局注册表 解释:一个普通的Lua表,使用假索引(pseudo-index)LUA_REGISTRY…
Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int…
局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处理) 这样,可以在chunk内部声明局部函数,该函数仅在chunk内可见,并且词法定界保证了包内其他函数可以调用此函数.  在chunk内部定义多个local function并且相互调用(或定义local递归调用函数)时,最好先声明,再定义. 应该尽可能的使用局部变量(使用关键词local声明的变…
Lua函数之二 Lua中函数的两个重要特性: 1.函数和其他类型(如number.string)一样,可以存放在变量中,也可以存放在table中,可以作为函数的参数,还可以作为函数的返回值. 2.嵌套的函数可以访问其外部函数中的局部变量——闭包. 例如: end -- 函数构造式 end -- 函数定义 第1种方法创建一个函数,并赋一个变量: 第2种方法其实是一种特例. 1.非全局函数 Lua中的函数可以作为全局变量,也可以作为局部变量. 将函数保存在一个局部变量时,得到一个局部函数: loca…
转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间翻译了lua官方关于lua5架构设计的一份文档,现在分享给大家. 注意:所有版权都归lua官方所有,本人仅将其翻译为中文,以方便中文阅读者.翻译中出现任何错误导致的结果,本人不负任何责任. 如果有任何翻译错误,以及意见与建议,请email本人.邮件地址:ice_ok@163.com. 转载请注明原作…
Lua模拟器js方案 1.语法级模拟lua与js语言差异 1.1注释 js 为//,lua为--. 1.2变量js利用val来声明全局变量不存在局部变量,lua则不需要直接定位则为全局变量,local声明则为局部变量. 1.3运算符js + - * / % ++ --= += -= *= /= %=支持字符串 +txt1 = "what a very";txt2 = "nice day";txt3 =txt1 " " +txt2;打印txt3输出…
最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定.经过简单分析之后,确定是线程同步的问题.于是便修改了线程通信的代码,并使用pthread_mutex_lock/unlock来防止冲突.重新编译后,崩溃频率有所减少.但是每运行约四十次,还是免不了崩溃一次,而且冷启动时崩溃概率更大. 在VC中的Release版本中设置Generate Debug Info后,重复多次运行程序…
局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处理) 这样,可以在chunk内部声明局部函数,该函数仅在chunk内可见,并且词法定界保证了包内其他函数可以调用此函数.  在chunk内部定义多个local function并且相互调用(或定义local递归调用函数)时,最好先声明,再定义. 应该尽可能的使用局部变量(使用关键词local声明的变…
很早的时候,我有一件事纠结.如果,我在这里C++打开界面脚本.使用C++其中一个目标,和.我的程序有很多不同的lua虚拟机.每个虚拟机与一个关联C++对象,它是多线程,那么如何快速应利用这个好时机lua_State针来定位到对象指针呢? 曾经我没有能力读懂lua的源代码,也能够说不知道关键部分怎样操作,我当时的做法.是利用临界区和std::map来解决这个问题的.非常明显这个方式的效率非常低非常低. 如今有能力读lua源代码了.当然有更有效的解决的方法了.由于在我们利用lua的过程中.lua_S…
Lua与javascript的差异 2010-03-08 Lua模拟器js方案 1.语法级模拟 lua与js语言差异 1.1注释 js 为//,lua为--. 1.2变量 js利用var来声明全局变量不存在局部变量,lua则不需要直接定位则为全局变量,local声明则为局部变量. 1.3运算符 js + - * / % ++ -- = += -= *= /= %= 支持字符串 + txt1 = "what a very"; txt2 = "nice day"; tx…
Lua的函数调用和协程中,栈的变化情况 1. lua_call / lua_pcall   对于这两个函数,对栈底是没有影响的--调用的时候,参数会被从栈中移除,当函数返 回的时候,其返回值会从函数处开始压入,可以通过新的栈顶减去旧的栈顶得到返回值数 量.   2. lua_yield   对 Lua 函数来说, yield相当于只是在调用一个函数,对C函数也是这样.yield的参数 是返回值的数量,这些返回值会被返回给resume,见下.   2. lua_resume   resume是最复…
紧接着上一篇文章zblade:深入探究Lua的GC算法(上)-<Lua设计与实现> 这篇文章让我们收尾GC的具体后续操作.转载请标明出处:http://www.cnblogs.com/zblade/ 3.GC的扫描阶段 GCSpropagate 只要处于这个阶段,就会分2种情况执行,一个是propagatemark,一个是atomic,让我们分别看其实现过程. 首先看处于灰色链表中一直都有对象的情况,在这步操作当中,是可以分步操作的,整个GC的分步操作,就是在这一步操作中,在每次扫描后,都会返…
一.什么是lua&luaJit lua(www.lua.org)其实就是为了嵌入其它应用程序而开发的一个脚本语言, luajit(www.luajit.org)是lua的一个Just-In-Time也就是运行时编译器,也可以说是lua的一个高效版. 二.优势 1)lua是一个免费.小巧.简单.强大.高效.轻量级的嵌入式的脚本语言,lua当前的发行版本5.3.1只有276k. 2)它是用C语言开发的项目,所以可以在大部分的操作系统上运行 3)lua是目前速度最快的脚本语言,既可以提升语言的灵活性还…
lua_State 中放的是 lua 虚拟机中的环境表.注册表.运行堆栈.虚拟机的上下文等数据. 从一个主线程(特指 lua 虚拟机中的线程,即 coroutine)中创建出来的新的 lua_State 会共享大部分数据,但会拥有一个独立的运行堆栈.所以一个线程对象拥有一个lua_State. (ps:lua 的coroutine的使用参考: http://blog.csdn.NET/wusheng520/article/details/7954666) lua_State共享的数据部分是全局状…
为了实现Lua和其他语言之间的通信,Lua虚拟机为C/C++提供了两个特性: Lua_State状态机 lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.Lua虚拟机通过维护这样一个虚拟栈来实现两种之间的通信,lua_State定义如下: struct lua_State { CommonHeader; lu_byte status; StkId top; /* first free slot in the stack */ global_State…
lua作为脚本于要能够使用宿主语言的类型,不管是宿主基本的或者扩展的类型结构,所以Lua提供的UserData来满足扩展的需求.在Lua中使用宿主语言的类型至少要考虑到几个方面: 数据内存 生命周期 数据操作 下面的内容主要参考<Lua程序设计>,数据保存在Lua堆栈中,通过Metatable对数据进行操作,并通过Lua的Gc进行回收内存. 1 Full UserData void *lua_newuserdata (lua_State *L, size_t size); This funct…
lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈也都是存在c语言中的一个叫lua_State的结构体中的. 举个例子,来看下lua中的加指令 OP_ADD a b c 是如何实现的: lua在运行时,会在c语言中的一个叫luaV_excute的函数中不断执行翻译后的lua指令,OP_ADD就是其中的一条指令(luaV_excute函数太长了,所以…
前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – 函数的结构.函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实现这种函数的. 在脚本世界里,相信闭包这个词大家也不陌生,闭包是由函数与其相关引用环境组成的实体.可能有点抽象,下面详细说明: 一. 闭包的组成 闭包主要由以下2个元素组成: 函数原型:上图意在表明是一段可执行代码.在Lua中可以是lua_CFunction,也可以是lua自身的虚拟机指令. 上下文…
替同事做了个洛奇英雄传自动染色程序,关于屏幕取色的. 因为里面他对颜色的要求比较复杂,改动也比较大,于是我让他把逻辑写在 lua 脚本里面. uses LUA, LUALIB; function lua_CheckColor(r,g,b:Integer):Boolean; var Lua : TLua; begin Lua := TLua.Create; luaopen_debug(LuaInstance); //如果要使用debug库 //  luaopen_io(LuaInstance);…
Lua 调试库 http://blog.csdn.net/vermilliontear/article/details/50851045 http://blog.csdn.net/vermilliontear/article/details/50865156 Q:什么是活动函数? A:程序中被调用但还未执行完成的函数. function g() --[[ 此时函数"g"被调用但还未执行完成,是活动函数.所以这里获取的是函数"g"的信息. "debug.ge…
在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.lobject.h和lopcode.h. 在llex.h中 1 typedef struct Token { 2 int token; 3 SemInfo seminfo; 4 } Token; Token代表了一个词法单元,其中token表示词法类型如TK_NAME.TK_NUMBER等如果不是这些…
本文选自:http://www.cnblogs.com/nazhizq/p/6516561.html 一步步调试,在lparser.c文件中luaY_parser函数是语法分析的重点函数,词法分析也是在这个过程中调用的.在这个过程中,用到一些数据结构,下面会详细说. Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { struct LexState lexstate; struct FuncSt…
上一篇编辑编辑着,发现,缩进出了问题.作为一个不是强迫症的人,实在是忍受不了同一级内容不同缩进方式的槽点,于是重开一篇吧.(万幸,这样的文章也只有我自己看.) 第四 基本语法 赋值语句,Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量. a, b = , *x <--> a=; b=*x 遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值: x, y = y, x -- swap 'x' for '…
FuncState proto结构数组保存函数原型信息;prev保存父函数体指针:actvar保存定义的局部变量:upvalues保存upvalue Lua源码中,专门有一个结构体FuncState用来保存函数相关的信息.其实,即使没有创建任何函数,对于Lua而言也有一个最外层的FuncState数据.这个结构体的定义: typedef struct FuncState { Proto *f; /* current function header */ Table *h; /* table to…