summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Meissner <wmeissner@gmail.com>2010-01-27 19:37:11 +1000
committerWayne Meissner <wmeissner@gmail.com>2010-01-27 19:37:11 +1000
commit7c540e130aeb2fe68599ac92297a1d0c744ba3a0 (patch)
tree1be60470ec4d4385bbbc8cd04fbf203c43434abf
parent7675d69be5ceb057ad97e1abb35769ef51ae47ba (diff)
downloadffi-7c540e130aeb2fe68599ac92297a1d0c744ba3a0.tar.gz
Use Pointer#slice in inline_array_each()
-rw-r--r--ext/ffi_c/Struct.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/ext/ffi_c/Struct.c b/ext/ffi_c/Struct.c
index ada9d55..9d5895c 100644
--- a/ext/ffi_c/Struct.c
+++ b/ext/ffi_c/Struct.c
@@ -704,7 +704,9 @@ inline_array_each(VALUE self)
} else if (array->componentType->nativeType == NATIVE_STRUCT) {
for (i = 0; i < arrayType->length; ++i) {
VALUE rbOffset = UINT2NUM(inline_array_offset(array, i));
- VALUE rbPointer = rb_funcall2(array->rbMemory, rb_intern("+"), 1, &rbOffset);
+ VALUE rbLength = UINT2NUM(arrayType->length * arrayType->componentType->ffiType->size);
+ VALUE argv[2] = { rbOffset, rbLength };
+ VALUE rbPointer = rb_funcall2(array->rbMemory, rb_intern("slice"), 2, argv);
rb_yield(rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass));
}