lua5.4源码阅读—数据类型(代码片段)

xhjh xhjh     2022-12-12     270

关键词:

Lua数据类型

基础的数据类型宏定义:

#define LUA_TNONE		    (-1)    //无效类型
	
#define LUA_TNIL		    0       //空类型
#define LUA_TBOOLEAN		1       //布尔
#define LUA_TLIGHTUSERDATA	2       //指针(lua外部管理内存)
#define LUA_TNUMBER		    3       //数据
#define LUA_TSTRING			4   	//字符串,这和后面的类型都需要GC,这些类型最开始都会有一个CommonHeader宏定义的成员
#define LUA_TTABLE		    5       //表
#define LUA_TFUNCTION		6       //函数
#define LUA_TUSERDATA		7       //指针
#define LUA_TTHREAD		    8       //lua虚拟机、协程
#define LUA_NUMTYPES		9       //类型数量

Lua内部通过一个宏表示哪些数据需要GC,老版本是通过数据类型是否大于等于LUA_TSTRING来判断,当前版本为Lua5.4.3则通过在类型中加入标志位的形式判断,例如:

//类型字段中的标志位
#define BIT_ISCOLLECTABLE	(1 << 6)
#define iscollectable(o)	(rawtt(o) & BIT_ISCOLLECTABLE)

需要进行GC的数据类型的结构体中最开始都会有一个CommonHeader宏定义的成员:

//next:指向下一个GC对象,tt:数据类型,marked:GC标志位
#define CommonHeader	struct GCObject *next; lu_byte tt; lu_byte marked

GCObject结构体的定义为只包含一个CommonHeader宏定义的成员:

typedef struct GCObject 
  CommonHeader;
 GCObject;

通过定义一个GCUnion联合体将所有需要GC的数据类型包括起来:

union GCUnion 
  GCObject gc;  /* common header */
  struct TString ts;
  struct Udata u;
  union Closure cl;
  struct Table h;
  struct Proto p;
  struct lua_State th;  /* thread */
  struct UpVal upv;
;

需要进行GC的数据类型,则需以CommonHeader作为结构体定义的最开始部分,例如C++类的实现原理,CommonHeader可以理解为一个基类的所有成员,而其他需要GC的数据类型均从这个基类继承。
表示所有数据的联合体Value:

typedef union Value 
  struct GCObject *gc;    /* 回收对象 */
  void *p;         /* 指针 */
  lua_CFunction f; /* C函数 */
  lua_Integer i;   /* 整数 */
  lua_Number n;    /* 浮点数 */
 Value;

联合体Value和类型相结合则可以表示所有数据类型:

#define TValuefields	Value value_; lu_byte tt_

typedef struct TValue 
  TValuefields;
 TValue;

通用数据结构的组织如图:

java——底层源码阅读——包装数据类型integer.valueof()自动装箱方法底层源码分析(代码片段)

JAVA——底层源码阅读——包装数据类型Integer.valueOf自动装箱方法底层源码分析一、提出问题二、查看源码方法途径1、查看本地文件(不推荐)途径2、在编辑器里查看jdk源码(推荐)三、查看Integer源码步骤1、新建java... 查看详情

go源码阅读——type.go(代码片段)

