diff --git i/ext/dl/dl.c w/ext/dl/dl.c index 200c1d6..856ef78 100644 --- i/ext/dl/dl.c +++ w/ext/dl/dl.c @@ -17,6 +17,38 @@ VALUE rb_eDLTypeError; 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 (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 @@ Init_dl(void) */ 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 @@ Init_dl(void) */ 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 @@ Init_dl(void) */ 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); diff --git i/ext/dl/extconf.rb w/ext/dl/extconf.rb index 6d4d6c5..4ef46f8 100644 --- i/ext/dl/extconf.rb +++ w/ext/dl/extconf.rb @@ -25,6 +25,19 @@ else 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 diff --git i/ext/dl/lib/dl/cparser.rb w/ext/dl/lib/dl/cparser.rb index 210f953..7aae9ea 100644 --- i/ext/dl/lib/dl/cparser.rb +++ w/ext/dl/lib/dl/cparser.rb @@ -95,6 +95,16 @@ module DL 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 diff --git i/ext/dl/lib/dl/types.rb w/ext/dl/lib/dl/types.rb index 3dfa408..d5724e4 100644 --- i/ext/dl/lib/dl/types.rb +++ w/ext/dl/lib/dl/types.rb @@ -40,11 +40,7 @@ module DL 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*" diff --git i/ext/fiddle/extconf.rb w/ext/fiddle/extconf.rb index 03b0ac2..da67545 100644 --- i/ext/fiddle/extconf.rb +++ w/ext/fiddle/extconf.rb @@ -19,6 +19,20 @@ end 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("-TYPE_%s=TYPE_%s", signed||type, size) + end + if signed + check_signedness(type.downcase, "stddef.h") + end + end +end + create_makefile 'fiddle' # :startdoc: diff --git i/ext/fiddle/fiddle.c w/ext/fiddle/fiddle.c index 83c0bb5..744d2f2 100644 --- i/ext/fiddle/fiddle.c +++ w/ext/fiddle/fiddle.c @@ -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 (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,24 @@ Init_fiddle(void) */ rb_define_const(mFiddle, "TYPE_DOUBLE", INT2NUM(TYPE_DOUBLE)); + /* 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: WINDOWS * * Returns a boolean regarding whether the host is WIN32 diff --git i/test/ruby/memory_status.rb w/test/ruby/memory_status.rb index 0dbfaa3..a26452b 100644 --- i/test/ruby/memory_status.rb +++ w/test/ruby/memory_status.rb @@ -22,11 +22,7 @@ module Memory 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",