зеркало из https://github.com/github/ruby.git
63 строки
1.1 KiB
Ruby
63 строки
1.1 KiB
Ruby
# -*- ruby -*-
|
|
|
|
require 'mkmf'
|
|
$:.unshift File.dirname(__FILE__)
|
|
require 'type'
|
|
require 'dlconfig'
|
|
|
|
def output_arg(x,i)
|
|
"args[#{i}].#{DLTYPE[x][:stmem]}"
|
|
end
|
|
|
|
def output_args(types)
|
|
t = []
|
|
types[1..-1].each_with_index{|x,i| t.push(output_arg(x,i))}
|
|
t.join(",")
|
|
end
|
|
|
|
def output_callfunc(types)
|
|
t = types[0]
|
|
stmem = DLTYPE[t][:stmem]
|
|
ctypes = types2ctypes(types)
|
|
if( t == VOID )
|
|
callstm = "(*f)(#{output_args(types)})"
|
|
else
|
|
callstm = "ret.#{stmem} = (*f)(#{output_args(types)})"
|
|
end
|
|
[ "{",
|
|
"#{ctypes[0]} (*f)(#{ctypes[1..-1].join(',')}) = func;",
|
|
"#{callstm};",
|
|
"}"].join(" ")
|
|
end
|
|
|
|
def output_case(types)
|
|
num = types2num(types)
|
|
callfunc_stm = output_callfunc(types)
|
|
<<EOF
|
|
case #{num}:
|
|
#ifdef DEBUG
|
|
printf("#{callfunc_stm}\\n");
|
|
#endif
|
|
#{callfunc_stm};
|
|
break;
|
|
EOF
|
|
end
|
|
|
|
def rec_output(types = [VOID])
|
|
print output_case(types)
|
|
if( types.length <= MAX_ARG )
|
|
DLTYPE.keys.sort.each{|t|
|
|
if( t != VOID && DLTYPE[t][:sym] )
|
|
rec_output(types + [t])
|
|
end
|
|
}
|
|
end
|
|
end
|
|
|
|
DLTYPE.keys.sort.each{|t|
|
|
if( DLTYPE[t][:sym] )
|
|
$stderr.printf(" #{DLTYPE[t][:ctype]}\n")
|
|
rec_output([t])
|
|
end
|
|
}
|