1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.dispose = exports.init = undefined;
|
7 |
|
8 | 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; };
|
9 |
|
10 | var _fengari = require('fengari');
|
11 |
|
12 | var _fengari2 = _interopRequireDefault(_fengari);
|
13 |
|
14 | var _fengariInterop = require('fengari-interop');
|
15 |
|
16 | var _fengariInterop2 = _interopRequireDefault(_fengariInterop);
|
17 |
|
18 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19 |
|
20 | var 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 |
|
27 | var 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 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 | var getTopLength = function getTopLength(L) {
|
56 |
|
57 | lua.lua_len(L, -1);
|
58 | var length = lua.lua_tointeger(L, -1);
|
59 | lua.lua_pop(L, 1);
|
60 | return length;
|
61 |
|
62 | };
|
63 |
|
64 | var typeOf = function typeOf(L) {
|
65 | return function (pos) {
|
66 | return toJsString(lua.lua_typename(L, lua.lua_type(L, pos)));
|
67 | };
|
68 | };
|
69 |
|
70 | var 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 |
|
82 | var isTopArray = function isTopArray(L) {
|
83 | return function () {
|
84 | try {
|
85 | var keys = getTopKeys(L);
|
86 |
|
87 | return keys.reverse().every(function (v, i) {
|
88 | return v === i + 1;
|
89 | });
|
90 | } catch (e) {
|
91 | return false;
|
92 | }
|
93 | };
|
94 | };
|
95 |
|
96 | var 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 |
|
121 | var 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 |
|
133 | var 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 |
|
141 | push(L)(obj[fieldName]);
|
142 | lua.lua_settable(L, index);
|
143 | });
|
144 | };
|
145 | };
|
146 |
|
147 | var 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 |
|
160 | var 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 |
|
172 | var defineGlobalArray = function defineGlobalArray(L) {
|
173 | return function (array, name) {
|
174 | push(L)(array);
|
175 | lua.lua_setglobal(L, toLuaString(name));
|
176 | };
|
177 | };
|
178 |
|
179 | var defineGlobalFunction = function defineGlobalFunction(L) {
|
180 | return function (fn, name) {
|
181 |
|
182 | lua.lua_pushjsfunction(L, fn);
|
183 | lua.lua_setglobal(L, toLuaString(name));
|
184 | };
|
185 | };
|
186 |
|
187 | var 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 |
|
202 | var init = exports.init = function init() {
|
203 |
|
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 |
|
221 | var dispose = exports.dispose = function dispose(vm) {
|
222 | var L = vm.L || vm;
|
223 | lua.lua_close(L);
|
224 | }; |
\ | No newline at end of file |