]> git.lizzy.rs Git - metalua.git/blob - src/lib/metalua/mlc_xcall.lua
IPC communication between processes through tmp files: avoids interferences caused...
[metalua.git] / src / lib / metalua / mlc_xcall.lua
1 -- lua -l mlc_xcall -e 'luafile_to_astfile ("/tmp/tmp12345.lua", "/tmp/tmp54321.ast")'
2 -- lua -l mlc_xcall -e 'lua_to_astfile ("/tmp/tmp54321.ast")'
3
4 mlc_xcall = { }
5
6 function mlc_xcall.server (luafilename, astfilename)
7
8    -- We don't want these to be loaded when people only do client-side business
9    require 'metalua.compiler'
10    require 'serialize'
11
12    -- compile the content of luafile name in an AST, serialized in astfilename
13    local ast = mlc.luafile_to_ast (luafilename)
14    local out = io.open (astfilename, 'w')
15    out:write (serialize (ast))
16    out:close ()
17 end
18
19 function mlc_xcall.client_file (luafile)
20
21    --printf("\n\nmlc_xcall.client_file(%q)\n\n", luafile)
22
23    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([[\]], [[\\]]))
27
28    --printf("os.execute [[%s]]\n\n", cmd)
29
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) ()
33    os.remove(tmpfilename)
34    return true, ast
35 end
36
37 function mlc_xcall.client_literal (luasrc)
38    local srcfilename = os.tmpname()
39    local srcfile, msg = io.open (srcfilename, 'w')
40    if not srcfile then print(msg) end
41    srcfile :write (luasrc)
42    srcfile :close ()
43    local status, ast = mlc_xcall.client_file (srcfilename)
44    os.remove(srcfilename)
45    return status, ast
46 end
47
48 return mlc_xcall