зеркало из https://github.com/github/ruby.git
68 строки
1.3 KiB
Ruby
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
|
|
}
|
|
|