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
8 package.preload['metalua.mlc'] = function()
10 print "Loading fake metalua.mlc module for compiler bootstrapping"
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)
22 function mlc.ast_of_luastring (src)
23 local lx = mlp.lexer:newstream (src)
24 local ast = mlp.chunk (lx)
28 function mlc.function_of_luastring (src)
29 local ast = mlc.ast_of_luastring (src)
30 local func = mlc.function_of_ast(ast)
34 function mlc.function_of_luafile (name)
35 local f = io.open(name, 'r')
36 local src = f:read '*a'
38 return mlc.function_of_luastring (src, "@"..name)
42 require 'verbose_require'
43 require 'metalua.base'
44 require 'metalua.bytecode'
46 require 'metalua.package2'
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')
59 print("...Wrote "..dst_filename)
63 for _, x in ipairs{...} do compile_file (x) end