Skip to content
This repository was archived by the owner on Nov 20, 2020. It is now read-only.

Commit d971a10

Browse files
Fabien FleutotFabien Fleutot
authored andcommitted
mlc_xcall now properly reports parsing errors
1 parent fcee97b commit d971a10

File tree

1 file changed

+45
-12
lines changed

1 file changed

+45
-12
lines changed

src/lib/metalua/mlc_xcall.lua

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,70 @@
33

44
mlc_xcall = { }
55

6+
7+
-- This is the back-end function, called in a separate lua process
8+
-- by `mlc_xcall.client_*()' through `os.execute()'.
9+
-- * inputs:
10+
-- * the name of a lua source file to compile in a separate process
11+
-- * the name of a writable file where the resulting ast is dumped
12+
-- with `serialize()'.
13+
-- * results:
14+
-- * an exit status of 0 or -1, depending on whethet compilation
15+
-- succeeded;
16+
-- * the ast file filled will either the serialized ast, or the
17+
-- error message.
618
function mlc_xcall.server (luafilename, astfilename)
719

820
-- We don't want these to be loaded when people only do client-side business
921
require 'metalua.compiler'
1022
require 'serialize'
1123

1224
-- compile the content of luafile name in an AST, serialized in astfilename
13-
local ast = mlc.luafile_to_ast (luafilename)
25+
local status, ast = pcall (mlc.luafile_to_ast, luafilename)
1426
local out = io.open (astfilename, 'w')
15-
out:write (serialize (ast))
16-
out:close ()
27+
if status then -- success
28+
out:write (serialize (ast))
29+
out:close ()
30+
os.exit (0)
31+
else -- failure, `ast' is actually the error message
32+
out:write (ast)
33+
out:close ()
34+
os.exit (-1)
35+
end
1736
end
1837

38+
-- Compile the file whose name is passed as argument, in a separate process,
39+
-- communicating through a temporary file.
40+
-- returns:
41+
-- * true or false, indicating whether the compilation succeeded
42+
-- * the ast, or the error message.
1943
function mlc_xcall.client_file (luafile)
2044

21-
--printf("\n\nmlc_xcall.client_file(%q)\n\n", luafile)
45+
-- printf("\n\nmlc_xcall.client_file(%q)\n\n", luafile)
2246

2347
local tmpfilename = os.tmpname()
24-
local cmd = string.format ([[lua -l metalua.mlc_xcall -e "mlc_xcall.server('%s', '%s')"]],
25-
luafile :gsub ([[\]], [[\\]]),
26-
tmpfilename :gsub([[\]], [[\\]]))
48+
local cmd = string.format (
49+
[=[lua -l metalua.mlc_xcall -e "mlc_xcall.server([[%s]], [[%s]])"]=],
50+
luafile, tmpfilename)
2751

28-
--printf("os.execute [[%s]]\n\n", cmd)
52+
-- printf("os.execute [[%s]]\n\n", cmd)
2953

30-
local ret = os.execute (cmd)
31-
if ret~=0 then error "xcall failure. FIXME: transmit failure and backtrace" end
32-
local ast = (lua_loadfile or loadfile) (tmpfilename) ()
54+
local status = (0 == os.execute (cmd))
55+
local result -- ast or error msg
56+
if status then
57+
result = (lua_loadfile or loadfile) (tmpfilename) ()
58+
else
59+
local f = io.open (tmpfilename)
60+
result = f :read '*a'
61+
f :close()
62+
end
3363
os.remove(tmpfilename)
34-
return true, ast
64+
return status, result
3565
end
3666

67+
-- Compile a source string into an ast, by dumping it in a tmp
68+
-- file then calling `mlc_xcall.client_file()'.
69+
-- returns: the same as `mlc_xcall.client_file()'.
3770
function mlc_xcall.client_literal (luasrc)
3871
local srcfilename = os.tmpname()
3972
local srcfile, msg = io.open (srcfilename, 'w')

0 commit comments

Comments
 (0)