lua.5.2.3源码阅读(01):文件读取相关

Lua在载入lua文件的时候,读取过程中通过cache的方式,默认cache为512字节:

1、cache中包含数据时,直接将cache中数据返回;

2、cache中不包含数据的时候,每次读取512个字节,进行cache;

 1 typedef struct LoadF {
 2   int n;  /* number of pre-read characters */
 3   FILE *f;  /* file being read */
 4   char buff[LUAL_BUFFERSIZE];  /* area for reading file */
 5 } LoadF;
 6
 7
 8 static const char *getF (lua_State *L, void *ud, size_t *size) {
 9   LoadF *lf = (LoadF *)ud;
10   (void)L;  /* not used */
11   if (lf->n > 0) {  /* are there pre-read characters to be read? */
12     *size = lf->n;  /* return them (chars already in buffer) */
13     lf->n = 0;  /* no more pre-read characters */
14   }
15   else {  /* read a block from file */
16     /* ‘fread‘ can return > 0 *and* set the EOF flag. If next call to
17        ‘getF‘ called ‘fread‘, it might still wait for user input.
18        The next check avoids this problem. */
19     if (feof(lf->f)) return NULL;
20     *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);  /* read block */
21   }
22   return lf->buff;
23 }

在载入lua文件,进行解析文件时:

 1 static void f_parser (lua_State *L, void *ud) {
 2   int i;
 3   Closure *cl;
 4   struct SParser *p = cast(struct SParser *, ud);
 5   int c = zgetc(p->z);  /* read first character */
 6 .....
 7 }
 8
 9 #define zgetc(z)  (((z)->n--)>0 ?  cast_uchar(*(z)->p++) : luaZ_fill(z))
10
11 struct Zio {
12   size_t n;            /* bytes still unread */
13   const char *p;        /* current position in buffer */
14   lua_Reader reader;        /* reader function */
15   void* data;            /* additional data */
16   lua_State *L;            /* Lua state (for reader) */
17 };
18
19 int luaZ_fill (ZIO *z) {
20   size_t size;
21   lua_State *L = z->L;
22   const char *buff;
23   lua_unlock(L);
24   buff = z->reader(L, z->data, &size);
25   lua_lock(L);
26   if (buff == NULL || size == 0)
27     return EOZ;
28   z->n = size - 1;  /* discount char being returned */
29   z->p = buff;
30   return cast_uchar(*(z->p++));
31 }
lua_Reader reader在初始化是设置为getF,解析过程中采用cache的方式读取lua文件。
时间: 2024-07-29 07:21:33

lua.5.2.3源码阅读(01):文件读取相关的相关文章

【spring】spring源码阅读之xml读取、bean注入(BeanFactory)

前言 此源码其实是在4月中旬就看了,而且当初也写了一份word文档,但不打算直接把word发上来.还是跟着以前的笔记.跟踪代码边看边写吧. 其实当初看源码的理由很简单,1.才进新公司,比较有空闲.2.面试老是问spring的问题,我理论又不好,所以想看下. 但现在,我重新看的目的其实不在于其实现原理,而是想学习和写出好的编码风格.(当初大概花了1周看,记得那时把看到的都理解深刻了,但现在基本不记得什么了.毕竟开发用不到) 一.如何开始阅读源码? 最初我也一头雾水,不知道从哪开始看.怎么看.看源码

lua.5.2.3源码阅读(03):通用变量

lua的堆栈中存放的是通用变量,通用变量实际上就是一个union内存块,根据不同的类型,采用不同的组织方式, 看一下通用类型的相关定义,截取了lobject.h相关代码,从代码上看,不太清楚numfield为什么会有两个相关定义. 堆栈中可以根据情况分为一下几种类型: 1.双精度浮点数:double d__; 2.复合类型,通过tt__来表示类型: 3.复合类型中分为两种:可回收类型和不可回收类型: 4.可回收类型可以是:TString.Udata.Closure.Table.Proto.UpV

lua.5.2.3源码阅读(02):字符串对象

lua中的字符串是对象,主要分析一下对象的结构和申请的方式. TString是一个union,为了进行字节对齐,中间插入了L_Umaxalign,按照union的定义 union的大小,必须是单个结构大小的整数倍,按照目前的定义,应该是double大小的整数倍. 1 /* type to ensure maximum alignment */ 2 #if !defined(LUAI_USER_ALIGNMENT_T) 3 #define LUAI_USER_ALIGNMENT_T union {

lua.5.2.3源码阅读(04):Table结构基本操作

table(lobject.h)的结构定义: 1 // TKey结构是一个链表结构,用来存储hash相同 2 // 的所有key,value对结构. 3 typedef union TKey { 4 struct { 5 TValuefields; // key值 6 struct Node *next; // 指向像一个相同hash值的key值: 7 } nk; 8 TValue tvk; //尾部的key值: 9 } TKey; 10 11 // (key,value)对结构,通过key计算

JDK部分源码阅读与理解

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK代码什么的,让整篇文章很乱...JDK源码谁都有,没什么好贴的...如果你没看过JDK源码,建议打开Eclipse边看源码边看这篇文章,看过的可以把这篇文章当成是知识点备忘录... JDK容器类中有大量的空指针.数组越界.状态异常等异常处理,这些不是重点,我们关注的应该是它的一些底层的具体实现,这篇

cocos2d-x 3.1.1源码阅读过程的注释

cocos2d-x 3.1.1源码阅读过程的注释 印象笔记链接:http://app.yinxiang.com/l/AAU8F1mKiN9BIqFopReAU3ZbTcgGOULycQo/ Ref 每个类的基类是Ref   也就是2.0的CCObject 调用继承下来的下面的那个函数 class CC_DLL Ref { public: /** 引用计数+1 */ void retain(); { CCASSERT(_referenceCount > 0, "reference count

Nutch源码阅读进程1---inject

最近在Ubuntu下配置好了nutch和solr的环境,也用nutch爬取了一些网页,通过solr界面呈现,也过了一把自己建立小搜索引擎的瘾,现在该静下心来好好看看nutch的源码了,先从Inject开始吧~~~ 1.从crawl.java的main函数进入,执行: Configuration conf = NutchConfiguration.create(): 再进入NutchConfiguration(NutchConfiguration负责加载管理nutch的配置文件信息,该类继承自Co

android插件化-apkplugdemo源码阅读指南-10

阅读本节内容前可先了解 apkplug基础教程 本教程是基于apkplug V1.6.8 版本编写  最新开发方式以官网为准 可下载最新的apkplugdemo源码http://git.oschina.net/plug/apkplugDemos apkplugdemo演示图 一 apkplugdemo工程源码结构 src |-com.apkplugdemo.adapter             --插件列表Adapter |-com.apkplugdemo.adapter.base     

Mac搭建Hadoop源码阅读环境

1.本次Hadoop源码阅读环境使用的阅读工具是idea,Hadoop版本是2.7.3.需要安装的工具包括idea.jdk.maven.protobuf等 2.jdk,使用的版本是1.8版,在jdk官网下载jdk-8u111-macosx-x64.dmg,点击安装,一路next. 3.idea安装,略 4.maven,使用的版本是3.3.9,下载apache-maven-3.3.9-bin.tar,解压: tar -zxvf  apache-maven-3.3.9-bin.tar 进入 Mave