]> git.lizzy.rs Git - metalua.git/blob - src/compiler/bootstrap.lua
fixes on the compilation process separation through io.popen()
[metalua.git] / src / compiler / bootstrap.lua
1 -- This only serves in the bootstrapping process, it isn't
2 -- included in the final compiler. When compiled with std.lua,
3 -- mlp and bytecode modules, it is able to compile metalua
4 -- sources into .luac bytecode files.
5 -- It allows to precompile files such as
6
7
8 package.preload['metalua.mlc'] = function()
9
10    print "Loading fake metalua.mlc module for compiler bootstrapping"
11
12    mlc = { } 
13    mlc.metabugs = false
14
15    function mlc.function_of_ast (ast)
16       local  proto = bytecode.metalua_compile (ast)
17       local  dump  = bytecode.dump_string (proto)
18       local  func  = string.undump(dump) 
19       return func
20    end
21    
22    function mlc.ast_of_luastring (src)
23       local  lx  = mlp.lexer:newstream (src)
24       local  ast = mlp.chunk (lx)
25       return ast
26    end
27    
28    function mlc.function_of_luastring (src)
29       local  ast  = mlc.ast_of_luastring (src)
30       local  func = mlc.function_of_ast(ast)
31       return func
32    end
33
34    function mlc.function_of_luafile (name)
35       local f   = io.open(name, 'r')
36       local src = f:read '*a'
37       f:close()
38       return mlc.function_of_luastring (src, "@"..name)
39    end
40
41    -- don't let require() fork a separate process for *.mlua compilations.
42    package.metalua_nopopen = true
43 end
44
45 package.path = '?.luac;?.lua;../lib/?.luac;../lib/?.lua'
46
47 require 'verbose_require'
48 require 'metalua.base'
49 require 'bytecode'
50 require 'mlp'
51 require 'metalua.package2'
52
53 local function compile_file (src_filename)
54    print("Compiling "..src_filename.."... ")
55    local src_file     = io.open (src_filename, 'r')
56    local src          = src_file:read '*a'; src_file:close()
57    local ast          = mlc.ast_of_luastring (src)
58    local proto        = bytecode.metalua_compile (ast, '@'..src_filename)
59    local dump         = bytecode.dump_string (proto)
60    local dst_filename = src_filename:gsub ("%.mlua$", ".luac")
61    local dst_file     = io.open (dst_filename, 'wb')
62    dst_file:write(dump)
63    dst_file:close()
64    print("...Wrote "..dst_filename)
65 end
66
67
68 for _, x in ipairs{...} do compile_file (x) end
69