From b575979804c25aec993e7699b2ec00265d5b70ff Mon Sep 17 00:00:00 2001
From: daurnimator <quae@daurnimator.com>
Date: Wed, 3 May 2017 19:18:47 +1000
Subject: src/lauxlib: Rewrite luaL_execresult

---
 src/lauxlib.js | 32 +++++++++++++++++++-------------
 src/loslib.js  |  4 ++--
 2 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/src/lauxlib.js b/src/lauxlib.js
index b020d04..c5e0d59 100644
--- a/src/lauxlib.js
+++ b/src/lauxlib.js
@@ -211,21 +211,27 @@ const luaL_fileresult = function(L, stat, fname, e) {
 };
 
 /* Unlike normal lua, we pass in an error object */
-const luaL_execresult = function(L, stat, e) {
-    let what = lua.to_luastring("exit");  /* type of termination */
-    if (e && e.status === -1)  /* error? */
-        return luaL_fileresult(L, 0, null, e);
-    else {
-        if (e && e.signal) {
-            lua.lua_pushnil(L);
-            lua.lua_pushliteral(L, "signal");
-        } else {
-            lua.lua_pushboolean(L, 1);
-            lua.lua_pushliteral(L, "exit");
-        }
-        lua.lua_pushinteger(L, e ? e.status : 0);
+const luaL_execresult = function(L, e) {
+    let what, stat;
+    if (e === null) {
+        lua.lua_pushboolean(L, 1);
+        lua.lua_pushliteral(L, "exit");
+        lua.lua_pushinteger(L, 0);
         return 3;
+    } else if (e.status) {
+        what = "exit";
+        stat = e.status;
+    } else if (e.signal) {
+        what = "signal";
+        stat = e.signal;
+    } else {
+        /* XXX: node seems to have e.errno as a string instead of a number */
+        return luaL_fileresult(L, 0, null, e);
     }
+    lua.lua_pushnil(L);
+    lua.lua_pushliteral(L, what);
+    lua.lua_pushinteger(L, stat);
+    return 3;
 };
 
 const luaL_getmetatable = function(L, n) {
diff --git a/src/loslib.js b/src/loslib.js
index 6fd5247..b93071b 100644
--- a/src/loslib.js
+++ b/src/loslib.js
@@ -247,10 +247,10 @@ if (typeof require === "function") {
                         }
                     );
                 } catch (e) {
-                    return lauxlib.luaL_execresult(L, false, e);
+                    return lauxlib.luaL_execresult(L, e);
                 }
 
-                return lauxlib.luaL_execresult(L, true);
+                return lauxlib.luaL_execresult(L, null);
             } else {
                 try {
                     child_process.execSync(
-- 
cgit v1.2.3-70-g09d2