]> git.lizzy.rs Git - metalua.git/blob - src/compiler/bootstrap.lua
96c3d5542cf2ec7d924c7efad9219be26f52f666
[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 end
41
42 require 'verbose_require'
43 require 'metalua.base'
44 require 'metalua.bytecode'
45 require 'metalua.mlp'
46 require 'metalua.package2'
47
48 local function compile_file (src_filename)
49    print("Compiling "..src_filename.."... ")
50    local src_file     = io.open (src_filename, 'r')
51    local src          = src_file:read '*a'; src_file:close()
52    local ast          = mlc.ast_of_luastring (src)
53    local proto        = bytecode.metalua_compile (ast, '@'..src_filename)
54    local dump         = bytecode.dump_string (proto)
55    local dst_filename = src_filename:gsub ("%.mlua$", ".luac")
56    local dst_file     = io.open (dst_filename, 'wb')
57    dst_file:write(dump)
58    dst_file:close()
59    print("...Wrote "..dst_filename)
60 end
61
62
63 for _, x in ipairs{...} do compile_file (x) end
64