游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2299|回复: 0

lua脚本简单分析(1)

[复制链接]

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2008-4-16 14:32:00 | 显示全部楼层 |阅读模式

更多文章在http://user.qzone.qq.com/109339129/blog/1208322250
      最近在研究lua脚本,一开始学的倒挺快,后来发现自己没有真的理解,于是看了一点点lua的源码,清晰多了,下面以例子来分析下,以下c程序执行后,lua的内存变化,以便能更深入的理解lua.
     lua脚本
      f("how", t.x, 14);
     这里是 C 里的代码:
     开始的内存布局
-1   |................| top            
     |............... |
     |LUA_GLOBALSINDEX|   -->此是个table 并保存有哈希表,哈希表中根据字符串来哈希此表的内容


    lua_getfield(L, LUA_GLOBALSINDEX, "f");          /* 将调用的函数 */
     从LUA_GLOBALSINDEX处的哈希表从查找,"f"所对应的object*结构,并把它置顶。
     执行完后的内存布局
-1  |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()
   
     lua_pushstring(L, "how");                          /* 第一个参数 */
-1   |  "how"         |      创建一新的object,并存字符串进去。
-2   |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()


     lua_getfield(L, LUA_GLOBALSINDEX, "t");          /* table 的索引 */
     从LUA_GLOBALSINDEX处的哈希表从查找,"t"所对应的object*结构,并把它置顶。
-1   |"t"的object*结构|       因为"t"对应一张表,所以也有哈希表保存成员--->哈希表()
-2   |  "how"         |       创建一新的object,并存字符串进去。
-3   |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()

     lua_getfield(L, -1, "x");         /* 压入 t.x 的值(第 2 个参数)*/
-1   |"x"的object*结构|    从位置为-1的表(表"t")的哈希表中寻找"x"对应的object*结构,并把它置顶。
-2   |"t"的object*结构|      因为"t"对应一张表,所以也有哈希表保存成员--->哈希表()
-3   |  "how"         |      创建一新的object,并存字符串进去。
-4   |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()

     lua_remove(L, -2);                           /* 从堆栈中移去 't' ,也就是  -2的位置*/
-1   |"x"的object*结构|   
-2   |  "how"         |    创建一新的object,并存字符串进去。
-3  |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()

    lua_pushinteger(L, 14);                           /* 第 3 个参数 */
-1   |14的object*结构|    也就是创建新的obj,并 (obj)->value.n=14,然后置顶。
-2   |"x"的object*结构|   
-3   |  "how"         |   创建一新的object,并存字符串进去。
-4   |"f"的object*结构|
     |............... |
     |LUA_GLOBALSINDEX|--->哈希表()


     lua_call(L, 3, 1); /* 调用 'f',传入 3 个参数,并索取 1 个返回值 */
[em2] [em2]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表