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 ...
随机推荐
- 原生javaScript导出表格数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- zt:HttpUrlConnection使用详解
下文转载自:https://www.cnblogs.com/tenWood/p/8563617.html 一,HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一 ...
- Redis Sentinel结构 及相关文档
Redis Sentinel是一个用来监控redis集群中节点的状态,不用来存储数据.当集群中的某个节点有故障时,可以自动的进行故障转移的操作.通常为了保证sentinel的高可用,sentinel也 ...
- 为什么互联网巨头们纷纷使用Git而放弃SVN?(内含Git核心命令与原理总结)
写在前面 最近发现很多小伙伴对于工作中的一些基本工具的使用还不是很了解,比如:Git这个分布式的代码管理仓库,很多小伙伴就不是很了解,或者说不是很熟悉.甚至有些小伙伴都没听说过Git,就只会用个SVN ...
- DevOps-实践心得
基于最近几年从事与DevOps的相关实践,对这篇文章的观点深有体会,所以记录在这里.加粗部分是我比较深有体会的,但是对于最后作者对于"运维"有些悲观,我有点不敢苟同,反而对于运维的 ...
- case实现shell菜单功能
#!/bin/sh#Shell菜单演示function menu (){ cat << EOF----------------------------------------|****** ...
- [LeetCode] 448. 找到所有数组中消失的数字(思维)
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...
- JVM运行时数据区--方法区
运行时数据区结构图(温习): 堆.栈.方法区的交互关系 方法区的理解 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存 ...
- 微信小程序入门到精通[更新版]
微信小程序账号与工具 在线文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发者账号注册 微信公众平台:https://mp.weixin.qq.co ...
- if-else 条件语句
1. 条件语句模型 Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: if - else 条件语句 switch - case 选择语句 for - range 循环语句 goto 无条件跳 ...