zoukankan      html  css  js  c++  java
  • luars232库中用到的一些C API for lua

    代码就不贴了,这里只是梳理一下前两篇里面忽略的一些东西,作为读代码的记录吧。

    1、头文件

    #include <lauxlib.h>
    #include <lua.h>

    All API functions and related types and constants are declared in the header file “lua.h”。

    The auxiliary library provides several convenient functions to interface C with Lua. While the basic API provides the primitive functions for all interactions between C and Lua, the auxiliary library provides higher-level functions for some common tasks. All functions from the auxiliary library are defined in header file lauxlib.h and have a prefix luaL_.

    2、void *lua_newuserdata (lua_State *L, size_t size)。

    首先我们需要知道一下什么叫userdata?额,我的理解,C里面的所有数据类型,在lua中只有一个名字userdata。事实上,这里只是一块内存而已。如果还记得lightuserdata的话,也应该记得,这个是一个指针。

    lua_newuserdata这个调用是申请了一块大小为size的内存,然后返回指向这块userdata的一个指针(void型),指针指向这块空间首地址;同时往堆上push一个userdata类型element。

    lua并不能理解userdata,不能对其内容进行运算等操作。所以,使用userdata,我们还需要添加相关的操作方法,另外,new出来的userdata,还需要给他添加gc元方法供lua收回释放。

    至于什么时候userdata会被gc收回。。。唔,我找了半天没明确答案,或是可信答案,也暂时不想翻代码,不过有人说是这样的:gc假设所有的userdata都是需要结束的,然后开始找它指向的根对象是否有效(至于怎么个有效法暂时未知),如果无效则回收userdata的空间。

    追了一下这里的调用情形:

    1)我们在L中new出来一个size为指针类型的空间,它的值是dll返回来的一个地址,由指针p带回来这个地址;如此,在堆顶有一个userdata类型的element。这里不需要我们再pushinteger到lua。

    2)给这个element设置metatable。

    3)metatable.__gc()中是通过调用dll里操作来实现的。直接调用dll里面的方法,free(p)。如此就完成了这个gc。

    3、int luaL_optint (lua_State *L, int narg, int d)

    检查narg,如果是一个number,那么返回一个int类型的数;如果是nil,或者是没有,那么返回参数d。没想明白这个是用来干嘛的,待了解。

    4、没有4了居然,好吧,草草的把这个wrapper看了一遍。

  • 相关阅读:
    实验综合-2021.1.31
    利用文件上传漏洞远程控制服务器
    [转载]文件上传漏洞
    第五周学习视频(二)
    第五周学习视频(一)
    第四周——上课笔记(二)
    第四周——上课笔记(一)
    第四周学习视频(一)
    mooc视频笔记(哈工大)第4讲-关系模型之关系代数
    第三周学习视频(二)
  • 原文地址:https://www.cnblogs.com/pied/p/3164070.html
Copyright © 2011-2022 走看看