From 11dbedfaad4a9a9521ece2198a8dc491678b1902 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 29 Aug 2007 04:06:12 +0000 Subject: add tag v1_8_6_5001 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_6_5001@13304 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ruby_1_8_6/ext/dl/type.rb | 115 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 ruby_1_8_6/ext/dl/type.rb (limited to 'ruby_1_8_6/ext/dl/type.rb') diff --git a/ruby_1_8_6/ext/dl/type.rb b/ruby_1_8_6/ext/dl/type.rb new file mode 100644 index 0000000000..804420c395 --- /dev/null +++ b/ruby_1_8_6/ext/dl/type.rb @@ -0,0 +1,115 @@ +# example: +# DLTYPE[INT][:rb2c]["arg0"] => "NUM2INT(arg0)" +# DLTYPE[DOUBLE][:c2rb]["r"] => "rb_float_new(r)" + +DLTYPE = { + VOID = 0x00 => { + :name => 'VOID', + :rb2c => nil, + :c2rb => nil, + :ctype => "void", + :stmem => "v", + :sym => true, + :cb => true, + }, + CHAR = 0x01 => { + :name => 'CHAR', + :rb2c => proc{|x| "NUM2CHR(#{x})"}, + :c2rb => proc{|x| "CHR2FIX(#{x})"}, + :ctype => "char", + :stmem => "c", + :sym => false, + :cb => false, + }, + SHORT = 0x02 => { + :name => 'SHORT', + :rb2c => proc{|x| "FIX2INT(#{x})"}, + :c2rb => proc{|x| "INT2FIX(#{x})"}, + :ctype => "short", + :stmem => "h", + :sym => false, + :cb => false, + }, + INT = 0x03 => { + :name => 'INT', + :rb2c => proc{|x| "NUM2INT(#{x})"}, + :c2rb => proc{|x| "INT2NUM(#{x})"}, + :ctype => "int", + :stmem => "i", + :sym => true, + :cb => false, + }, + LONG = 0x04 => { + :name => 'LONG', + :rb2c => proc{|x| "NUM2INT(#{x})"}, + :c2rb => proc{|x| "INT2NUM(#{x})"}, + :ctype => "long", + :stmem => "l", + :sym => true, + :cb => true, + }, + FLOAT = 0x05 => { + :name => 'FLOAT', + :rb2c => proc{|x| "(float)(RFLOAT(#{x})->value)"}, + :c2rb => proc{|x| "rb_float_new((double)#{x})"}, + :ctype => "float", + :stmem => "f", + :sym => false, + :cb => false, + }, + DOUBLE = 0x06 => { + :name => 'DOUBLE', + :rb2c => proc{|x| "RFLOAT(#{x})->value"}, + :c2rb => proc{|x| "rb_float_new(#{x})"}, + :ctype => "double", + :stmem => "d", + :sym => true, + :cb => true, + }, + VOIDP = 0x07 => { + :name => 'VOIDP', + :rb2c => proc{|x| "rb_dlptr2cptr(#{x})"}, + :c2rb => proc{|x| "rb_dlptr_new(#{x},sizeof(void*),0)"}, + :ctype => "void *", + :stmem => "p", + :sym => true, + :cb => true, + }, +} + +def tpush(t, x) + (t << 3)|x +end + +def tget(t, i) + (t & (0x07 << (i * 3))) >> (i * 3) +end + +def types2num(types) + res = 0x00 + r = types.reverse + r.each{|t| + res = tpush(res,t) + } + res +end + +def num2types(num) + ts = [] + i = 0 + t = tget(num,i) + while( (t != VOID && i > 0) || (i == 0) ) + ts.push(DLTYPE[t][:ctype]) + i += 1 + t = tget(num,i) + end + ts +end + +def types2ctypes(types) + res = [] + types.each{|t| + res.push(DLTYPE[t][:ctype]) + } + res +end -- cgit v1.2.3