ruby/tool/compile.rb

68 строки
1.3 KiB
Ruby

require 'optparse'
require 'pp'
OutputCompileOption = {
# enable
:peephole_optimization =>true,
:inline_const_cache =>true,
# disable
:specialized_instruction =>false,
:operands_unification =>false,
:instructions_unification =>false,
:stack_caching =>false,
}
def compile_to_rb infile, outfile
iseq = VM::InstructionSequence.compile_file(infile, OutputCompileOption)
open(outfile, 'w'){|f|
f.puts "VM::InstructionSequence.load(" +
"Marshal.load(<<EOS____.unpack('m*')[0])).eval"
f.puts [Marshal.dump(iseq.to_a)].pack('m*')
f.puts "EOS____"
}
end
def compile_to_rbc infile, outfile, type
iseq = VM::InstructionSequence.compile_file(infile, OutputCompileOption)
case type
when 'm'
open(outfile, 'wb'){|f|
f.print "RBCM"
f.puts Marshal.dump(iseq.to_a, f)
}
else
raise "Unsupported compile type: #{type}"
end
end
## main
outfile = 'a.rb'
type = 'm'
opt = OptionParser.new{|opt|
opt.on('-o file'){|o|
outfile = o
}
opt.on('-t type', '--type type'){|o|
type = o
}
opt.version = '0.0.1'
}
opt.parse!(ARGV)
ARGV.each{|file|
case outfile
when /\.rb\Z/
compile_to_rb file, outfile
when /\.rbc\Z/
compile_to_rbc file, outfile, type
else
raise
end
}