Merge Nakada's patch and define StringValuePtr for ruby-1.6.

CV ----------------------------------------------------------------------


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ttate 2002-04-03 11:59:01 +00:00
Родитель 493c57f65a
Коммит 74b4c81396
10 изменённых файлов: 180 добавлений и 167 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Wed Apr 3 20:42:34 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl: Merge Nakada's patch.
* ext/dl/dl.h: define StringValuePtr for ruby-1.6.
Wed Apr 3 01:54:10 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* ext/extmk.rb.in (enable_config): follow lib/mkmf.rb.

Просмотреть файл

@ -1,16 +1,17 @@
CLEANFILES = test/test.o
DISTCLEANFILES = call.func callback.func cbtable.func dlconfig.rb dlconfig.h \
test/libtest.so test/*~ *~ mkmf.log
LDSHARED_TEST = $(LDSHARED) $(LDFLAGS) test/test.o -o test/libtest.so $(LOCAL_LIBS)
libtest.so: test/libtest.so
test/libtest.so: test/test.o test/libtest.def
$(RUBY) -rftools -e 'ARGV.each{|d|File.mkpath(File.dirname(d))}' $@
`$(RUBY) -e 'print ARGV.join(" ").gsub(/dl\\.def/,"test/libtest.def")' $(LDSHARED)` $(LDFLAGS) test/test.o -o test/libtest.so
$(LDSHARED_TEST:dl.def=test/libtest.def)
test/test.o: test/test.c
test/test.o: $(srcdir)/test/test.c
@$(RUBY) -rftools -e 'File.mkpath(*ARGV)' test
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
$(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/test/test.c -o $@
test:: dl.so libtest.so .force
$(RUBY) -I. -I$(srcdir)/lib $(srcdir)/test/test.rb
@ -22,23 +23,23 @@ test:: dl.so libtest.so .force
allclean: distclean
@rm -f $(CLEANFILES) $(DISTCLEANFILES)
$(OBJS): dlconfig.h
$(OBJS): ./dlconfig.h
sym.o: call.func
dl.o: callback.func cbtable.func
call.func: mkcall.rb dlconfig.rb
call.func: $(srcdir)/mkcall.rb ./dlconfig.rb
@echo "Generating call.func"
@$(RUBY) $< > $@
@$(RUBY) $(srcdir)/mkcall.rb > $@
callback.func: mkcallback.rb dlconfig.rb
callback.func: $(srcdir)/mkcallback.rb ./dlconfig.rb
@echo "Generating callback.func"
@$(RUBY) $< > $@
@$(RUBY) $(srcdir)/mkcallback.rb > $@
cbtable.func: mkcbtable.rb dlconfig.rb
cbtable.func: $(srcdir)/mkcbtable.rb ./dlconfig.rb
@echo "Generating cbtable.func"
@$(RUBY) $< > $@
@$(RUBY) $(srcdir)/mkcbtable.rb > $@
debug:
$(MAKE) CPPFLAGS="$(CPPFLAGS) -DDEBUG"

Просмотреть файл

@ -19,7 +19,7 @@ static ID id_call;
static void
init_dl_func_table(){
#include "cbtable.func"
};
}
void *
dlmalloc(size_t size)
@ -35,7 +35,7 @@ dlmalloc(size_t size)
{
return xmalloc(size);
});
};
}
void *
dlrealloc(void *ptr, size_t size)
@ -44,7 +44,7 @@ dlrealloc(void *ptr, size_t size)
printf("dlrealloc(0x%x,%d)\n",ptr,size);
});
return xrealloc(ptr, size);
};
}
void
dlfree(void *ptr)
@ -53,7 +53,7 @@ dlfree(void *ptr)
printf("dlfree(0x%x)\n",ptr);
});
xfree(ptr);
};
}
char*
dlstrdup(const char *str)
@ -64,7 +64,7 @@ dlstrdup(const char *str)
strcpy(newstr,str);
return newstr;
};
}
size_t
dlsizeof(const char *cstr)
@ -133,7 +133,7 @@ dlsizeof(const char *cstr)
};
return size;
};
}
static float *
c_farray(VALUE v, long *size)
@ -161,7 +161,7 @@ c_farray(VALUE v, long *size)
};
return ary;
};
}
static double *
c_darray(VALUE v, long *size)
@ -189,7 +189,7 @@ c_darray(VALUE v, long *size)
};
return ary;
};
}
static long *
c_larray(VALUE v, long *size)
@ -218,7 +218,7 @@ c_larray(VALUE v, long *size)
};
return ary;
};
}
static int *
c_iarray(VALUE v, long *size)
@ -247,7 +247,7 @@ c_iarray(VALUE v, long *size)
};
return ary;
};
}
static short *
c_harray(VALUE v, long *size)
@ -276,7 +276,7 @@ c_harray(VALUE v, long *size)
};
return ary;
};
}
static char *
c_carray(VALUE v, long *size)
@ -305,7 +305,7 @@ c_carray(VALUE v, long *size)
};
return ary;
};
}
static void *
c_parray(VALUE v, long *size)
@ -323,7 +323,7 @@ c_parray(VALUE v, long *size)
case T_STRING:
{
char *str, *src;
src = STR2CSTR(e);
src = StringValuePtr(e);
str = dlstrdup(src);
ary[i] = (void*)str;
};
@ -348,7 +348,7 @@ c_parray(VALUE v, long *size)
};
return ary;
};
}
void *
rb_ary2cary(char t, VALUE v, long *size)
@ -403,7 +403,7 @@ rb_ary2cary(char t, VALUE v, long *size)
default:
rb_raise(rb_eDLTypeError, "unsupported type");
};
};
}
VALUE
rb_str_to_ptr(VALUE self)
@ -413,10 +413,10 @@ rb_str_to_ptr(VALUE self)
len = RSTRING(self)->len;
ptr = (char*)dlmalloc(len + 1);
memcpy(ptr, STR2CSTR(self), len);
memcpy(ptr, RSTRING(self)->ptr, len);
ptr[len] = '\0';
return rb_dlptr_new((void*)ptr,len,dlfree);
};
}
VALUE
rb_ary_to_ptr(int argc, VALUE argv[], VALUE self)
@ -427,14 +427,14 @@ rb_ary_to_ptr(int argc, VALUE argv[], VALUE self)
switch( rb_scan_args(argc, argv, "01", &t) ){
case 1:
ptr = rb_ary2cary(STR2CSTR(t)[0], self, &size);
ptr = rb_ary2cary(StringValuePtr(t)[0], self, &size);
break;
case 0:
ptr = rb_ary2cary(0, self, &size);
break;
};
return ptr ? rb_dlptr_new(ptr, size, dlfree) : Qnil;
};
}
VALUE
rb_io_to_ptr(VALUE self)
@ -452,7 +452,7 @@ VALUE
rb_dl_dlopen(int argc, VALUE argv[], VALUE self)
{
return rb_dlhandle_s_new(argc, argv, rb_cDLHandle);
};
}
VALUE
rb_dl_malloc(VALUE self, VALUE size)
@ -464,7 +464,7 @@ rb_dl_malloc(VALUE self, VALUE size)
ptr = dlmalloc((size_t)s);
memset(ptr,0,(size_t)s);
return rb_dlptr_new(ptr, s, dlfree);
};
}
VALUE
rb_dl_strdup(VALUE self, VALUE str)
@ -472,14 +472,14 @@ rb_dl_strdup(VALUE self, VALUE str)
void *p;
str = rb_String(str);
return rb_dlptr_new(strdup(STR2CSTR(str)), RSTRING(str)->len, dlfree);
};
return rb_dlptr_new(strdup(StringValuePtr(str)), RSTRING(str)->len, dlfree);
}
static VALUE
rb_dl_sizeof(VALUE self, VALUE str)
{
return INT2NUM(dlsizeof(STR2CSTR(str)));
};
return INT2NUM(dlsizeof(StringValuePtr(str)));
}
static VALUE
rb_dl_callback_type(VALUE str)
@ -490,7 +490,7 @@ rb_dl_callback_type(VALUE str)
long ftype;
ftype = 0;
type = STR2CSTR(str);
type = StringValuePtr(str);
len = RSTRING(str)->len;
if( len - 1 > MAX_CBARG ){
@ -517,7 +517,7 @@ rb_dl_callback_type(VALUE str)
rb_raise(rb_eDLError, "unsupported type `%c'", type[i]);
break;
};
};
}
switch( type[0] ){
case '0':
@ -544,7 +544,7 @@ rb_dl_callback_type(VALUE str)
};
return INT2NUM(ftype);
};
}
VALUE
rb_dl_set_callback(int argc, VALUE argv[], VALUE self)
@ -578,12 +578,12 @@ rb_dl_set_callback(int argc, VALUE argv[], VALUE self)
if( func ){
rb_hash_aset(entry, num, proc);
snprintf(func_name, 1023, "rb_dl_func%d_%d", NUM2INT(key), NUM2INT(num));
return rb_dlsym_new(func, func_name, STR2CSTR(types));
return rb_dlsym_new(func, func_name, StringValuePtr(types));
}
else{
return Qnil;
};
};
}
VALUE
rb_dl_get_callback(VALUE self, VALUE types, VALUE num)
@ -597,7 +597,7 @@ rb_dl_get_callback(VALUE self, VALUE types, VALUE num)
return Qnil;
};
return rb_hash_aref(entry, num);
};
}
void
Init_dl()
@ -652,4 +652,4 @@ Init_dl()
rb_define_method(rb_cString, "to_ptr", rb_str_to_ptr, 0);
rb_define_method(rb_cArray, "to_ptr", rb_ary_to_ptr, -1);
rb_define_method(rb_cIO, "to_ptr", rb_io_to_ptr, 0);
};
}

Просмотреть файл

@ -8,6 +8,11 @@
#include <ruby.h>
#include <dlconfig.h>
#define DL_VERSION "1.1.0"
#define DL_MAJOR_VERSION 1
#define DL_MINOR_VERSION 1
#define DL_PATCH_VERSION 0
#if defined(HAVE_DLFCN_H)
# include <dlfcn.h>
#else
@ -23,6 +28,13 @@
# endif
#endif
#if !defined(StringValue)
# define StringValue(v) if(TYPE(v) != T_STRING) v = rb_str_to_str(v)
#endif
#if !defined(StringValuePtr)
# define StringValuePtr(v) RSTRING((TYPE(v) == T_STRING) ? (v) : rb_str_to_str(v))->ptr
#endif
#ifdef DEBUG
#define DEBUG_CODE(b) {printf("DEBUG:%d\n",__LINE__);b;}
#define DEBUG_CODE2(b1,b2) {printf("DEBUG:%d\n",__LINE__);b1;}
@ -31,11 +43,6 @@
#define DEBUG_CODE2(b1,b2) b2
#endif
#define DL_VERSION "1.1.0"
#define DL_MAJOR_VERSION 1
#define DL_MINOR_VERSION 1
#define DL_PATCH_VERSION 0
#define VOID_DLTYPE 0x00
#define CHAR_DLTYPE 0x01
#define SHORT_DLTYPE 0x02
@ -203,7 +210,7 @@ typedef struct { char c; double x; } s_double;
#define DOUBLE_ALIGN ALIGN_DOUBLE
#define DLALIGN(ptr,offset,align) {\
while( (((unsigned long)(ptr + offset)) % align) != 0 ) offset++;\
while( (((unsigned long)((char *)ptr + offset)) % align) != 0 ) offset++;\
}
typedef void (*freefunc_t)(void *);

Просмотреть файл

@ -20,8 +20,7 @@ end
($CPPFLAGS || $CFLAGS) << " -I."
case RUBY_PLATFORM # from Win32API
when /cygwin/,/mingw/
if (Config::CONFIG['CC'] =~ /gcc/) # from Win32API
$CFLAGS << " -fno-defer-pop -fno-omit-frame-pointer"
end
@ -56,11 +55,11 @@ $with_type_voidp &= DLTYPE[VOIDP][:sym]
$with_cbtype_voidp = DLTYPE[VOIDP][:cb]
$with_type_char = with_config("type-char") ? true : false
$with_type_short = with_config("type-short") ? true : false
$with_type_float = with_config("type-float") ? true : false
$with_type_char = enable_config("type-char", $with_type_char)
$with_type_short = enable_config("type-short", $with_type_short)
$with_type_float = enable_config("type-float", $with_type_float)
$with_asm = with_config("asm") ? true : $with_asm
$with_asm = enable_config("asm", $with_asm)
args = with_config("args")
max_arg = max_cbarg = max_cbent = nil

Просмотреть файл

@ -13,7 +13,7 @@ dlhandle_free(struct dl_handle *dlhandle)
if( dlhandle->ptr && dlhandle->open && dlhandle->enable_close ){
dlclose(dlhandle->ptr);
};
};
}
VALUE
rb_dlhandle_close(VALUE self)
@ -23,7 +23,7 @@ rb_dlhandle_close(VALUE self)
Data_Get_Struct(self, struct dl_handle, dlhandle);
dlhandle->open = 0;
return INT2NUM(dlclose(dlhandle->ptr));
};
}
VALUE
rb_dlhandle_s_new(int argc, VALUE argv[], VALUE self)
@ -38,11 +38,11 @@ rb_dlhandle_s_new(int argc, VALUE argv[], VALUE self)
switch( rb_scan_args(argc, argv, "11", &lib, &flag) ){
case 1:
clib = STR2CSTR(lib);
clib = StringValuePtr(lib);
cflag = RTLD_LAZY | RTLD_GLOBAL;
break;
case 2:
clib = STR2CSTR(lib);
clib = StringValuePtr(lib);
cflag = NUM2INT(flag);
break;
default:
@ -73,13 +73,13 @@ rb_dlhandle_s_new(int argc, VALUE argv[], VALUE self)
};
return val;
};
}
VALUE
rb_dlhandle_init(int argc, VALUE argv[], VALUE self)
{
return Qnil;
};
}
VALUE
rb_dlhandle_enable_close(VALUE self)
@ -89,7 +89,7 @@ rb_dlhandle_enable_close(VALUE self)
Data_Get_Struct(self, struct dl_handle, dlhandle);
dlhandle->enable_close = 1;
return Qnil;
};
}
VALUE
rb_dlhandle_disable_close(VALUE self)
@ -99,7 +99,7 @@ rb_dlhandle_disable_close(VALUE self)
Data_Get_Struct(self, struct dl_handle, dlhandle);
dlhandle->enable_close = 0;
return Qnil;
};
}
VALUE
rb_dlhandle_to_i(VALUE self)
@ -108,7 +108,7 @@ rb_dlhandle_to_i(VALUE self)
Data_Get_Struct(self, struct dl_handle, dlhandle);
return DLLONG2NUM(dlhandle);
};
}
VALUE
rb_dlhandle_to_ptr(VALUE self)
@ -117,7 +117,7 @@ rb_dlhandle_to_ptr(VALUE self)
Data_Get_Struct(self, struct dl_handle, dlhandle);
return rb_dlptr_new(dlhandle, sizeof(dlhandle), 0);
};
}
VALUE
rb_dlhandle_sym(int argc, VALUE argv[], VALUE self)
@ -134,8 +134,7 @@ rb_dlhandle_sym(int argc, VALUE argv[], VALUE self)
const char *err;
if( rb_scan_args(argc, argv, "11", &sym, &type) == 2 ){
Check_Type(type, T_STRING);
stype = STR2CSTR(type);
stype = StringValuePtr(type);
}
else{
stype = NULL;
@ -149,8 +148,7 @@ rb_dlhandle_sym(int argc, VALUE argv[], VALUE self)
#endif
}
else{
Check_Type(sym, T_STRING);
name = STR2CSTR(sym);
name = StringValuePtr(sym);
};
@ -189,7 +187,7 @@ rb_dlhandle_sym(int argc, VALUE argv[], VALUE self)
val = rb_dlsym_new(func, name, stype);
return val;
};
}
void
Init_dlhandle()
@ -204,4 +202,4 @@ Init_dlhandle()
rb_define_method(rb_cDLHandle, "[]", rb_dlhandle_sym, -1);
rb_define_method(rb_cDLHandle, "disable_close", rb_dlhandle_disable_close, 0);
rb_define_method(rb_cDLHandle, "enable_close", rb_dlhandle_enable_close, 0);
};
}

Просмотреть файл

@ -26,7 +26,7 @@ static void
rb_dlmem_delete(void *ptr)
{
rb_hash_delete(DLMemoryTable, DLLONG2NUM(ptr));
};
}
static void
rb_dlmem_aset(void *ptr, VALUE obj)
@ -37,7 +37,7 @@ rb_dlmem_aset(void *ptr, VALUE obj)
else{
rb_hash_aset(DLMemoryTable, DLLONG2NUM(ptr), DLLONG2NUM(obj));
};
};
}
static VALUE
rb_dlmem_aref(void *ptr)
@ -46,7 +46,7 @@ rb_dlmem_aref(void *ptr)
val = rb_hash_aref(DLMemoryTable, DLLONG2NUM(ptr));
return val == Qnil ? Qnil : (VALUE)DLNUM2LONG(val);
};
}
void
dlptr_free(struct ptr_data *data)
@ -67,7 +67,7 @@ dlptr_free(struct ptr_data *data)
if( data->stype ) dlfree(data->stype);
if( data->ssize ) dlfree(data->ssize);
if( data->ids ) dlfree(data->ids);
};
}
void
dlptr_init(VALUE val)
@ -80,7 +80,7 @@ dlptr_init(VALUE val)
data->ptr);
});
rb_dlmem_aset(data->ptr, val);
};
}
VALUE
rb_dlptr_new(void *ptr, long size, freefunc_t func)
@ -116,13 +116,13 @@ rb_dlptr_new(void *ptr, long size, freefunc_t func)
};
return val;
};
}
VALUE
rb_dlptr_alloc(long size, freefunc_t func)
{
return rb_dlptr_new(dlmalloc((size_t)size), size, func);
};
}
void *
rb_dlptr2cptr(VALUE val)
@ -142,14 +142,14 @@ rb_dlptr2cptr(VALUE val)
};
return ptr;
};
}
static VALUE
rb_dlptr_s_new(int argc, VALUE argv[], VALUE klass)
{
VALUE ptr, sym, obj, size;
void *p = NULL;
void (*f)() = NULL;
freefunc_t f = NULL;
long s = 0;
switch( rb_scan_args(argc, argv, "12", &ptr, &size, &sym) ){
@ -174,14 +174,14 @@ rb_dlptr_s_new(int argc, VALUE argv[], VALUE klass)
rb_obj_call_init(obj, argc, argv);
return obj;
};
}
static VALUE
rb_dlptr_s_alloc(int argc, VALUE argv[], VALUE klass)
{
VALUE size, sym, obj;
int s;
void (*f)() = NULL;
freefunc_t f = NULL;
switch( rb_scan_args(argc, argv, "11", &size, &sym) ){
case 1:
@ -200,13 +200,13 @@ rb_dlptr_s_alloc(int argc, VALUE argv[], VALUE klass)
rb_obj_call_init(obj, argc, argv);
return obj;
};
}
static VALUE
rb_dlptr_init(int argc, VALUE argv[], VALUE self)
{
return Qnil;
};
}
static VALUE
rb_dlptr_cast(int argc, VALUE argv[], VALUE self)
@ -244,7 +244,7 @@ rb_dlptr_cast(int argc, VALUE argv[], VALUE self)
RDATA(val)->dfree = 0;
return Qnil;
};
}
VALUE
rb_dlptr_to_i(VALUE self)
@ -253,7 +253,7 @@ rb_dlptr_to_i(VALUE self)
Data_Get_Struct(self, struct ptr_data, data);
return DLLONG2NUM(data->ptr);
};
}
VALUE
rb_dlptr_ptr(VALUE self)
@ -262,7 +262,7 @@ rb_dlptr_ptr(VALUE self)
Data_Get_Struct(self, struct ptr_data, data);
return rb_dlptr_new(*((void**)(data->ptr)),0,0);
};
}
VALUE
rb_dlptr_ref(VALUE self)
@ -271,7 +271,7 @@ rb_dlptr_ref(VALUE self)
Data_Get_Struct(self, struct ptr_data, data);
return rb_dlptr_new(&(data->ptr),0,0);
};
}
VALUE
rb_dlptr_null_p(VALUE self)
@ -280,7 +280,7 @@ rb_dlptr_null_p(VALUE self)
Data_Get_Struct(self, struct ptr_data, data);
return data->ptr ? Qfalse : Qtrue;
};
}
VALUE
rb_dlptr_free_set(VALUE self, VALUE val)
@ -293,7 +293,7 @@ rb_dlptr_free_set(VALUE self, VALUE val)
data->free = DLFREEFUNC(rb_dlsym2csym(val));
return Qnil;
};
}
VALUE
rb_dlptr_free_get(VALUE self)
@ -303,7 +303,7 @@ rb_dlptr_free_get(VALUE self)
Data_Get_Struct(self, struct ptr_data, pdata);
return rb_dlsym_new(pdata->free,"(free)","0P");
};
}
VALUE
rb_dlptr_to_array(int argc, VALUE argv[], VALUE self)
@ -319,11 +319,11 @@ rb_dlptr_to_array(int argc, VALUE argv[], VALUE self)
switch( rb_scan_args(argc, argv, "11", &type, &size) ){
case 2:
t = STR2CSTR(type)[0];
t = StringValuePtr(type)[0];
n = NUM2INT(size);
break;
case 1:
t = STR2CSTR(type)[0];
t = StringValuePtr(type)[0];
switch( t ){
case 'C':
n = data->size;
@ -416,7 +416,7 @@ rb_dlptr_to_array(int argc, VALUE argv[], VALUE self)
};
return ary;
};
}
VALUE
@ -440,7 +440,7 @@ rb_dlptr_to_s(int argc, VALUE argv[], VALUE self)
};
return val;
};
}
VALUE
rb_dlptr_to_str(int argc, VALUE argv[], VALUE self)
@ -463,7 +463,7 @@ rb_dlptr_to_str(int argc, VALUE argv[], VALUE self)
};
return val;
};
}
VALUE
rb_dlptr_inspect(VALUE self)
@ -476,7 +476,7 @@ rb_dlptr_inspect(VALUE self)
snprintf(str, 1023, "#<%s:0x%x ptr=0x%x size=%ld free=0x%x>",
rb_class2name(CLASS_OF(self)), data, data->ptr, data->size, data->free);
return rb_str_new2(str);
};
}
VALUE
rb_dlptr_eql(VALUE self, VALUE other)
@ -486,7 +486,7 @@ rb_dlptr_eql(VALUE self, VALUE other)
ptr2 = rb_dlptr2cptr(other);
return ptr1 == ptr2 ? Qtrue : Qfalse;
};
}
VALUE
rb_dlptr_cmp(VALUE self, VALUE other)
@ -495,7 +495,7 @@ rb_dlptr_cmp(VALUE self, VALUE other)
ptr1 = rb_dlptr2cptr(self);
ptr2 = rb_dlptr2cptr(other);
return DLLONG2NUM((long)ptr1 - (long)ptr2);
};
}
VALUE
rb_dlptr_plus(VALUE self, VALUE other)
@ -506,8 +506,8 @@ rb_dlptr_plus(VALUE self, VALUE other)
ptr = rb_dlptr2cptr(self);
size = RDLPTR(self)->size;
num = DLNUM2LONG(other);
return rb_dlptr_new((void*)(ptr + num), size - num, 0);
};
return rb_dlptr_new((char *)ptr + num, size - num, 0);
}
VALUE
rb_dlptr_minus(VALUE self, VALUE other)
@ -518,8 +518,8 @@ rb_dlptr_minus(VALUE self, VALUE other)
ptr = rb_dlptr2cptr(self);
size = RDLPTR(self)->size;
num = DLNUM2LONG(other);
return rb_dlptr_new((void*)(ptr - num), size + num, 0);
};
return rb_dlptr_new((char *)ptr - num, size + num, 0);
}
VALUE
rb_dlptr_define_data_type(int argc, VALUE argv[], VALUE self)
@ -553,10 +553,9 @@ rb_dlptr_define_data_type(int argc, VALUE argv[], VALUE self)
};
};
Check_Type(data_type, T_FIXNUM);
Check_Type(type, T_STRING);
t = NUM2INT(data_type);
StringValue(type);
Check_Type(rest, T_ARRAY);
t = FIX2INT(data_type);
num = RARRAY(rest)->len;
for( i=0; i<num; i++ ){
vid = rb_ary_entry(rest,i);
@ -575,7 +574,7 @@ rb_dlptr_define_data_type(int argc, VALUE argv[], VALUE self)
if( data->ids ) dlfree(data->ids);
data->ids = (ID*)dlmalloc(sizeof(ID) * data->ids_num);
ctype = STR2CSTR(type);
ctype = StringValuePtr(type);
for( i=0; i<num; i++ ){
vid = rb_ary_entry(rest,i);
data->ids[i] = rb_to_id(vid);
@ -600,10 +599,10 @@ rb_dlptr_define_data_type(int argc, VALUE argv[], VALUE self)
};
if( !data->size )
data->size = dlsizeof(STR2CSTR(type));
data->size = dlsizeof(RSTRING(type)->ptr);
return Qnil;
};
}
VALUE
rb_dlptr_define_struct(int argc, VALUE argv[], VALUE self)
@ -618,7 +617,7 @@ rb_dlptr_define_struct(int argc, VALUE argv[], VALUE self)
pass_argv[i] = argv[i-1];
};
return rb_dlptr_define_data_type(pass_argc, pass_argv, self);
};
}
VALUE
rb_dlptr_define_union(int argc, VALUE argv[], VALUE self)
@ -633,7 +632,7 @@ rb_dlptr_define_union(int argc, VALUE argv[], VALUE self)
pass_argv[i] = argv[i-1];
};
return rb_dlptr_define_data_type(pass_argc, pass_argv, self);
};
}
VALUE
rb_dlptr_get_data_type(VALUE self)
@ -646,7 +645,7 @@ rb_dlptr_get_data_type(VALUE self)
rb_tainted_str_new(data->stype, data->slen));
else
return rb_assoc_new(INT2FIX(data->ctype), Qnil);
};
}
static VALUE
cary2ary(void *ptr, char t, int len)
@ -662,31 +661,31 @@ cary2ary(void *ptr, char t, int len)
switch( t ){
case 'I': case 'i':
elem = INT2NUM(*((int*)ptr));
ptr += sizeof(int);
ptr = (char *)ptr + sizeof(int);
break;
case 'L': case 'l':
elem = DLLONG2NUM(*((long*)ptr));
ptr += sizeof(long);
ptr = (char *)ptr + sizeof(long);
break;
case 'P': case 'p':
elem = rb_dlptr_new(*((void**)ptr),0, 0);
ptr += sizeof(void*);
ptr = (char *)ptr + sizeof(void*);
break;
case 'F': case 'f':
elem = rb_float_new(*((float*)ptr));
ptr += sizeof(float);
ptr = (char *)ptr + sizeof(float);
break;
case 'D': case 'd':
elem = rb_float_new(*((float*)ptr));
ptr += sizeof(double);
ptr = (char *)ptr + sizeof(double);
break;
case 'C': case 'c':
elem = INT2NUM(*((char*)ptr));
ptr += sizeof(char);
ptr = (char *)ptr + sizeof(char);
break;
case 'H': case 'h':
elem = INT2NUM(*((short*)ptr));
ptr += sizeof(short);
ptr = (char *)ptr + sizeof(short);
default:
raise(rb_eDLTypeError, "unsupported type '%c'", t);
};
@ -698,31 +697,31 @@ cary2ary(void *ptr, char t, int len)
switch( t ){
case 'I': case 'i':
elem = INT2NUM(*((int*)ptr));
ptr += sizeof(int);
ptr = (char *)ptr + sizeof(int);
break;
case 'L': case 'l':
elem = DLLONG2NUM(*((long*)ptr));
ptr += sizeof(long);
ptr = (char *)ptr + sizeof(long);
break;
case 'P': case 'p':
elem = rb_dlptr_new(*((void**)ptr), 0, 0);
ptr += sizeof(void*);
ptr = (char *)ptr + sizeof(void*);
break;
case 'F': case 'f':
elem = rb_float_new(*((float*)ptr));
ptr += sizeof(float);
ptr = (char *)ptr + sizeof(float);
break;
case 'D': case 'd':
elem = rb_float_new(*((float*)ptr));
ptr += sizeof(double);
ptr = (char *)ptr + sizeof(double);
break;
case 'C': case 'c':
elem = INT2NUM(*((char*)ptr));
ptr += sizeof(char);
ptr = (char *)ptr + sizeof(char);
break;
case 'H': case 'h':
elem = INT2NUM(*((short*)ptr));
ptr += sizeof(short);
ptr = (char *)ptr + sizeof(short);
default:
raise(rb_eDLTypeError, "unsupported type '%c'", t);
};
@ -730,7 +729,7 @@ cary2ary(void *ptr, char t, int len)
};
return ary;
};
}
VALUE
rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
@ -757,9 +756,9 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
id = rb_to_id(key);
Data_Get_Struct(self, struct ptr_data, data);
offset = 0;
switch( data->ctype ){
case DLPTR_CTYPE_STRUCT:
offset = 0;
for( i=0; i < data->ids_num; i++ ){
if( data->ids[i] == id ){
switch( data->stype[i] ){
@ -785,7 +784,7 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
default:
raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]);
};
return cary2ary(data->ptr + offset, data->stype[i], data->ssize[i]);
return cary2ary((char *)data->ptr + offset, data->stype[i], data->ssize[i]);
};
switch( data->stype[i] ){
case 'I':
@ -824,7 +823,7 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
case DLPTR_CTYPE_UNION:
for( i=0; i < data->ids_num; i++ ){
if( data->ids[i] == id ){
return cary2ary(data->ptr + offset, data->stype[i], data->ssize[i]);
return cary2ary((char *)data->ptr + offset, data->stype[i], data->ssize[i]);
};
};
break;
@ -834,7 +833,7 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
rb_id2name(id), rb_class2name(CLASS_OF(self)));
return Qnil;
};
}
static void *
ary2cary(char t, VALUE val, long *size)
@ -848,7 +847,7 @@ ary2cary(char t, VALUE val, long *size)
ptr = rb_ary2cary(t, rb_ary_new3(1, val), size);
};
return ptr;
};
}
VALUE
rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
@ -872,10 +871,10 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
void *dst, *src;
int len;
Check_Type(val, T_STRING);
StringValue(val);
Data_Get_Struct(self, struct ptr_data, data);
dst = (void*)((long)(data->ptr) + DLNUM2LONG(key));
src = STR2CSTR(val);
src = RSTRING(val)->ptr;
if( num == Qnil ){
len = RSTRING(val)->len;
}
@ -922,7 +921,7 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
raise(rb_eDLTypeError, "unsupported type '%c'", data->stype[i]);
};
memimg = ary2cary(data->stype[i], val, &memsize);
memcpy(data->ptr + offset, memimg, memsize);
memcpy((char *)data->ptr + offset, memimg, memsize);
return val;
};
switch( data->stype[i] ){
@ -1000,21 +999,21 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
rb_id2name(id), rb_class2name(CLASS_OF(self)));
return Qnil;
};
}
VALUE
rb_dlptr_size(int argc, VALUE argv[], VALUE self)
{
VALUE size;
switch( rb_scan_args(argc, argv, "01", &size) ){
case 0:
if( rb_scan_args(argc, argv, "01", &size) == 0){
return DLLONG2NUM(RDLPTR(self)->size);
case 1:
}
else{
RDLPTR(self)->size = DLNUM2LONG(size);
return size;
};
};
}
static VALUE
dlmem_each_i(VALUE assoc, void *data)
@ -1024,14 +1023,14 @@ dlmem_each_i(VALUE assoc, void *data)
val = rb_ary_entry(assoc, 1);
rb_yield(rb_assoc_new(key,(VALUE)DLNUM2LONG(val)));
return Qnil;
};
}
VALUE
rb_dlmem_each(VALUE self)
{
rb_iterate(rb_each, DLMemoryTable, dlmem_each_i, 0);
return Qnil;
};
}
void
Init_dlptr()
@ -1072,4 +1071,4 @@ Init_dlptr()
DLMemoryTable = rb_hash_new();
rb_define_const(rb_mDLMemorySpace, "MemoryTable", DLMemoryTable);
rb_define_module_function(rb_mDLMemorySpace, "each", rb_dlmem_each, 0);
};
}

Просмотреть файл

@ -59,7 +59,7 @@ char2type(int ch)
return "[]"; /* ?? */
};
return NULL;
};
}
void
dlsym_free(struct sym_data *data)
@ -76,7 +76,7 @@ dlsym_free(struct sym_data *data)
});
free(data->type);
};
};
}
VALUE
rb_dlsym_new(void (*func)(), const char *name, const char *type)
@ -112,13 +112,13 @@ rb_dlsym_new(void (*func)(), const char *name, const char *type)
};
return val;
};
}
freefunc_t
rb_dlsym2csym(VALUE val)
{
struct sym_data *data;
void (*func)();
freefunc_t func;
if( rb_obj_is_kind_of(val, rb_cDLSymbol) ){
Data_Get_Struct(val, struct sym_data, data);
@ -132,7 +132,7 @@ rb_dlsym2csym(VALUE val)
};
return func;
};
}
VALUE
rb_dlsym_s_new(int argc, VALUE argv[], VALUE self)
@ -154,8 +154,8 @@ rb_dlsym_s_new(int argc, VALUE argv[], VALUE self)
};
saddr = (void*)(DLNUM2LONG(rb_Integer(addr)));
sname = (name == Qnil) ? NULL : STR2CSTR(name);
stype = (type == Qnil) ? NULL : STR2CSTR(type);
sname = NIL_P(name) ? NULL : StringValuePtr(name);
stype = NIL_P(type) ? NULL : StringValuePtr(type);
val = rb_dlsym_new(saddr, sname, stype);
@ -164,26 +164,26 @@ rb_dlsym_s_new(int argc, VALUE argv[], VALUE self)
};
return val;
};
}
VALUE
rb_dlsym_initialize(int argc, VALUE argv[], VALUE self)
{
return Qnil;
};
}
VALUE
rb_s_dlsym_char2type(VALUE self, VALUE ch)
{
const char *type;
type = char2type(STR2CSTR(ch)[0]);
type = char2type(StringValuePtr(ch)[0]);
if (type == NULL)
return Qnil;
else
return rb_str_new2(type);
};
}
VALUE
rb_dlsym_name(VALUE self)
@ -192,7 +192,7 @@ rb_dlsym_name(VALUE self)
Data_Get_Struct(self, struct sym_data, sym);
return sym->name ? rb_tainted_str_new2(sym->name) : Qnil;
};
}
VALUE
rb_dlsym_proto(VALUE self)
@ -201,7 +201,7 @@ rb_dlsym_proto(VALUE self)
Data_Get_Struct(self, struct sym_data, sym);
return sym->type ? rb_tainted_str_new2(sym->type) : Qnil;
};
}
VALUE
rb_dlsym_cproto(VALUE self)
@ -252,7 +252,7 @@ rb_dlsym_cproto(VALUE self)
};
return val;
};
}
VALUE
rb_dlsym_inspect(VALUE self)
@ -270,12 +270,12 @@ rb_dlsym_inspect(VALUE self)
str = dlmalloc(str_size);
snprintf(str, str_size - 1,
"#<DL::Symbol:0x%x func=0x%x '%s'>",
sym, sym->func, STR2CSTR(proto));
sym, sym->func, StringValuePtr(proto));
val = rb_tainted_str_new2(str);
dlfree(str);
return val;
};
}
VALUE
@ -418,7 +418,7 @@ rb_dlsym_call(int argc, VALUE argv[], VALUE self)
ANY2S(args[i]) = DLSTR(0);
}
else{
ANY2S(args[i]) = DLSTR(STR2CSTR(argv[i]));
ANY2S(args[i]) = DLSTR(StringValuePtr(argv[i]));
};
PUSH_P(ftype);
break;
@ -427,7 +427,7 @@ rb_dlsym_call(int argc, VALUE argv[], VALUE self)
raise(rb_eDLError, "#%d must be a string",i);
};
ANY2S(args[i]) = DLSTR(dlmalloc(RSTRING(argv[i])->len + 1));
memcpy((char*)(ANY2S(args[i])), STR2CSTR(argv[i]), RSTRING(argv[i])->len + 1);
memcpy((char*)(ANY2S(args[i])), StringValuePtr(argv[i]), RSTRING(argv[i])->len + 1);
dtypes[i] = 's';
PUSH_P(ftype);
break;
@ -732,7 +732,7 @@ rb_dlsym_call(int argc, VALUE argv[], VALUE self)
#undef FREE_ARGS
return rb_assoc_new(val,dvals);
};
}
VALUE
rb_dlsym_to_i(VALUE self)
@ -741,7 +741,7 @@ rb_dlsym_to_i(VALUE self)
Data_Get_Struct(self, struct sym_data, sym);
return DLLONG2NUM(sym);
};
}
VALUE
rb_dlsym_to_ptr(VALUE self)
@ -750,7 +750,7 @@ rb_dlsym_to_ptr(VALUE self)
Data_Get_Struct(self, struct sym_data, sym);
return rb_dlptr_new(sym->func, sizeof(freefunc_t), 0);
};
}
void
Init_dlsym()
@ -768,4 +768,4 @@ Init_dlsym()
rb_define_method(rb_cDLSymbol, "to_s", rb_dlsym_cproto, 0);
rb_define_method(rb_cDLSymbol, "to_ptr", rb_dlsym_to_ptr, 0);
rb_define_method(rb_cDLSymbol, "to_i", rb_dlsym_to_i, 0);
};
}

Просмотреть файл

@ -221,7 +221,8 @@ test_data_add(struct test_data *list, const char *name)
struct test_data *data;
data = (struct test_data *)malloc(sizeof(struct test_data));
strcpy(data->name, name);
memset(data->name, 0, 1024);
strncpy(data->name, name, 1024);
data->next = list->next;
list->next = data;
};
@ -236,7 +237,7 @@ test_data_print(struct test_data *list)
};
};
struct data *
struct test_data *
test_data_aref(struct test_data *list, int i)
{
struct test_data *data;

Просмотреть файл

@ -184,10 +184,12 @@ if( fp )
r,rs = sym_gets[" " * 256, 256, fp]
debug r,rs
assert("open,gets", :must, rs[0] == line)
ObjectSpace.define_finalizer(fp) {File.unlink("tmp.txt")}
fp = nil
else
assert("open,gets", :must, line == nil)
File.unlink("tmp.txt")
end
File.unlink("tmp.txt")
callback1 = h["test_callback1"]