mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
8e3721dfa8
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3031 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
62 lines
1.1 KiB
Ruby
62 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
|
|
}
|