Taken from https://aur.archlinux.org/cgit/aur.git/tree/tolua53.patch?h=tolua%2b%2b_5.3
and slimmed down

--- a/src/bin/lua/all.lua
+++ b/src/bin/lua/all.lua
@@ -1,8 +1,8 @@
 dofile(path.."compat-5.1.lua")
 dofile(path.."compat.lua")
-dofile(path.."basic.lua")
 dofile(path.."feature.lua")
 dofile(path.."verbatim.lua")
+dofile(path.."basic.lua")
 dofile(path.."code.lua")
 dofile(path.."typedef.lua")
 dofile(path.."container.lua")
--- a/src/bin/lua/basic.lua
+++ b/src/bin/lua/basic.lua
@@ -75,8 +75,8 @@
 end
 
 function applyrenaming (s)
-	for i=1,getn(_renaming) do
-	 local m,n = gsub(s,_renaming[i].old,_renaming[i].new)
+	for i,v in ipairs(_renaming) do
+	 local m,n = gsub(s,v.old,v.new)
 		if n ~= 0 then
 		 return m
 		end
@@ -252,7 +252,8 @@
 -- concatenate all parameters, following output rules
 function concatparam (line, ...)
  local i=1
- while i<=arg.n do
+ local arg={...}
+ while i<=#arg do
   if _cont and not strfind(_cont,'[%(,"]') and
      strfind(arg[i],"^[%a_~]") then
 	    line = line .. ' '
@@ -263,7 +264,7 @@
   end
   i = i+1
  end
- if strfind(arg[arg.n],"[%/%)%;%{%}]$") then
+ if strfind(arg[#arg],"[%/%)%;%{%}]$") then
   _cont=nil line = line .. '\n'
  end
 	return line
@@ -272,7 +273,8 @@
 -- output line
 function output (...)
  local i=1
- while i<=arg.n do
+ local arg = {...}
+ while i<=#arg do
   if _cont and not strfind(_cont,'[%(,"]') and
      strfind(arg[i],"^[%a_~]") then
 	    write(' ')
@@ -283,7 +285,7 @@
   end
   i = i+1
  end
- if strfind(arg[arg.n],"[%/%)%;%{%}]$") then
+ if strfind(arg[#arg],"[%/%)%;%{%}]$") then
   _cont=nil write('\n')
  end
 end
@@ -373,9 +375,10 @@
 
 end
 
+
 -- called to output an error message
 function output_error_hook(...)
-	return string.format(...)
+	return string.format(table.unpack{...})
 end
 
 -- custom pushers
--- a/src/bin/lua/class.lua
+++ b/src/bin/lua/class.lua
@@ -92,7 +92,7 @@
 	self.btype = typevar(self.base)
 	self.ctype = 'const '..self.type
 	if self.extra_bases then
-		for i=1,table.getn(self.extra_bases) do
+		for i=1,#self.extra_bases do
 			self.extra_bases[i] = typevar(self.extra_bases[i])
 		end
 	end
@@ -138,9 +138,9 @@
 -- Expects the name, the base (array) and the body of the class.
 function Class (n,p,b)
 
-	if table.getn(p) > 1 then
+	if #p > 1 then
 		b = string.sub(b, 1, -2)
-		for i=2,table.getn(p),1 do
+		for i=2,#p,1 do
 			b = b.."\n tolua_inherits "..p[i].." __"..p[i].."__;\n"
 		end
 		b = b.."\n}"
--- a/src/bin/lua/clean.lua
+++ b/src/bin/lua/clean.lua
@@ -19,14 +19,14 @@
 }
 
 function mask (s)
- for i = 1,getn(MASK)  do
+ for i = 1,#MASK  do
   s = gsub(s,MASK[i][2],MASK[i][1])
  end
  return s
 end
 
 function unmask (s)
- for i = 1,getn(MASK)  do
+ for i = 1,#MASK  do
   s = gsub(s,MASK[i][1],MASK[i][2])
  end
  return s
--- a/src/bin/lua/compat-5.1.lua
+++ b/src/bin/lua/compat-5.1.lua
@@ -25,10 +25,10 @@
 		end
 	end
 
-	local f = load(getfile, path)
+	local f, errmsg = load(getfile, path)
 	if not f then
 	
-		error("error loading file "..path)
+		error("error loading file "..path ..": " .. errmsg)
 	end
 	return f()
 end
--- a/src/bin/lua/compat.lua
+++ b/src/bin/lua/compat.lua
@@ -40,15 +40,13 @@
   end
 end
 
-function dostring(s) return do_(loadstring(s)) end
+function dostring(s) return do_(load(s)) end
 -- function dofile(s) return do_(loadfile(s)) end
 
 -------------------------------------------------------------------
 -- Table library
 local tab = table
-foreach = tab.foreach
-foreachi = tab.foreachi
-getn = tab.getn
+getn = function (tab) return #tab end
 tinsert = tab.insert
 tremove = tab.remove
 sort = tab.sort
@@ -78,7 +76,7 @@
 frexp = math.frexp
 ldexp = math.ldexp
 log = math.log
-log10 = math.log10
+log10 = function(val) return math.log(10, val) end
 max = math.max
 min = math.min
 mod = math.mod
@@ -177,17 +175,19 @@
 
 function read (...)
   local f = _INPUT
+  local arg = {...}
   if rawtype(arg[1]) == 'userdata' then
     f = tab.remove(arg, 1)
   end
-  return f:read(unpack(arg))
+  return f:read(table.unpack(arg))
 end
 
 function write (...)
   local f = _OUTPUT
+  local arg = {...}
   if rawtype(arg[1]) == 'userdata' then
     f = tab.remove(arg, 1)
   end
-  return f:write(unpack(arg))
+  return f:write(table.unpack(arg))
 end
 
--- a/src/bin/lua/declaration.lua
+++ b/src/bin/lua/declaration.lua
@@ -137,7 +137,7 @@
 	if b then
 
 		m = split_c_tokens(string.sub(m, 2, -2), ",")
-		for i=1, table.getn(m) do
+		for i=1, #m do
 			m[i] = string.gsub(m[i],"%s*([%*&])", "%1")
 			if not isbasic(m[i]) then
 				if not isenum(m[i]) then _, m[i] = applytypedef("", m[i]) end
@@ -522,7 +522,7 @@
  end
 
  -- check the form: mod type* name
- local s1 = gsub(s,"(%b\[\])",function (n) return gsub(n,'%*','\1') end)
+ local s1 = gsub(s,"(%b%[%])",function (n) return gsub(n,'%*','\1') end)
  t = split_c_tokens(s1,'%*')
  if t.n == 2 then
   t[2] = gsub(t[2],'\1','%*') -- restore * in dimension expression
--- a/src/bin/lua/feature.lua
+++ b/src/bin/lua/feature.lua
@@ -132,7 +132,7 @@
  if not fname or fname == '' then
  	fname = self.name
  end
-  n = string.gsub(n..'_'.. (fname), "[<>:, \.%*&]", "_")
+  n = string.gsub(n..'_'.. (fname), "[<>:, \\.%*&]", "_")
 
   return n
 end
--- a/src/bin/lua/function.lua
+++ b/src/bin/lua/function.lua
@@ -520,7 +520,7 @@
 function join(t, sep, first, last)
 
 	first = first or 1
-	last = last or table.getn(t)
+	last = last or #t
 	local lsep = ""
 	local ret = ""
 	local loop = false
--- a/src/bin/lua/package.lua
+++ b/src/bin/lua/package.lua
@@ -39,7 +39,7 @@
  self.code = gsub(self.code,"\n%s*%$%]","\2")
  self.code = gsub(self.code,"(%b\1\2)",       function (c)
                                                tinsert(L,c)
-                                               return "\n#["..getn(L).."]#"
+                                               return "\n#[".. #L .."]#"
                                               end)
  -- avoid preprocessing embedded C code
  local C = {}
@@ -47,14 +47,14 @@
  self.code = gsub(self.code,"\n%s*%$%>","\4")
  self.code = gsub(self.code,"(%b\3\4)",       function (c)
                                                tinsert(C,c)
-                                               return "\n#<"..getn(C)..">#"
+                                               return "\n#<".. #C ..">#"
                                               end)
  -- avoid preprocessing embedded C code
  self.code = gsub(self.code,"\n%s*%$%{","\5") -- deal with embedded C code
  self.code = gsub(self.code,"\n%s*%$%}","\6")
  self.code = gsub(self.code,"(%b\5\6)",       function (c)
                                                tinsert(C,c)
-                                               return "\n#<"..getn(C)..">#"
+                                               return "\n#<".. #C..">#"
                                               end)
 
  --self.code = gsub(self.code,"\n%s*#[^d][^\n]*\n", "\n\n") -- eliminate preprocessor directives that don't start with 'd'
@@ -64,7 +64,7 @@
  local V = {}
  self.code = gsub(self.code,"\n(%s*%$[^%[%]][^\n]*)",function (v)
                                                tinsert(V,v)
-                                               return "\n#"..getn(V).."#"
+                                               return "\n#".. #V .."#"
                                               end)
 
  -- perform global substitution
@@ -152,14 +152,14 @@
 	if flags.t then
 		output("#ifndef Mtolua_typeid\n#define Mtolua_typeid(L,TI,T)\n#endif\n")
 	end
-	foreach(_usertype,function(n,v)
+	for n,v in pairs(_usertype) do
 		if (not _global_classes[v]) or _global_classes[v]:check_public_access() then
 			output(' tolua_usertype(tolua_S,"',v,'");')
 			if flags.t then
 				output(' Mtolua_typeid(tolua_S,typeid(',v,'), "',v,'");')
 			end
 		end
-	 end)
+	 end
  output('}')
  output('\n')
 end
@@ -288,7 +288,7 @@
 				local t = {code=s}
 				extra = string.gsub(extra, "^%s*,%s*", "")
 				local pars = split_c_tokens(extra, ",")
-				include_file_hook(t, fn, unpack(pars))
+				include_file_hook(t, fn, table.unpack(pars))
 				return "\n\n" .. t.code
 			else
 				error('#Invalid include directive (use $cfile, $pfile, $lfile or $ifile)')
@@ -322,7 +322,7 @@
       table.insert(chunk, string.sub(line, 3) .. "\n")
      else
       local last = 1
-      for text, expr, index in string.gfind(line, "(.-)$(%b())()") do 
+      for text, expr, index in string.gmatch(line, "(.-)$(%b())()") do 
         last = index
         if text ~= "" then
           table.insert(chunk, string.format('table.insert(__ret, %q )', text))
@@ -334,10 +334,9 @@
     end
   end
   table.insert(chunk, '\nreturn table.concat(__ret)\n')
-  local f,e = loadstring(table.concat(chunk))
+  local f,e = load(table.concat(chunk), nil, "t", _extra_parameters)
   if e then
   	error("#"..e)
   end
-  setfenv(f, _extra_parameters)
   return f()
 end
--- a/src/bin/lua/template_class.lua
+++ b/src/bin/lua/template_class.lua
@@ -22,7 +22,7 @@
 	for i =1 , types.n do
 
 		local Il = split_c_tokens(types[i], " ")
-		if table.getn(Il) ~= table.getn(self.args) then
+		if #Il ~= #self.args then
 			error("#invalid parameter count for "..types[i])
 		end
 		local bI = self.body
@@ -31,16 +31,16 @@
 			--Tl[j] = findtype(Tl[j]) or Tl[j]
 			bI = string.gsub(bI, "([^_%w])"..self.args[j].."([^_%w])", "%1"..Il[j].."%2")
 			if self.parents then
-				for i=1,table.getn(self.parents) do
+				for i=1,#self.parents do
 					pI[i] = string.gsub(self.parents[i], "([^_%w]?)"..self.args[j].."([^_%w]?)", "%1"..Il[j].."%2")
 				end
 			end
 		end
 		--local append = "<"..string.gsub(types[i], "%s+", ",")..">"
-		local append = "<"..concat(Il, 1, table.getn(Il), ",")..">"
+		local append = "<"..concat(Il, 1, #Il, ",")..">"
 		append = string.gsub(append, "%s*,%s*", ",")
 		append = string.gsub(append, ">>", "> >")
-		for i=1,table.getn(pI) do
+		for i=1,#pI do
 			--pI[i] = string.gsub(pI[i], ">>", "> >")
 			pI[i] = resolve_template_types(pI[i])
 		end
--- a/src/bin/tolua.c
+++ b/src/bin/tolua.c
@@ -67,7 +67,11 @@
 static void add_extra (lua_State* L, char* value) {
 	int len;
 	lua_getglobal(L, "_extra_parameters");
+#if LUA_VERSION_NUM > 501
+	len = lua_rawlen(L, -1);
+#else
 	len = luaL_getn(L, -1);
+#endif
 	lua_pushstring(L, value);
 	lua_rawseti(L, -2, len+1);
 	lua_pop(L, 1);
@@ -145,7 +149,7 @@
   }
   lua_pop(L,1);
  }
-/* #define TOLUA_SCRIPT_RUN */
+#define TOLUA_SCRIPT_RUN
 #ifndef TOLUA_SCRIPT_RUN
  {
   int tolua_tolua_open (lua_State* L);
@@ -153,16 +157,17 @@
  }
 #else
  {
-  char* p;
-  char  path[BUFSIZ];
-  strcpy(path,argv[0]);
-  p = strrchr(path,'/');
-  if (p==NULL) p = strrchr(path,'\\');
-  p = (p==NULL) ? path : p+1;
-  sprintf(p,"%s","../src/bin/lua/");
-  lua_pushstring(L,path); lua_setglobal(L,"path");
-		strcat(path,"all.lua");
-  lua_dofile(L,path);
+  lua_pushstring(L, "/usr/share/toluapp/luapp/"); lua_setglobal(L,"path");
+  if (luaL_loadfile(L, "/usr/share/toluapp/luapp/all.lua") != 0) {
+    fprintf(stderr, "luaL_loadfile failed\n");
+    return 1;
+  }
+  if (lua_pcall(L, 0,0,0) != 0) {
+    const char *errmsg = lua_tostring(L, -1);
+    fprintf(stderr, "lua_pcall failed: %s\n", errmsg);
+    lua_pop(L, 1);
+    return 1;
+  }
  }
 #endif
  return 0;
--- a/src/lib/tolua_event.c
+++ b/src/lib/tolua_event.c
@@ -23,12 +23,20 @@
 static void storeatubox (lua_State* L, int lo)
 {
 	#ifdef LUA_VERSION_NUM
+#if LUA_VERSION_NUM > 501
+		lua_getuservalue(L, lo);
+#else
 		lua_getfenv(L, lo);
+#endif
 		if (lua_rawequal(L, -1, TOLUA_NOPEER)) {
 			lua_pop(L, 1);
 			lua_newtable(L);
 			lua_pushvalue(L, -1);
+#if LUA_VERSION_NUM > 501
+			lua_setuservalue(L, lo);	/* stack: k,v,table  */
+#else
 			lua_setfenv(L, lo);	/* stack: k,v,table  */
+#endif
 		};
 		lua_insert(L, -3);
 		lua_settable(L, -3); /* on lua 5.1, we trade the "tolua_peers" lookup for a settable call */
@@ -141,7 +149,11 @@
 	{
 		/* Access alternative table */
 		#ifdef LUA_VERSION_NUM /* new macro on version 5.1 */
+#if LUA_VERSION_NUM > 501
+		lua_getuservalue(L, 1);
+#else
 		lua_getfenv(L,1);
+#endif
 		if (!lua_rawequal(L, -1, TOLUA_NOPEER)) {
 			lua_pushvalue(L, 2); /* key */
 			lua_gettable(L, -2); /* on lua 5.1, we trade the "tolua_peers" lookup for a gettable call */
@@ -420,6 +432,8 @@
 */
 TOLUA_API int class_gc_event (lua_State* L)
 {
+  if (lua_type(L,1) == LUA_TUSERDATA)
+  {
 	void* u = *((void**)lua_touserdata(L,1));
 	int top;
 	/*fprintf(stderr, "collecting: looking at %p\n", u);*/
@@ -427,7 +441,8 @@
 	lua_pushstring(L,"tolua_gc");
 	lua_rawget(L,LUA_REGISTRYINDEX);
 	*/
-	lua_pushvalue(L, lua_upvalueindex(1));
+	lua_pushstring(L,"tolua_gc");
+	lua_rawget(L,LUA_REGISTRYINDEX);   /* gc */
 	lua_pushlightuserdata(L,u);
 	lua_rawget(L,-2);            /* stack: gc umt    */
 	lua_getmetatable(L,1);       /* stack: gc umt mt */
@@ -456,6 +471,7 @@
 		lua_rawset(L,-5);           /* stack: gc umt mt */
 	}
 	lua_pop(L,3);
+  }
 	return 0;
 }
 
--- a/src/lib/tolua_map.c
+++ b/src/lib/tolua_map.c
@@ -262,8 +262,12 @@
 
 		lua_pop(L, 1);
 		lua_pushvalue(L, TOLUA_NOPEER);
-	};
+	}
+#if LUA_VERSION_NUM > 501
+	lua_setuservalue(L, -2);
+#else
 	lua_setfenv(L, -2);
+#endif
 
 	return 0;
 };
@@ -271,7 +275,11 @@
 static int tolua_bnd_getpeer(lua_State* L) {
 
 	/* stack: userdata */
+#if LUA_VERSION_NUM > 501
+	lua_getuservalue(L, -1);
+#else
 	lua_getfenv(L, -1);
+#endif
 	if (lua_rawequal(L, -1, TOLUA_NOPEER)) {
 		lua_pop(L, 1);
 		lua_pushnil(L);
@@ -411,7 +419,11 @@
 		lua_rawget(L,-2);
 	}
 	else
+#if LUA_VERSION_NUM > 501
+	 lua_pushglobaltable(L);
+#else
 	 lua_pushvalue(L,LUA_GLOBALSINDEX);
+#endif
 }
 
 /* End module
@@ -445,7 +457,11 @@
 	else
 	{
 		/* global table */
+#if LUA_VERSION_NUM > 501
+		lua_pushglobaltable(L);
+#else
 		lua_pushvalue(L,LUA_GLOBALSINDEX);
+#endif
 	}
 	if (hasvar)
 	{
@@ -473,7 +489,11 @@
 	else
 	{
 		/* global table */
+#if LUA_VERSION_NUM > 501
+		lua_pushglobaltable(L);
+#else
 		lua_pushvalue(L,LUA_GLOBALSINDEX);
+#endif
 	}
 	if (hasvar)
 	{
--- a/src/lib/tolua_push.c
+++ b/src/lib/tolua_push.c
@@ -79,7 +79,11 @@
 
    #ifdef LUA_VERSION_NUM
    lua_pushvalue(L, TOLUA_NOPEER);
+#if LUA_VERSION_NUM > 501
+   lua_setuservalue(L, -2);
+#else
    lua_setfenv(L, -2);
+#endif
    #endif
   }
   else
