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)
41 -- don't let require() fork a separate process for *.mlua compilations.
42 package.metalua_nopopen = true
45 package.path = '?.luac;?.lua;../lib/?.luac;../lib/?.lua'
47 require 'verbose_require'
48 require 'metalua.base'
51 require 'metalua.package2'
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')
64 print("...Wrote "..dst_filename)
68 for _, x in ipairs{...} do compile_file (x) end