compile/squish.compile.lua

Mon, 27 Jul 2009 04:33:20 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 27 Jul 2009 04:33:20 +0100
changeset 45
69b3487c71cc
parent 26
a22604b2f5f3
permissions
-rw-r--r--

compile: Use minichunkspy for stripping debug info

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

mercurial