Advertisement
Imgoodisher

Lua/Javascript utils

Feb 21st, 2014
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function get(i) {
  2.     i = Lua52.lua_absindex(L, i);
  3.     //if (i<0) i = Lua52.lua_gettop(L)+i+1;
  4.     var type = Lua52.lua_type(L, i);
  5.     switch (type) {
  6.         case LUA_TNIL:
  7.             return null;
  8.         case LUA_TNUMBER:
  9.             return Lua52.lua_tonumber(L, i);
  10.         case LUA_TBOOLEAN:
  11.             return !!Lua52.lua_toboolean(L, i);
  12.         case LUA_TSTRING:
  13.             return Lua52.lua_tostring(L, i);
  14.         case LUA_TTABLE:
  15.             var o = {};
  16.             Lua52.lua_pushnil(L);
  17.             while (Lua52.lua_next(L, i)!=0) {
  18.                 var k = get(-2);
  19.                 if (k != null) {
  20.                     var v = get(-1);
  21.                     o[k] = v;
  22.                 }
  23.                 Lua52.lua_pop(L, 1);
  24.             }
  25.             return o;
  26.         case LUA_TFUNCTION:
  27.             if (Lua52.lua_iscfunction(L, i)) {
  28.                 return Lua52.lua_tocfunction(L, i);
  29.             } else {
  30.                 console.warn("NYI");
  31.                 return null;
  32.             }
  33.         case LUA_TUSERDATA:
  34.         case LUA_TTHREAD:
  35.         case LUA_TLIGHTUSERDATA:
  36.         default:
  37.             console.warn("NYI");
  38.             return null;
  39.     }
  40. }
  41. function set_table(i, name, o) {
  42.     Lua52.lua_pushstring(L, name);
  43.  
  44.     if (i<0) i = Lua52.lua_gettop(L)+i+1;
  45.     var type = typeof o;
  46.    
  47.     if (o === null || o === undefined) {
  48.         Lua52.lua_pushnil(L);
  49.     } else {
  50.         switch (type) {
  51.             case "number":
  52.                 Lua52.lua_pushnumber(L, o);
  53.                 break;
  54.             case "boolean":
  55.                 Lua52.lua_pushboolean(L, o);
  56.                 break;
  57.             case "string":
  58.                 Lua52.lua_pushstring(L, o);
  59.                 break;
  60.             case "object":
  61.                 Lua52.lua_newtable(L);
  62.                 for (var k in o) {
  63.                     set_table(Lua52.lua_gettop(L), k, o[k]);
  64.                 }
  65.                 break;
  66.             default:
  67.                 console.warn("NYI");
  68.                 Lua52.lua_pushnil(L);
  69.                 break;
  70.         }
  71.     }
  72.     Lua52.lua_settable(L, i)
  73. }
  74. function push(ret) {
  75.     if (!Array.isArray(ret)) {
  76.         ret = [ret];
  77.     }
  78.     for (var i=0; i<ret.length; i++) {
  79.         if (ret[i] === undefined || ret[i] === null) {
  80.             Lua52.lua_pushnil(L);
  81.         } else {
  82.             switch (typeof ret[i]) {
  83.                 case "number":
  84.                     Lua52.lua_pushnumber(L, ret[i]);
  85.                     break;
  86.                 case "boolean":
  87.                     Lua52.lua_pushboolean(L, ret[i]);
  88.                     break;
  89.                 case "string":
  90.                     Lua52.lua_pushstring(L, ret[i]);
  91.                     break;
  92.                 case "object":
  93.                     Lua52.lua_newtable(L);
  94.                     for (var k in ret[i]) {
  95.                         set_table(Lua52.lua_gettop(L), k, ret[i][k])
  96.                     }
  97.                     break;
  98.                 default:
  99.                     console.warn("NYI");
  100.                     Lua52.lua_pushnil(L);
  101.                     break;
  102.             }
  103.         }
  104.     }
  105.  
  106.     return ret.length;
  107. }
  108. function wrap(f, that) {
  109.     return (function () {
  110.         var n_args = Lua52.lua_gettop(L);
  111.         var args = [];
  112.         for (var i=1; i<=n_args; i++) {
  113.             args.push(get(i));
  114.         }
  115.         Lua52.lua_pop(L, n_args);
  116.  
  117.         var ret = f.apply(that||window, args);
  118.  
  119.         return push(ret);
  120.     })
  121. }
  122.  
  123. function add_global_func(name,f) {
  124.     var fp = Runtime.addFunction(f);
  125.     Lua52.lua_register(L, name, fp);
  126. }
  127. function add_table(name) {
  128.     Lua52.lua_newtable(L);
  129.     Lua52.lua_setglobal(L,name);
  130. }
  131. function add_value(table,k,v) {
  132.     Lua52.lua_getglobal(L,table);
  133.     Lua52.lua_pushstring(L,k);
  134.     if (typeof v == "string")
  135.         Lua52.lua_pushstring(L,v);
  136.     else if (typeof v == "number")
  137.         Lua52.lua_pushnumber(L,v);
  138.     else if (typeof v == "function") {
  139.         var fp = Runtime.addFunction(v);
  140.         Lua52.lua_pushcfunction(L,fp);
  141.     }
  142.     else {console.warn("NYI"); return}
  143.     Lua52.lua_settable(L,1);
  144. }
  145.  
  146. function add(name,o,nowrap) {
  147.     if (typeof o == "object") {
  148.         add_table(name);
  149.         for (var i in o) {
  150.             var v = o[i];
  151.             // if o[i] is a function, wrap it, else leave it the same
  152.             if (typeof o[i] == "function" && !nowrap) v = wrap(v);
  153.             add_value(name, i, v);
  154.         }
  155.         Lua52.lua_pop(L);
  156.     } else if (typeof o == "function") {
  157.         if (!nowrap) o = wrap(o);
  158.         add_global_func(name,o)
  159.     } else {
  160.         console.warn("NYI")
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement