Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function get(i) {
- i = Lua52.lua_absindex(L, i);
- //if (i<0) i = Lua52.lua_gettop(L)+i+1;
- var type = Lua52.lua_type(L, i);
- switch (type) {
- case LUA_TNIL:
- return null;
- case LUA_TNUMBER:
- return Lua52.lua_tonumber(L, i);
- case LUA_TBOOLEAN:
- return !!Lua52.lua_toboolean(L, i);
- case LUA_TSTRING:
- return Lua52.lua_tostring(L, i);
- case LUA_TTABLE:
- var o = {};
- Lua52.lua_pushnil(L);
- while (Lua52.lua_next(L, i)!=0) {
- var k = get(-2);
- if (k != null) {
- var v = get(-1);
- o[k] = v;
- }
- Lua52.lua_pop(L, 1);
- }
- return o;
- case LUA_TFUNCTION:
- if (Lua52.lua_iscfunction(L, i)) {
- return Lua52.lua_tocfunction(L, i);
- } else {
- console.warn("NYI");
- return null;
- }
- case LUA_TUSERDATA:
- case LUA_TTHREAD:
- case LUA_TLIGHTUSERDATA:
- default:
- console.warn("NYI");
- return null;
- }
- }
- function set_table(i, name, o) {
- Lua52.lua_pushstring(L, name);
- if (i<0) i = Lua52.lua_gettop(L)+i+1;
- var type = typeof o;
- if (o === null || o === undefined) {
- Lua52.lua_pushnil(L);
- } else {
- switch (type) {
- case "number":
- Lua52.lua_pushnumber(L, o);
- break;
- case "boolean":
- Lua52.lua_pushboolean(L, o);
- break;
- case "string":
- Lua52.lua_pushstring(L, o);
- break;
- case "object":
- Lua52.lua_newtable(L);
- for (var k in o) {
- set_table(Lua52.lua_gettop(L), k, o[k]);
- }
- break;
- default:
- console.warn("NYI");
- Lua52.lua_pushnil(L);
- break;
- }
- }
- Lua52.lua_settable(L, i)
- }
- function push(ret) {
- if (!Array.isArray(ret)) {
- ret = [ret];
- }
- for (var i=0; i<ret.length; i++) {
- if (ret[i] === undefined || ret[i] === null) {
- Lua52.lua_pushnil(L);
- } else {
- switch (typeof ret[i]) {
- case "number":
- Lua52.lua_pushnumber(L, ret[i]);
- break;
- case "boolean":
- Lua52.lua_pushboolean(L, ret[i]);
- break;
- case "string":
- Lua52.lua_pushstring(L, ret[i]);
- break;
- case "object":
- Lua52.lua_newtable(L);
- for (var k in ret[i]) {
- set_table(Lua52.lua_gettop(L), k, ret[i][k])
- }
- break;
- default:
- console.warn("NYI");
- Lua52.lua_pushnil(L);
- break;
- }
- }
- }
- return ret.length;
- }
- function wrap(f, that) {
- return (function () {
- var n_args = Lua52.lua_gettop(L);
- var args = [];
- for (var i=1; i<=n_args; i++) {
- args.push(get(i));
- }
- Lua52.lua_pop(L, n_args);
- var ret = f.apply(that||window, args);
- return push(ret);
- })
- }
- function add_global_func(name,f) {
- var fp = Runtime.addFunction(f);
- Lua52.lua_register(L, name, fp);
- }
- function add_table(name) {
- Lua52.lua_newtable(L);
- Lua52.lua_setglobal(L,name);
- }
- function add_value(table,k,v) {
- Lua52.lua_getglobal(L,table);
- Lua52.lua_pushstring(L,k);
- if (typeof v == "string")
- Lua52.lua_pushstring(L,v);
- else if (typeof v == "number")
- Lua52.lua_pushnumber(L,v);
- else if (typeof v == "function") {
- var fp = Runtime.addFunction(v);
- Lua52.lua_pushcfunction(L,fp);
- }
- else {console.warn("NYI"); return}
- Lua52.lua_settable(L,1);
- }
- function add(name,o,nowrap) {
- if (typeof o == "object") {
- add_table(name);
- for (var i in o) {
- var v = o[i];
- // if o[i] is a function, wrap it, else leave it the same
- if (typeof o[i] == "function" && !nowrap) v = wrap(v);
- add_value(name, i, v);
- }
- Lua52.lua_pop(L);
- } else if (typeof o == "function") {
- if (!nowrap) o = wrap(o);
- add_global_func(name,o)
- } else {
- console.warn("NYI")
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement