Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

luaL_openlib replacement for Lua 5.2

Tags:

I am adapting a library written for Lua < 5.2 and got to a call I don't know the equivalent of:

luaL_openlib(L, "Polycore", polycoreLib, 0); 

Where polycoreLib is a

static const struct luaL_Reg polycoreLib [] 

How can I replace the call to luaL_openlib?

The lua wiki only states:

Calls such as luaL_openlib(L, name, lreg, x); should be carefully rewritten because a global table with the given name will be searched and possibly created.

like image 528
Appleshell Avatar asked Sep 27 '13 01:09

Appleshell


1 Answers

There's two answers to this: one for replicating the behaviour of earlier versions here (where a global table is created), and one for implementing the behaviour that is now conventional (which is to create and return an anonymous table).

For the former:

lua_newtable(L); luaL_setfuncs(L, polycoreLib, 0); lua_setglobal(L, "Polycore"); 

This isn't quite the same as luaL_openlib, because if there is an existing global table Polycore it will overwrite it rather than merging with it. If merging is a concern, use lua_getglobal first, then if it pushed a table re-use that rather than creating a new one:

lua_getglobal(L, "Polycore"); if (lua_isnil(L, -1)) {   lua_pop(L, 1);   lua_newtable(L); } luaL_setfuncs(L, polycoreLib, 0); lua_setglobal(L, "Polycore"); 

The latter is easier because you don't need to care about merging:

lua_newtable(L); luaL_setfuncs(L, polycoreLib, 0); return 1; 

With this approach, it is the caller's reponsibility to bind the table, as in:

local Polycore = require "Polycore" 
like image 95
ToxicFrog Avatar answered Sep 23 '22 15:09

ToxicFrog