lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Why the code below(tcp.c in luasocket) use "tcp{master}"?
My question is about "{}" in metatable's name.

Using this url to see the whole file quickly:
http://www.google.com/codesearch/p?hl=en#-V8qIAgTIn4/kepler-1.0/luasocket-2.0.1/src/tcp.c&q=luasocket%202.0.1

Thanks!

-----------------------------------
int tcp_open(lua_State *L)
{
   /* create classes */
   auxiliar_newclass(L, "tcp{master}", tcp);
   auxiliar_newclass(L, "tcp{client}", tcp);
   auxiliar_newclass(L, "tcp{server}", tcp);
   /* create class groups */
   auxiliar_add2group(L, "tcp{master}", "tcp{any}");
   auxiliar_add2group(L, "tcp{client}", "tcp{any}");
   auxiliar_add2group(L, "tcp{server}", "tcp{any}");
   /* define library functions */
   luaL_openlib(L, NULL, func, 0);
   return 0;
}

/*-------------------------------------------------------------------------*\
* Creates a new class with given methods
* Methods whose names start with __ are passed directly to the metatable.
\*-------------------------------------------------------------------------*/
void auxiliar_newclass(lua_State *L, const char *classname, luaL_reg *func) {
   luaL_newmetatable(L, classname); /* mt */
   /* create __index table to place methods */
   lua_pushstring(L, "__index");    /* mt,"__index" */
   lua_newtable(L);                 /* mt,"__index",it */
   /* put class name into class metatable */
   lua_pushstring(L, "class");      /* mt,"__index",it,"class" */
   lua_pushstring(L, classname);    /* mt,"__index",it,"class",classname */
   lua_rawset(L, -3);               /* mt,"__index",it */
   /* pass all methods that start with _ to the metatable, and all others
    * to the index table */
   for (; func->name; func++) {     /* mt,"__index",it */
       lua_pushstring(L, func->name);
       lua_pushcfunction(L, func->func);
       lua_rawset(L, func->name[0] == '_' ? -5: -3);
   }
   lua_rawset(L, -3);               /* mt */
   lua_pop(L, 1);
}