【博文目录>>>】【项目地址>>>】基本结构图reflect包基础类型是Type,其主要实现是rtype,在rtype下会有基于种类型的实现,主要结构图。基本常量数据类型常量typeKinduintconst( InvalidKind=iota Bool Int Int8 Int16 ... 查看详情

mybatis源码阅读:mybatis基础模块-类型转换模块(代码片段)

...以我们来看下在MyBatis中是如何实现类型的转换的。二、源码阅读(一)TypeHandlerMyBatis中的所有的类型转换器都继承了TypeHandler接口,在TypeHandler中定义了类型转换器的最基本的功能。/***@authorClintonBegin*/publicinterfaceTy... 查看详情

go源码阅读——type.go(代码片段)

【博文目录>>>】【项目地址>>>】基本结构图reflect包基础类型是Type,其主要实现是rtype,在rtype下会有基于种类型的实现,主要结构图。基本常量数据类型常量typeKinduintconst( InvalidKind=iota Bool Int Int8 Int16 ... 查看详情

xmakev2.6.1发布,使用lua5.4运行时,rust和c++混合编译支持(代码片段)

...,方便快速内嵌编译后的.spv文件数据到代码中。项目源码官方文档入门课程新特性介绍默认切换到Lua5.4运行时历经几个版本的迭代测试,我们在2.6.1版本,正式切换到Lua5.4运行时。不过,这对于用户来说是完全无... 查看详情

xmakev2.6.1发布,使用lua5.4运行时,rust和c++混合编译支持(代码片段)

...,方便快速内嵌编译后的.spv文件数据到代码中。项目源码官方文档入门课程新特性介绍默认切换到Lua5.4运行时历经几个版本的迭代测试,我们在2.6.1版本,正式切换到Lua5.4运行时。不过,这对于用户来说是完全无... 查看详情

caffe源码阅读卷积层(代码片段)

背景:项目中需要在caffe中增加binaryconvolutionlayer,所以在单步调试了minist的训练,大致看了一下流程,就详细看convolutionlayer了。1、数据结构  caffe的基本数据结构是Blob,也就是数据流的基本结构。2、网络结构  Net是Layer构... 查看详情

superset:源码阅读(代码片段)

viz.py最后一段代码,获取所有添加的图表类importinspect#所有图表的基类importBaseViz#全局变量globals()当前文件中所有信息,字典类型;包含有类,变量。。。#获取当前文件中所有的类对象的viz_type属性viz_line_list=o.viz_type:oforoinglobals()... 查看详情

源码系列java中的数据结构——数组与arraylist(代码片段)

...加删除数组元素操作比较繁琐三、Java中的封装类ArrayList源码阅读1.源码阅读的方式2.ArrayList源码之旅2.1“迷宫地图”2.2属性字段2.3常用方法 查看详情

zookeeper源码阅读数据存储-日志(代码片段)

前言接着上篇的内容,上一篇主要说了下Zookeeper内部的数据存储基本单位datanode和内存中维护的Datatree,还有和配额有关的三个实体类。具体在zk初始化时是怎么生成datatree等等后面会说。这一篇主要说下事务日志,后面也有用到... 查看详情

golangchannel源码阅读(代码片段)

...t;,例如之前小编一直以为channel是保证顺序的,但是看过源码之后才发现channel数据接收的顺序完 查看详情

spark源码阅读--shuffle读过程源码分析(代码片段)

shuffle读过程源码分析上一篇中,我们分析了shuffle在map阶段的写过程。简单回顾一下,主要是将ShuffleMapTask计算的结果数据在内存中按照分区和key进行排序,过程中由于内存限制会溢写出多个磁盘文件,最后会对所有的文件和内... 查看详情

ticdc源码阅读ticdc架构概览(代码片段)

这一次TiCDC阅读系列文章将会从源码层面来讲解TiCDC的基本原理,希望能够帮助读者深入地了解TiCDC。本篇文章是这一系列文章的第一期,主要叙述了TiCDC的目的、架构和数据同步链路,旨在让读者能够初步了解TiCDCÿ... 查看详情

ticdc源码阅读tikvcdc模块介绍(代码片段)

...数据解析为有序的行级变更数据输出到下游。本文是TiCDC源码解读的第二篇,将于大家介绍TiCDC的重要组成部分,TiKV中的CDC模块。我们会围绕4个问题和2个目标展开。TiKV中的CDC模块是什么?TiKV如何输出数据变更事件 查看详情

mmdetection源码阅读笔记(代码片段)

...组件RunnerMMCV/runner代码实现HookMMDet工作需要简单看了一下源码,主要侧重训练和推理的部分,涉及到的是Registry、Runner和Hook部分。核心库核心库有MMDetection、MMSegmentation、MMDetection3d、MMCV。MMDetection3d:支持3d目标检测的模型和数据集... 查看详情

以太坊源码阅读transaction(交易模块)(代码片段)

Transaction数据结构Transaction位于:./core/types/transaction.go//TransactionisanEthereumtransaction.typeTransactionstruct innerTxData//Consensuscontentsofatransaction timetime.Time//Timefirstseenloca 查看详情

javajdk源码阅读指导记录(代码片段)

JDK源码毕竟太庞大了,所有都看不太现实,我们还是愿意根据日常使用和面试考察的频繁度来挖取重要的内容先看一看。如果自己没有特别的规划,可以按照如下所示的建议阅读顺序往下进行:具体的内容简介如... 查看详情

学会阅读别人的源码(代码片段)

学会阅读别人的源码找预览运行效果下载(用idea拉取代码)看运行安装数据库安装前端依赖后端maven更换等分析架构Run一下启动前端前后端分离项目的套路如何找到一个好的开源项目giteegithub找预览运行效果下载(用i... 查看详情