mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
63 lines
1.1 KiB
Ruby
63 lines
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
|
||
|
}
|