int luaopen_aoi(lua_State* L) {
luaL_checkversion(L);
luaL_Reg l1[] = {
{"create", aoi_new},
{NULL, NULL},//哨兵 数组最后总是{NULL,NULL},标识结尾
};
luaL_Reg l2[] = {
{"add", aoi_add},
{"update", aoi_update},
{"delete", aoi_delete},
{"get_pos_nearby_objs", aoi_get_pos_nearby_objs},
{"get_obj_nearby_objs", aoi_get_obj_nearby_objs},
{"get_objs_nearby_objs", aoi_get_objs_nearby_objs},
{NULL, NULL},
};
luaL_newmetatable(L, "aoi_meta"); // 1.栈顶压入元表
luaL_newlib(L, l2); // 2.继续压入元表成员函数 luaL_newlib的调用会创建一个表由数值l2填充这个表
lua_setfield(L, -2, "__index"); // 3.设置元表的__index
lua_pushcfunction(L, aoi_release); // 4.压入gc函数
lua_setfield(L, -2, "__gc"); // 5.绑定gc函数
luaL_newlib(L, l1); // 6.栈顶压入函数
return 1;
}
按照以上注释顺序来解释栈顶变化
luaL_newmetatable(L, “aoi_meta”);
-1 | aoi_meta |
2.luaL_newlib(L, l2);
-1 | l2 |
-2 | aoi_meta |
3.lua_setfield(L, -2, “__index”);
-1 | aoi_meta.__index = l2 |
4.lua_pushcfunction(L, aoi_release)
-1 | aoi_release |
-2 | aoi_meta.__index = l2 |
5.lua_setfield(L, -2, “__gc”);
-1 | aoi_meta.__gc = aoi_release |
aoi_meta = {
__index = l2,
__gc = aoi_release
}
6.luaL_newlib(L, l1);
-1 | l1 |
-2 | aoi_meta |