Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tag: 1.1RC2
Fetching contributors…

Cannot retrieve contributors at this time

129 lines (111 sloc) 2.555 kB
# Run this file to regenerate all files automatically created
# from instruction information.
#
# The parameters provided points to Ruby trunk defs files
#
# ex:
# ruby yarvinsns.rb ~/src/ruby-trunk/insns.def ~/src/ruby-trunk/opt_insn_unif.def ~/src/ruby-trunk/opt_operand.def
insnsFile = ARGV[0]
uniFile = ARGV[1]
operandFile = ARGV[2]
defs = []
in_def = false
cur_def = ""
open(insnsFile) do |f|
f.each_line do |l|
if !in_def && /^DEFINE_INSN$/ =~ l
in_def = true
else
if in_def && /^\{$/ =~ l
in_def = false
defs << cur_def
cur_def = ""
end
if in_def
cur_def << l
end
end
end
end
$typeMappings = {
'ISEQ' => 'YARVMachine.InstructionSequence',
'dindex_t' => 'long',
'lindex_t' => 'long',
'num_t' => 'long',
'OFFSET' => 'long',
'CDHASH' => 'CDHASH???',
'IC' => 'IC???',
'GENTRY' => 'GENTRY???',
'ID' => 'ID???',
'VALUE' => 'IRubyObject',
'...' => :any,
}
class Value
attr_accessor :type, :name
def initialize(type, name='any')
@type, @name = $typeMappings[type], name
end
end
class Instruction
attr_accessor :name, :ops, :pops, :rets
end
instructions = []
def get_instruction(str)
i = Instruction.new
sarr = str.split(/\n/)
i.name = sarr[0]
i.ops = sarr[1][/\(.*?\)/][1..-2].split(/,/).map {|v| Value.new *v.strip.split(/ +/)}
i.pops = sarr[2][/\(.*?\)/][1..-2].split(/,/).map {|v| Value.new *v.strip.split(/ +/)}
i.rets = sarr[3][/\(.*?\)/][1..-2].split(/,/).map {|v| Value.new *v.strip.split(/ +/)}
i
end
for idef in defs
instructions << get_instruction(idef)
end
def reformat(v)
if "*" == v
'_wc_'
elsif /^int2fix\((.*)\)$/ =~ v
"int2fix_0_#{$1}_c_"
else
v
end
end
open(operandFile) do |f|
f.each do |l|
if /^#|__END__|^$/ =~ l.strip
next
end
i = Instruction.new
nm = l[/^[^ ]+/]
rest = l[nm.length+1..-1].strip
i.name = nm + "_op_" + rest.split(/, /).map {|n| reformat(n.downcase) }.join('_')
i.ops = []
i.pops = []
i.rets = []
instructions << i
end
end
open(uniFile) do |f|
f.each do |l|
if /^#|__END__|^$/ =~ l.strip
next
end
i = Instruction.new
i.name = "unified_#{l.strip.split(/ +/).join('_')}"
i.ops = []
i.pops = []
i.rets = []
instructions << i
end
end
INSTRUCTIONS = instructions
b = binding
require 'erb'
Dir["**/*.template"].each do |file|
$stderr.puts "Processing #{file}"
f = ERB.new(File.read(file))
File.open(file[0..-10],"w") do |of|
of.write(f.result(b))
end
end
Jump to Line
Something went wrong with that request. Please try again.