ruby-changes:22751
From: nobu <ko1@a...>
Date: Sat, 25 Feb 2012 14:47:31 +0900 (JST)
Subject: [ruby-changes:22751] nobu:r34800 (trunk): * ext/dl/dl.c (Init_dl): support intrinsic types, size_t, ptrdiff_t
nobu 2012-02-25 14:47:16 +0900 (Sat, 25 Feb 2012) New Revision: 34800 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34800 Log: * ext/dl/dl.c (Init_dl): support intrinsic types, size_t, ptrdiff_t and intptr_t. [ruby-core:42460][Feature #5992] * ext/fiddle/fiddle.c (Init_fiddle): ditto. * ext/dl/lib/dl/cparser.rb (DL::CParser#parse_ctype): ditto. Modified files: trunk/ChangeLog trunk/ext/dl/dl.c trunk/ext/dl/extconf.rb trunk/ext/dl/lib/dl/cparser.rb trunk/ext/dl/lib/dl/types.rb trunk/ext/fiddle/extconf.rb trunk/ext/fiddle/fiddle.c trunk/test/dl/test_cparser.rb trunk/test/dl/test_dl2.rb trunk/test/fiddle/test_fiddle.rb trunk/test/ruby/memory_status.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34799) +++ ChangeLog (revision 34800) @@ -1,3 +1,12 @@ +Sat Feb 25 14:46:54 2012 Nobuyoshi Nakada <nobu@r...> + + * ext/dl/dl.c (Init_dl): support intrinsic types, size_t, ptrdiff_t + and intptr_t. [ruby-core:42460][Feature #5992] + + * ext/fiddle/fiddle.c (Init_fiddle): ditto. + + * ext/dl/lib/dl/cparser.rb (DL::CParser#parse_ctype): ditto. + Sat Feb 25 11:08:28 2012 Tanaka Akira <akr@f...> * ext/curses/curses.c (Init_curses): use rb_define_const once for Index: ext/dl/dl.c =================================================================== --- ext/dl/dl.c (revision 34799) +++ ext/dl/dl.c (revision 34800) @@ -17,6 +17,38 @@ ID rbdl_id_cdecl; ID rbdl_id_stdcall; +#ifndef DLTYPE_SSIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT +# define DLTYPE_SSIZE_T DLTYPE_INT +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define DLTYPE_SSIZE_T DLTYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define DLTYPE_SSIZE_T DLTYPE_LONG_LONG +# endif +#endif +#define DLTYPE_SIZE_T (-1*SIGNEDNESS_OF_SIZE_T*DLTYPE_SSIZE_T) + +#ifndef DLTYPE_PTRDIFF_T +# if SIZEOF_PTRDIFF_T == SIZEOF_INT +# define DLTYPE_PTRDIFF_T DLTYPE_INT +# elif SIZEOF_PTRDIFF_T == SIZEOF_LONG +# define DLTYPE_PTRDIFF_T DLTYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG +# define DLTYPE_PTRDIFF_T DLTYPE_LONG_LONG +# endif +#endif + +#ifndef DLTYPE_INTPTR_T +# if SIZEOF_INTPTR_T == SIZEOF_INT +# define DLTYPE_INTPTR_T DLTYPE_INT +# elif SIZEOF_INTPTR_T == SIZEOF_LONG +# define DLTYPE_INTPTR_T DLTYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_INTPTR_T == SIZEOF_LONG_LONG +# define DLTYPE_INTPTR_T DLTYPE_LONG_LONG +# endif +#endif +#define DLTYPE_UINTPTR_T (-DLTYPE_INTPTR_T) + VALUE rb_dl_dlopen(int argc, VALUE argv[], VALUE self) { @@ -271,6 +303,36 @@ */ rb_define_const(rb_mDL, "TYPE_DOUBLE", INT2NUM(DLTYPE_DOUBLE)); + /* Document-const: TYPE_SIZE_T + * + * DL::CFunc type - size_t + */ + rb_define_const(rb_mDL, "TYPE_SIZE_T", INT2NUM(DLTYPE_SIZE_T)); + + /* Document-const: TYPE_SSIZE_T + * + * DL::CFunc type - ssize_t + */ + rb_define_const(rb_mDL, "TYPE_SSIZE_T", INT2NUM(DLTYPE_SSIZE_T)); + + /* Document-const: TYPE_PTRDIFF_T + * + * DL::CFunc type - ptrdiff_t + */ + rb_define_const(rb_mDL, "TYPE_PTRDIFF_T", INT2NUM(DLTYPE_PTRDIFF_T)); + + /* Document-const: TYPE_INTPTR_T + * + * DL::CFunc type - intptr_t + */ + rb_define_const(rb_mDL, "TYPE_INTPTR_T", INT2NUM(DLTYPE_INTPTR_T)); + + /* Document-const: TYPE_UINTPTR_T + * + * DL::CFunc type - uintptr_t + */ + rb_define_const(rb_mDL, "TYPE_UINTPTR_T", INT2NUM(DLTYPE_UINTPTR_T)); + /* Document-const: ALIGN_VOIDP * * The alignment size of a void* @@ -321,6 +383,36 @@ */ rb_define_const(rb_mDL, "ALIGN_DOUBLE",INT2NUM(ALIGN_DOUBLE)); + /* Document-const: ALIGN_SIZE_T + * + * The alignment size of a size_t + */ + rb_define_const(rb_mDL, "ALIGN_SIZE_T", INT2NUM(ALIGN_OF(size_t))); + + /* Document-const: ALIGN_SSIZE_T + * + * The alignment size of a ssize_t + */ + rb_define_const(rb_mDL, "ALIGN_SSIZE_T", INT2NUM(ALIGN_OF(size_t))); /* same as size_t */ + + /* Document-const: ALIGN_PTRDIFF_T + * + * The alignment size of a ptrdiff_t + */ + rb_define_const(rb_mDL, "ALIGN_PTRDIFF_T", INT2NUM(ALIGN_OF(ptrdiff_t))); + + /* Document-const: ALIGN_INTPTR_T + * + * The alignment size of a intptr_t + */ + rb_define_const(rb_mDL, "ALIGN_INTPTR_T", INT2NUM(ALIGN_OF(intptr_t))); + + /* Document-const: ALIGN_UINTPTR_T + * + * The alignment size of a uintptr_t + */ + rb_define_const(rb_mDL, "ALIGN_UINTPTR_T", INT2NUM(ALIGN_OF(uintptr_t))); + /* Document-const: SIZEOF_VOIDP * * size of a void* @@ -371,6 +463,36 @@ */ rb_define_const(rb_mDL, "SIZEOF_DOUBLE",INT2NUM(sizeof(double))); + /* Document-const: SIZEOF_SIZE_T + * + * size of a size_t + */ + rb_define_const(rb_mDL, "SIZEOF_SIZE_T", INT2NUM(sizeof(size_t))); + + /* Document-const: SIZEOF_SSIZE_T + * + * size of a ssize_t + */ + rb_define_const(rb_mDL, "SIZEOF_SSIZE_T", INT2NUM(sizeof(size_t))); /* same as size_t */ + + /* Document-const: SIZEOF_PTRDIFF_T + * + * size of a ptrdiff_t + */ + rb_define_const(rb_mDL, "SIZEOF_PTRDIFF_T", INT2NUM(sizeof(ptrdiff_t))); + + /* Document-const: SIZEOF_INTPTR_T + * + * size of a intptr_t + */ + rb_define_const(rb_mDL, "SIZEOF_INTPTR_T", INT2NUM(sizeof(intptr_t))); + + /* Document-const: SIZEOF_UINTPTR_T + * + * size of a intptr_t + */ + rb_define_const(rb_mDL, "SIZEOF_UINTPTR_T", INT2NUM(sizeof(uintptr_t))); + rb_define_module_function(rb_mDL, "dlwrap", rb_dl_value2ptr, 1); rb_define_module_function(rb_mDL, "dlunwrap", rb_dl_ptr2value, 1); Index: ext/dl/lib/dl/cparser.rb =================================================================== --- ext/dl/lib/dl/cparser.rb (revision 34799) +++ ext/dl/lib/dl/cparser.rb (revision 34800) @@ -95,6 +95,16 @@ return TYPE_FLOAT when "double" return TYPE_DOUBLE + when "size_t" + return TYPE_SIZE_T + when "ssize_t" + return TYPE_SSIZE_T + when "ptrdiff_t" + return TYPE_PTRDIFF_T + when "intptr_t" + return TYPE_INTPTR_T + when "uintptr_t" + return TYPE_UINTPTR_T when /\*/, /\[\s*\]/ return TYPE_VOIDP else Index: ext/dl/lib/dl/types.rb =================================================================== --- ext/dl/lib/dl/types.rb (revision 34799) +++ ext/dl/lib/dl/types.rb (revision 34800) @@ -40,11 +40,7 @@ typealias "UINT", "unsigned int" typealias "ULONG", "unsigned long" typealias "UCHAR", "unsigned char" - if [nil].pack('p').bytesize == 8 - typealias "HANDLE", "unsigned long long" - else - typealias "HANDLE", "unsigned long" - end + typealias "HANDLE", "uintptr_t" typealias "PHANDLE", "void*" typealias "PVOID", "void*" typealias "LPCSTR", "char*" Index: ext/dl/extconf.rb =================================================================== --- ext/dl/extconf.rb (revision 34799) +++ ext/dl/extconf.rb (revision 34800) @@ -25,6 +25,19 @@ end if check + config = File.read(RbConfig.expand(File.join($arch_hdrdir, "ruby/config.h"))) + types = {"SIZE_T"=>"SSIZE_T", "PTRDIFF_T"=>nil, "INTPTR_T"=>nil} + types.each do |type, signed| + if /^\#define\s+SIZEOF_#{type}\s+(SIZEOF_(.+)|\d+)/ =~ config + if size = $2 and size != 'VOIDP' + size = types.fetch(size) {size} + $defs << format("-DDLTYPE_%s=DLTYPE_%s", signed||type, size) + end + if signed + check_signedness(type.downcase, "stddef.h") + end + end + end $defs << %[-DRUBY_VERSION=\\"#{RUBY_VERSION}\\"] create_makefile("dl") end Index: ext/fiddle/extconf.rb =================================================================== --- ext/fiddle/extconf.rb (revision 34799) +++ ext/fiddle/extconf.rb (revision 34800) @@ -19,6 +19,20 @@ have_header 'sys/mman.h' +config = File.read(RbConfig.expand(File.join($arch_hdrdir, "ruby/config.h"))) +types = {"SIZE_T"=>"SSIZE_T", "PTRDIFF_T"=>nil, "INTPTR_T"=>nil} +types.each do |type, signed| + if /^\#define\s+SIZEOF_#{type}\s+(SIZEOF_(.+)|\d+)/ =~ config + if size = $2 and size != 'VOIDP' + size = types.fetch(size) {size} + $defs << format("-DTYPE_%s=TYPE_%s", signed||type, size) + end + if signed + check_signedness(type.downcase, "stddef.h") + end + end +end + create_makefile 'fiddle' # :startdoc: Index: ext/fiddle/fiddle.c =================================================================== --- ext/fiddle/fiddle.c (revision 34799) +++ ext/fiddle/fiddle.c (revision 34800) @@ -2,6 +2,38 @@ VALUE mFiddle; +#ifndef TYPE_SSIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT +# define TYPE_SSIZE_T TYPE_INT +# elif SIZEOF_SIZE_T == SIZEOF_LONG +# define TYPE_SSIZE_T TYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define TYPE_SSIZE_T TYPE_LONG_LONG +# endif +#endif +#define TYPE_SIZE_T (-1*SIGNEDNESS_OF_SIZE_T*TYPE_SSIZE_T) + +#ifndef TYPE_PTRDIFF_T +# if SIZEOF_PTRDIFF_T == SIZEOF_INT +# define TYPE_PTRDIFF_T TYPE_INT +# elif SIZEOF_PTRDIFF_T == SIZEOF_LONG +# define TYPE_PTRDIFF_T TYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG +# define TYPE_PTRDIFF_T TYPE_LONG_LONG +# endif +#endif + +#ifndef TYPE_INTPTR_T +# if SIZEOF_INTPTR_T == SIZEOF_INT +# define TYPE_INTPTR_T TYPE_INT +# elif SIZEOF_INTPTR_T == SIZEOF_LONG +# define TYPE_INTPTR_T TYPE_LONG +# elif defined HAVE_LONG_LONG && SIZEOF_INTPTR_T == SIZEOF_LONG_LONG +# define TYPE_INTPTR_T TYPE_LONG_LONG +# endif +#endif +#define TYPE_UINTPTR_T (-TYPE_INTPTR_T) + void Init_fiddle(void) { @@ -71,6 +103,36 @@ */ rb_define_const(mFiddle, "TYPE_DOUBLE", INT2NUM(TYPE_DOUBLE)); + /* Document-const: TYPE_SIZE_T + * + * C type - size_t + */ + rb_define_const(mFiddle, "TYPE_SIZE_T", INT2NUM(TYPE_SIZE_T)); + + /* Document-const: TYPE_SSIZE_T + * + * C type - ssize_t + */ + rb_define_const(mFiddle, "TYPE_SSIZE_T", INT2NUM(TYPE_SSIZE_T)); + + /* Document-const: TYPE_PTRDIFF_T + * + * C type - ptrdiff_t + */ + rb_define_const(mFiddle, "TYPE_PTRDIFF_T", INT2NUM(TYPE_PTRDIFF_T)); + + /* Document-const: TYPE_INTPTR_T + * + * C type - intptr_t + */ + rb_define_const(mFiddle, "TYPE_INTPTR_T", INT2NUM(TYPE_INTPTR_T)); + + /* Document-const: TYPE_UINTPTR_T + * + * C type - uintptr_t + */ + rb_define_const(mFiddle, "TYPE_UINTPTR_T", INT2NUM(TYPE_UINTPTR_T)); + /* Document-const: WINDOWS * * Returns a boolean regarding whether the host is WIN32 Index: test/ruby/memory_status.rb =================================================================== --- test/ruby/memory_status.rb (revision 34799) +++ test/ruby/memory_status.rb (revision 34800) @@ -22,11 +22,7 @@ extend DL::Importer dlload "kernel32.dll", "psapi.dll" include DL::Win32Types - if [nil].pack('p').bytesize == 8 - typealias "SIZE_T", "DWORD64" - else - typealias "SIZE_T", "DWORD32" - end + typealias "SIZE_T", "size_t" PROCESS_MEMORY_COUNTERS = struct [ "DWORD cb", Index: test/fiddle/test_fiddle.rb =================================================================== --- test/fiddle/test_fiddle.rb (revision 34799) +++ test/fiddle/test_fiddle.rb (revision 34800) @@ -15,8 +15,13 @@ :TYPE_LONG_LONG, :TYPE_FLOAT, :TYPE_DOUBLE, + :TYPE_SIZE_T, + :TYPE_SSIZE_T, + :TYPE_PTRDIFF_T, + :TYPE_INTPTR_T, + :TYPE_UINTPTR_T, ].each do |name| - assert_equal(DL.const_get(name), Fiddle.const_get(name)) + assert_equal(DL.const_get(name), Fiddle.const_get(name), "Fiddle::#{name}") end end Index: test/dl/test_cparser.rb =================================================================== --- test/dl/test_cparser.rb (revision 34799) +++ test/dl/test_cparser.rb (revision 34800) @@ -9,5 +9,25 @@ def test_uint_ctype assert_equal(-DL::TYPE_INT, parse_ctype('uint')) end + + def test_size_t_ctype + assert_equal(DL::TYPE_SIZE_T, parse_ctype("size_t")) + end + + def test_ssize_t_ctype + assert_equal(DL::TYPE_SSIZE_T, parse_ctype("ssize_t")) + end + + def test_ptrdiff_t_ctype + assert_equal(DL::TYPE_PTRDIFF_T, parse_ctype("ptrdiff_t")) + end + + def test_intptr_t_ctype + assert_equal(DL::TYPE_INTPTR_T, parse_ctype("intptr_t")) + end + + def test_uintptr_t_ctype + assert_equal(DL::TYPE_UINTPTR_T, parse_ctype("uintptr_t")) + end end end Index: test/dl/test_dl2.rb =================================================================== --- test/dl/test_dl2.rb (revision 34799) +++ test/dl/test_dl2.rb (revision 34800) @@ -151,5 +151,17 @@ ary2 = dlunwrap(addr) assert_equal(ary, ary2) end + + def test_type_size_t + assert_equal(DL::TYPE_SSIZE_T, DL::TYPE_SIZE_T.abs) + end + + def test_type_uintptr_t + assert_equal(-DL::TYPE_INTPTR_T, DL::TYPE_UINTPTR_T) + end + + def test_sizeof_uintptr_t + assert_equal(DL::SIZEOF_VOIDP, DL::SIZEOF_INTPTR_T) + end end end # module DL -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/