Mon, 27 Jul 2009 04:33:39 +0100
-g == --debug
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | |
45
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
2 | local cs = require "minichunkspy" |
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | function compile_string(str, name) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 | -- Strips debug info, if you're wondering :) |
45
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
6 | local chunk = string.dump(loadstring(str, name)); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
7 | if ((not opts.debug) or opts.compile_strip) and opts.compile_strip ~= false then |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
8 | local c = cs.disassemble(chunk); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
9 | local function strip_debug(c) |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
10 | c.source_lines, c.locals, c.upvalues = {}, {}, {}; |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
11 | |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
12 | for i, f in ipairs(c.prototypes) do |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
13 | strip_debug(f); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
14 | end |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
15 | end |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
16 | print_verbose("Stripping debug info..."); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
17 | strip_debug(c.body); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
18 | return cs.assemble(c); |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
19 | end |
69b3487c71cc
compile: Use minichunkspy for stripping debug info
Matthew Wild <mwild1@gmail.com>
parents:
26
diff
changeset
|
20 | return chunk; |
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | function compile_file(infile_fn, outfile_fn) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | local infile, err = io.open(infile_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | if not infile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | print_err("Can't open input file for reading: "..tostring(err)); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | return; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | local outfile, err = io.open(outfile_fn..".compiled", "w+"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | if not outfile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | print_err("Can't open output file for writing: "..tostring(err)); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | return; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | local data = infile:read("*a"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | infile:close(); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | local shebang, newdata = data:match("^(#.-\n)(.+)$"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | local code = newdata or data; |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | if shebang then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | outfile:write(shebang) |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | |
26
a22604b2f5f3
compile: Compile the correct data (fixes a traceback if there is a shebang in the input)
Matthew Wild <mwild1@gmail.com>
parents:
9
diff
changeset
|
45 | outfile:write(compile_string(code, outfile_fn)); |
9
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | os.rename(outfile_fn..".compiled", outfile_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | end |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | if opts.compile then |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | print_info("Compiling "..out_fn.."..."); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | compile_file(out_fn, out_fn); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 | print_info("OK!"); |
875ff34ab96c
compile: Compile output files to Lua bytecode
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 | end |