lua 源码阅读 1.1 -> 2.1
lua 1.1 阅读
1. hash.c 中
a) 对建立的 Hash *array 用 listhead 链式结构来管理,新增lua_hashcollector,用来做 Hash 的回收处理。
ps: 1.0 用的是个 512 的数组,用一个少一个
b) Hash *lua_createarray (int nhash) 中新增阀值,用来控制何时进行内存回收
4.3 lua 2.1 阅读
1. static TreeNode *tree_next (TreeNode *node, char *str) 的代码的简单化
2. 常量数组还是常量数组,但是结构变了
3. 符号数组演化成了还是一个普通数组,这块很有意思,构造是去常量树中确认符号名,原来的 name 字段不用了。
luaI_findsymbol 中做了很多事, node 如果是新的,就加入数组中,之后和正常情况一样返数组下标, 这块用数组和常量树来构造符号表。
lua_constcreate(name) : constant_root 树中遍历,如果没,就加进去,之后返回节点
luaI_findsymbol(TreeNode* t) : 常量树中的节点,如果是新的节点,就要在符号表中加入一条记录,节点记录符号表中的index,这样查找时检索的是常量树
4. stringbuffer 由数组变成链式结构, 这个主要在 lua 要存一个 string 的时候要调用, 比如 contact, lua_tostring, lua_pushstring。
5. Hash 表链不再使用,1.1 也只是保留
v1.1
extern Hash **lua_array;
extern Word lua_narray;
6. lock 是一个数组标识,lua 的源码都是动态扩
7. hash 也做了变迁,由数组变成 list
1.1 | 2.1 |
typedef struct node
{
Object ref;
Object val;
struct node *next;
} Node;
typedef struct Hash
{
char mark;
unsigned int nhash;
Node **list;
} Hash;
|
typedef struct node
{
Object ref;
Object val;
} Node;
typedef struct Hash
{
struct Hash *next;
char mark;
Word nhash; /* node 的指向的个数,这个申请时是个柔性的,根据一个数组 */
Word nuse;
Node *node;
} Hash;
|
8. lua 的异常处理
设置了一点回归点,异常就跳过去
jup_buf *errorJmp;
setjmp + longjmp 来实现
9. 关于 lockArray
目前应该是没完全看明白,代码中就是把一个对象压入栈和 lockArray 中(对象的 tag 不能为 LUA_T_NIL), 而 lua_unlock 就是把 lockArray[index].tag 置 为 LUA_T_NIL
v2.1 的代码调动只是在回调中把 old_pow 作为 lockArray 的索引来传递
10. 官方 readme 变更说明
* Changes since version 1.1 (current version is 2.1)
+ object-oriented support;
+ fallbacks;
+ simplified syntax for tables;
+ many internal improvements.
ps: 因为面向对象编程自己一直没怎么写过,只有一点概念,封装,继承,多态。
封装比较好理解,就是把成员和一些方法整合到一个内存块中
继承:: objA : objB, A 中有个base 指针指向B
多态: 不同的对象有唯一的标识,当访问某个方法时,会找到对象真实的方法,结构可以用 hash 来存储
2.1 的代码没看到有对 对象相关的操作
lua 源码阅读 1.1 -> 2.1的更多相关文章
- lua 源码阅读 5.3.5 笔记
记录下吧,断断续续读了几周,收益还是很多的. 推荐阅读顺序: 1) 基础数据类型 lstring.c ltable.c lobject.c lfunc.c lstate.c 2) 标准库(这个相对简 ...
- lua 源码阅读顺序
https://www.reddit.com/comments/63hth/ask_reddit_which_oss_codebases_out_there_are_so/c02pxbp Online ...
- cpython和lua源码阅读
cpython代码很多,不太容易看出来. lua代码真的短小精悍,不得不佩服.
- skynet源码阅读<1>--lua与c的基本交互
阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex ...
- Redis源码阅读(一)事件机制
Redis源码阅读(一)事件机制 Redis作为一款NoSQL非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存.分布式数据库.消息队列等应用.此外Redis还有许多高可 ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
随机推荐
- 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~
前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...
- 如何解决SpringBoot工程中的错误:java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
出错原因:MySQL依赖及MySQL驱动包高于在使用的MySQL数据库版本. 比如,我本地数据库版本是:Server version: 5.2.3-falcon-alpha-community-nt ...
- Live a "love to" life,not a "have to" life.
过想要的生活,而不是没有选择性的生活.
- 用Nginx将web请求引导到本机两个tomcat
如何在本机启动两个tomcat请参考:https://www.cnblogs.com/xiandedanteng/p/12100461.html 而Nginx这边,将\conf\nginx.conf ...
- 详解JVM中的内存模型是什么?
强烈推荐 不管是找工作还是提升水平,都建议读一下<深入理解Java虚拟机>这本书,详细讲解了JVM中的内存管理.类加载过程.垃圾回收以及最重要的性能调优实战. 本博客也是参考了这本书,有不 ...
- python 3 break 循环控制
人类的本质是一个复读机
- ulimit 的认识
原文出自 通过 ulimit 改善系统性能 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时 ...
- JavaScript 流程控制-循环
1.循环 循环目的 在实际问题中,有许多具有规律性的重复操作,因此在程序中要完成这类操作就需要重复执行某些语句 JS中的循环 在JS中,主要有三种类型的循环语句: for循环 while循环 do.. ...
- vue-router-next 通过hash模式访问页面不生效,直接刷新页面一直停留在根路由界面的解决办法
vue3中,配合的vueRouter版本更改为vue-router-next通过 npm i vue-router@next 的方式进行引入添加,随后创建 router.js,在main.js里面引入 ...
- python-字符串,字典,列表
0x01 字符串 python单双引号都可以 str = "hello world" str_test = "yicunyiye" print(str,str_ ...