summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/dl/ptr.c31
-rw-r--r--ext/dl/test/test.rb15
2 files changed, 32 insertions, 14 deletions
diff --git a/ext/dl/ptr.c b/ext/dl/ptr.c
index 7024e29740..e1cd937d49 100644
--- a/ext/dl/ptr.c
+++ b/ext/dl/ptr.c
@@ -621,33 +621,34 @@ cary2ary(void *ptr, char t, int len)
if( len == 1 ){
switch( t ){
- case 'I': case 'i':
+ case 'I':
elem = INT2NUM(*((int*)ptr));
ptr = (char *)ptr + sizeof(int);
break;
- case 'L': case 'l':
+ case 'L':
elem = DLLONG2NUM(*((long*)ptr));
ptr = (char *)ptr + sizeof(long);
break;
- case 'P': case 'p':
+ case 'P':
elem = rb_dlptr_new(*((void**)ptr),0, 0);
ptr = (char *)ptr + sizeof(void*);
break;
- case 'F': case 'f':
+ case 'F':
elem = rb_float_new(*((float*)ptr));
ptr = (char *)ptr + sizeof(float);
break;
- case 'D': case 'd':
+ case 'D':
elem = rb_float_new(*((float*)ptr));
ptr = (char *)ptr + sizeof(double);
break;
- case 'C': case 'c':
+ case 'C':
elem = INT2NUM(*((char*)ptr));
ptr = (char *)ptr + sizeof(char);
break;
- case 'H': case 'h':
+ case 'H':
elem = INT2NUM(*((short*)ptr));
ptr = (char *)ptr + sizeof(short);
+ break;
default:
rb_raise(rb_eDLTypeError, "unsupported type '%c'", t);
};
@@ -657,33 +658,34 @@ cary2ary(void *ptr, char t, int len)
ary = rb_ary_new();
for( i=0; i < len; i++ ){
switch( t ){
- case 'I': case 'i':
+ case 'I':
elem = INT2NUM(*((int*)ptr));
ptr = (char *)ptr + sizeof(int);
break;
- case 'L': case 'l':
+ case 'L':
elem = DLLONG2NUM(*((long*)ptr));
ptr = (char *)ptr + sizeof(long);
break;
- case 'P': case 'p':
+ case 'P':
elem = rb_dlptr_new(*((void**)ptr), 0, 0);
ptr = (char *)ptr + sizeof(void*);
break;
- case 'F': case 'f':
+ case 'F':
elem = rb_float_new(*((float*)ptr));
ptr = (char *)ptr + sizeof(float);
break;
- case 'D': case 'd':
+ case 'D':
elem = rb_float_new(*((float*)ptr));
ptr = (char *)ptr + sizeof(double);
break;
- case 'C': case 'c':
+ case 'C':
elem = INT2NUM(*((char*)ptr));
ptr = (char *)ptr + sizeof(char);
break;
- case 'H': case 'h':
+ case 'H':
elem = INT2NUM(*((short*)ptr));
ptr = (char *)ptr + sizeof(short);
+ break;
default:
rb_raise(rb_eDLTypeError, "unsupported type '%c'", t);
};
@@ -733,6 +735,7 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
break;
case 'P':
DLALIGN(data->ptr,offset,VOIDP_ALIGN);
+ break;
case 'F':
DLALIGN(data->ptr,offset,FLOAT_ALIGN);
break;
diff --git a/ext/dl/test/test.rb b/ext/dl/test/test.rb
index cd63ff190e..e6a7f33623 100644
--- a/ext/dl/test/test.rb
+++ b/ext/dl/test/test.rb
@@ -264,6 +264,7 @@ assert("data_aref", :must,
ptr["name"].collect{|c| c.chr}.join.split("\0")[0] == "name2")
assert("data_aref", :must,
ptr["name"].collect{|c| c.chr}.join.split("\0")[0] == "name2") unless (Fixnum === :-)
+
ptr = ptr["next"]
ptr.struct!("C1024P", :name, :next)
assert("data_aref", :must,
@@ -272,3 +273,17 @@ assert("data_aref", :must,
ptr["name"].collect{|c| c.chr}.join.split("\0")[0] == "name1") unless (Fixnum === :-)
GC.start
+
+ptr = DL::malloc(1024)
+ptr.struct!("CHIL", "c", "h", "i", "l")
+ptr["c"] = 1
+ptr["h"] = 2
+ptr["i"] = 3
+ptr["l"] = 4
+assert("struct!", :must,
+ ptr["c"] == 1 &&
+ ptr["h"] == 2 &&
+ ptr["i"] == 3 &&
+ ptr["l"] == 4)
+
+GC.start