UNPKG

flua

Version:

Easy scriptable Lua in the browser with fengari.

292 lines (253 loc) 7.29 kB
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ /** @format */ const fengari = (window.fengari) const flua = require('./lib/index.js') const lua = fengari.lua const lauxlib = fengari.lauxlib const lualib = fengari.lualib main() function main() { const L = lauxlib.luaL_newstate() lualib.luaL_openlibs(L) flua.flua_setglobals(L, { a: { anumber: 12, astr: 'plic', anarr: [1, 'sete', null, false] }, b: {b: {b: {b: {b: {b: 123}}}}}, func: function xpri(a, b, c, b, e) { console.log('PRINT', a, b, c, d, e) } }) let bad = lauxlib.luaL_loadstring( L, fengari.to_luastring(` print(b.b.b.b.b) print(b.b.b.b.b.b) for k, v in pairs(a) do print(k, v) end local value = a.value or {x='y'} a.value = value value.z = 'w' m = {} n = {1,2,3, nil} o = {a=false, b=nil} `) ) if (bad) { console.log('code loading went bad:', bad) return } let err = lua.lua_pcall(L, 0, 0, 0) if (err) { console.log('execution went bad:', err) return } console.log('got globals', flua.flua_getglobals(L, ['a', 'm', 'n', 'o'])) } },{"./lib/index.js":2}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; exports.run = run; exports.runWithGlobals = runWithGlobals; exports.flua_setglobals = flua_setglobals; exports.flua_getglobals = flua_getglobals; exports.flua_getfullstack = flua_getfullstack; exports.flua_readany = flua_readany; exports.flua_readtable = flua_readtable; exports.flua_pushobject = flua_pushobject; exports.flua_pusharray = flua_pusharray; exports.flua_pushany = flua_pushany; /** @format */ var fengari = (window.fengari); var lua = fengari.lua; var lauxlib = fengari.lauxlib; var lualib = fengari.lualib; var LUA_TBOOLEAN = lua.LUA_TBOOLEAN, LUA_TFUNCTION = lua.LUA_TFUNCTION, LUA_TNIL = lua.LUA_TNIL, LUA_TNUMBER = lua.LUA_TNUMBER, LUA_TSTRING = lua.LUA_TSTRING, LUA_TTABLE = lua.LUA_TTABLE, lua_gettop = lua.lua_gettop, lua_isnone = lua.lua_isnone, lua_pop = lua.lua_pop, lua_createtable = lua.lua_createtable, lua_next = lua.lua_next, lua_pushboolean = lua.lua_pushboolean, lua_pushjsfunction = lua.lua_pushjsfunction, lua_pushnil = lua.lua_pushnil, lua_pushnumber = lua.lua_pushnumber, lua_pushstring = lua.lua_pushstring, lua_rawlen = lua.lua_rawlen, lua_rawgeti = lua.lua_rawgeti, lua_rawseti = lua.lua_rawseti, lua_rawget = lua.lua_rawget, lua_rawset = lua.lua_rawset, lua_setglobal = lua.lua_setglobal, lua_getglobal = lua.lua_getglobal, lua_toboolean = lua.lua_toboolean, lua_tojsstring = lua.lua_tojsstring, lua_tonumber = lua.lua_tonumber, lua_tointeger = lua.lua_tointeger, lua_type = lua.lua_type; // utils function run(code, getglobals) { runWithGlobals({}, code, getglobals); } function runWithGlobals(globals, code) { var getglobals = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; var L = lauxlib.luaL_newstate(); lualib.luaL_openlibs(L); flua_setglobals(L, globals); var bad = lauxlib.luaL_loadstring(L, fengari.to_luastring(code)); if (bad) { throw new Error(bad); } var err = lua.lua_pcall(L, 0, 0, 0); if (err) { var errmsg = lua_tojsstring(L, -1); lua_pop(L, 1); throw new Error(errmsg); } return flua_getglobals(L, getglobals); } function flua_setglobals(L, globals) { for (var k in globals) { var v = globals[k]; flua_pushany(L, v); lua_setglobal(L, k); } } function flua_getglobals(L, names) { var globals = {}; for (var i = 0; i < names.length; i++) { var name = names[i]; lua_getglobal(L, name); var v = flua_readany(L, -1); globals[name] = v; lua_pop(L, 1); } return globals; } function flua_getfullstack(L) { values = []; for (var i = 1; i <= lua_gettop(L); i++) { var v = flua_readany(L, i); values.push(v); } return values; } // read stuff function flua_readany(L, pos) { switch (lua_type(L, pos)) { case LUA_TNIL: return null; case LUA_TNUMBER: return lua_tonumber(L, pos); case LUA_TBOOLEAN: return lua_toboolean(L, pos); case LUA_TSTRING: var x = lua_tojsstring(L, pos); return x; case LUA_TTABLE: return flua_readtable(L, pos); } return null; } function flua_readtable(L, pos) { if (pos < 0) { pos = lua_gettop(L) + 1 + pos; } var object = {}; var slice = []; var isArray = true; var size = lua_rawlen(L, pos); if (size === 0) { isArray = false; } else { slice = new Array(size); } lua_pushnil(L); while (lua_next(L, pos) !== 0) { var val = flua_readany(L, -1); lua_pop(L, 1); // array if (isArray) { var index = lua_tointeger(L, -1); if (index !== 0 && index <= size) { slice[index - 1] = val; } else { isArray = false; } } // object var key = '' + flua_readany(L, -1); object[key] = val; } return isArray ? slice : object; } // push stuff function flua_pushobject(L, obj) { lua_createtable(L, 0, Object.keys(obj).length); for (var k in obj) { var v = obj[k]; flua_pushany(L, k); flua_pushany(L, v); lua_rawset(L, -3); } } function flua_pusharray(L, s) { lua_createtable(L, s.length, 0); for (var i = 0; i < s.length; i++) { var v = s[i]; flua_pushany(L, v); lua_rawseti(L, -2, i + 1); } } function flua_pushany(L, val) { switch (typeof val === 'undefined' ? 'undefined' : _typeof(val)) { case 'string': lua_pushstring(L, val); break; case 'number': lua_pushnumber(L, val); break; case 'boolean': lua_pushboolean(L, val); break; case 'object': if (Array.isArray(val)) { flua_pusharray(L, val); } else if (val === null) { lua_pushnil(L); } else { flua_pushobject(L, val); } break; case 'function': lua_pushjsfunction(L, function (L) { var n = lua_gettop(L); var args = new Array(n); for (var i = 1; i <= n; i++) { args[i - 1] = flua_readany(L, i); } var returned = val.apply(null, args); returned = returned === null ? [] : Array.isArray(returned) ? returned : [returned]; for (var _i = 0; _i < returned.length; _i++) { flua_pushany(L, returned[_i]); } return returned.length; }); break; default: lua_pushnil(L); break; } } },{}]},{},[1]);