UNPKG

5.93 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.dispose = exports.init = undefined;
7
8var _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; };
9
10var _fengari = require('fengari');
11
12var _fengari2 = _interopRequireDefault(_fengari);
13
14var _fengariInterop = require('fengari-interop');
15
16var _fengariInterop2 = _interopRequireDefault(_fengariInterop);
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20var lua = _fengari2.default.lua,
21 lualib = _fengari2.default.lualib,
22 lauxlib = _fengari2.default.lauxlib,
23 toLuaString = _fengari2.default.to_luastring,
24 toJsString = _fengari2.default.to_jsstring;
25
26
27var luaExecString = function luaExecString(L) {
28 return function (str) {
29 var retCode = lauxlib.luaL_dostring(L, toLuaString(str));
30 if (retCode !== 0) {
31 var errorMsg = lua.lua_tojsstring(L, -1);
32 var message = 'Error trying to loading or executing lua code string in VM: ' + errorMsg;
33 throw new Error(message);
34 }
35 };
36};
37
38// DEBUGGING PRINT TOOL
39// const printStack = L => msg => {
40// const output = []
41// output.push(`===== PRINTING STACK: ${msg} =====`)
42// const newTop = lua.lua_gettop(L);
43// output.push(`| newTop ${newTop} |`)
44// let i = newTop * -1;
45// output.push(`STACK ${i}`)
46// while (i < 0) {
47// output.push('-----')
48// output.push(interop.tojs(L, i))
49// output.push('-----')
50// i++;
51// }
52// console.log(output.join('\n'))
53// };
54
55var getTopLength = function getTopLength(L) {
56 // get length of array in top of the stack
57 lua.lua_len(L, -1);
58 var length = lua.lua_tointeger(L, -1);
59 lua.lua_pop(L, 1);
60 return length;
61 // ~get length of array in top of the stack
62};
63
64var typeOf = function typeOf(L) {
65 return function (pos) {
66 return toJsString(lua.lua_typename(L, lua.lua_type(L, pos)));
67 };
68};
69
70var getTopKeys = function getTopKeys(L) {
71 if (lua.lua_isnil(L, -1)) throw new Error('cannot get keys on nil');
72 if (!lua.lua_istable(L, -1)) throw new Error('non-tables don\'t have keys! type is "' + typeOf(L)(-1) + '"');
73 lua.lua_pushnil(L);
74 var keys = [];
75 while (lua.lua_next(L, -2) !== 0) {
76 keys.push(_fengariInterop2.default.tojs(L, -2));
77 lua.lua_pop(L, 1);
78 }
79 return keys;
80};
81
82var isTopArray = function isTopArray(L) {
83 return function () {
84 try {
85 var keys = getTopKeys(L);
86 // reversing as putting and getting things from the stack ends with everything upside down.
87 return keys.reverse().every(function (v, i) {
88 return v === i + 1;
89 });
90 } catch (e) {
91 return false;
92 }
93 };
94};
95
96var makeReturnValue = function makeReturnValue(L) {
97 var isArray = isTopArray(L)();
98 if (!isArray) {
99 return _fengariInterop2.default.tojs(L, -1);
100 }
101
102 var arrayLength = getTopLength(L);
103
104 var table = _fengariInterop2.default.tojs(L, -1);
105 var retVal = [];
106
107 if (arrayLength === 0) {
108 lua.lua_pop(L, 1);
109 return retVal;
110 }
111
112 for (var i = 1; i <= arrayLength; i++) {
113 _fengariInterop2.default.push(L, table.get(i));
114 retVal.push(makeReturnValue(L));
115 }
116
117 lua.lua_pop(L, 1);
118 return retVal;
119};
120
121var popReturnValue = function popReturnValue(L) {
122 return function (topBeforeCall) {
123 var numReturn = lua.lua_gettop(L) - topBeforeCall + 1;
124 var ret = void 0;
125 if (numReturn > 0) {
126 ret = makeReturnValue(L);
127 }
128 lua.lua_settop(L, topBeforeCall);
129 return ret;
130 };
131};
132
133var pushTable = function pushTable(L) {
134 return function (obj) {
135 lua.lua_newtable(L);
136 var index = lua.lua_gettop(L);
137
138 Object.keys(obj).forEach(function (fieldName) {
139 _fengariInterop2.default.push(L, fieldName);
140 // eslint-disable-next-line no-use-before-define
141 push(L)(obj[fieldName]);
142 lua.lua_settable(L, index);
143 });
144 };
145};
146
147var pushArray = function pushArray(L) {
148 return function (array) {
149 lua.lua_newtable(L);
150 var subTableIndex = lua.lua_gettop(L);
151
152 array.forEach(function (e, i) {
153 _fengariInterop2.default.push(L, i + 1);
154 _fengariInterop2.default.push(L, e);
155 lua.lua_settable(L, subTableIndex);
156 });
157 };
158};
159
160var push = function push(L) {
161 return function (value) {
162 if (Array.isArray(value)) {
163 pushArray(L)(value);
164 } else if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && !Array.isArray(value)) {
165 pushTable(L)(value);
166 } else {
167 _fengariInterop2.default.push(L, value);
168 }
169 };
170};
171
172var defineGlobalArray = function defineGlobalArray(L) {
173 return function (array, name) {
174 push(L)(array);
175 lua.lua_setglobal(L, toLuaString(name));
176 };
177};
178
179var defineGlobalFunction = function defineGlobalFunction(L) {
180 return function (fn, name) {
181 // define global fn call
182 lua.lua_pushjsfunction(L, fn);
183 lua.lua_setglobal(L, toLuaString(name));
184 };
185};
186
187var extractArgs = function extractArgs(L) {
188 return function () {
189 var top = lua.lua_gettop(L);
190 var args = [];
191 var a = -top;
192 while (a < 0) {
193 args.push(a);
194 a += 1;
195 }
196 return args.map(function (i) {
197 return _fengariInterop2.default.tojs(L, i);
198 });
199 };
200};
201
202var init = exports.init = function init() {
203 // init fengari
204 var L = lauxlib.luaL_newstate();
205 lualib.luaL_openlibs(L);
206 _fengariInterop2.default.luaopen_js(L);
207 return {
208 L: L,
209 defineGlobalFunction: defineGlobalFunction(L),
210 defineGlobalArray: defineGlobalArray(L),
211 luaExecString: luaExecString(L),
212 extractArgs: extractArgs(L),
213 popReturnValue: popReturnValue(L),
214 utils: {
215 isTopArray: isTopArray(L),
216 push: push(L)
217 }
218 };
219};
220
221var dispose = exports.dispose = function dispose(vm) {
222 var L = vm.L || vm;
223 lua.lua_close(L);
224};
\No newline at end of file