summaryrefslogtreecommitdiff
path: root/ext/dl/mkcallback.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dl/mkcallback.rb')
-rw-r--r--ext/dl/mkcallback.rb83
1 files changed, 83 insertions, 0 deletions
diff --git a/ext/dl/mkcallback.rb b/ext/dl/mkcallback.rb
new file mode 100644
index 0000000000..32c7b451d7
--- /dev/null
+++ b/ext/dl/mkcallback.rb
@@ -0,0 +1,83 @@
+# -*- ruby -*-
+
+require 'mkmf'
+$:.unshift File.dirname(__FILE__)
+require 'type'
+require 'dlconfig'
+
+$int_eq_long = try_run(<<EOF)
+int main() {
+ return sizeof(int) == sizeof(long) ? 0 : 1;
+}
+EOF
+
+def func_arg(x,i)
+ ctype = DLTYPE[x][:ctype]
+ "#{ctype} arg#{i}"
+end
+
+def func_args(types)
+ t = []
+ types[1..-1].each_with_index{|x,i| t.push(func_arg(x,i))}
+ t.join(", ")
+end
+
+def funcall_args(types)
+ num = types.length - 1
+ if( num > 0 )
+ t = []
+ types[1..-1].each_with_index{|x,i| t.push(DLTYPE[x][:c2rb].call("arg#{i}"))}
+ return num.to_s + ", " + t.join(", ")
+ else
+ return num.to_s
+ end
+end
+
+def output_func(types, n = 0)
+ func_name = "rb_dl_func#{types2num(types)}_#{n}"
+ code =
+ "#{func_name}(#{func_args(types)}) /* #{types2ctypes(types).inspect} */\n" +
+ "{\n" +
+ " VALUE val, obj;\n" +
+ "#ifdef DEBUG\n" +
+ " printf(\"#{func_name}()\\n\");\n" +
+ "#endif\n" +
+ " obj = rb_hash_aref(DLFuncTable, INT2NUM(#{types2num(types)}));\n" +
+ " obj = rb_hash_aref(obj,INT2NUM(#{n}));\n" +
+ " val = rb_funcall(obj, id_call,\n" +
+ " #{funcall_args(types)});\n"
+
+ rtype = DLTYPE[types[0]][:ctype]
+ rcode = DLTYPE[types[0]][:rb2c]
+ if( rcode )
+ code += " return #{rcode.call('val')};\n"
+ end
+
+ code =
+ rtype + "\n" +
+ code +
+ "}\n\n"
+ if( n < MAX_CBENT - 1)
+ return code + output_func(types, n+1)
+ else
+ return code
+ end
+end
+
+
+def rec_output(types = [VOID])
+ print output_func(types)
+ if( types.length <= MAX_CBARG )
+ DLTYPE.keys.sort.each{|t|
+ if( t != VOID && DLTYPE[t][:cb] )
+ rec_output(types + [t])
+ end
+ }
+ end
+end
+
+DLTYPE.keys.sort.each{|t|
+ if( DLTYPE[t][:cb] )
+ rec_output([t])
+ end
+}