Class: FFI::Buffer
- Inherits:
-
AbstractMemoryClass
- Object
- AbstractMemoryClass
- FFI::Buffer
- Defined in:
- ext/ffi_c/Buffer.c
Class Method Summary collapse
Instance Method Summary collapse
- #+(rbOffset) ⇒ Object
- #initialize(*args) ⇒ Object constructor
- #inspect ⇒ Object
- #slice(rbOffset, rbLength) ⇒ Object
Constructor Details
#initialize(*args) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'ext/ffi_c/Buffer.c', line 73
static VALUE
buffer_initialize(int argc, VALUE* argv, VALUE self)
{
VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil;
Buffer* p;
int nargs;
Data_Get_Struct(self, Buffer, p);
nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear);
p->memory.typeSize = rbffi_type_size(rbSize);
p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1);
p->storage = xmalloc(p->memory.size + 7);
if (p->storage == NULL) {
rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size);
return Qnil;
}
/* ensure the memory is aligned on at least a 8 byte boundary */
p->memory.address = (void *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);
if (nargs > 2 && (RTEST(rbClear) || rbClear == Qnil) && p->memory.size > 0) {
memset(p->memory.address, 0, p->memory.size);
}
if (rb_block_given_p()) {
return rb_ensure(rb_yield, self, buffer_free, self);
}
return self;
}
|
Class Method Details
.alloc_in(*args) ⇒ Object
106 107 108 109 110 |
# File 'ext/ffi_c/Buffer.c', line 106
static VALUE
buffer_alloc_inout(int argc, VALUE* argv, VALUE klass)
{
return buffer_initialize(argc, argv, buffer_allocate(klass));
}
|
.alloc_inout(*args) ⇒ Object
106 107 108 109 110 |
# File 'ext/ffi_c/Buffer.c', line 106
static VALUE
buffer_alloc_inout(int argc, VALUE* argv, VALUE klass)
{
return buffer_initialize(argc, argv, buffer_allocate(klass));
}
|
.alloc_out(*args) ⇒ Object
106 107 108 109 110 |
# File 'ext/ffi_c/Buffer.c', line 106
static VALUE
buffer_alloc_inout(int argc, VALUE* argv, VALUE klass)
{
return buffer_initialize(argc, argv, buffer_allocate(klass));
}
|
Instance Method Details
#+(rbOffset) ⇒ Object
132 133 134 135 136 137 138 139 140 141 |
# File 'ext/ffi_c/Buffer.c', line 132
static VALUE
buffer_plus(VALUE self, VALUE rbOffset)
{
Buffer* ptr;
long offset = NUM2LONG(rbOffset);
Data_Get_Struct(self, Buffer, ptr);
return slice(self, offset, ptr->memory.size - offset);
}
|
#inspect ⇒ Object
149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'ext/ffi_c/Buffer.c', line 149
static VALUE
buffer_inspect(VALUE self)
{
char tmp[100];
Buffer* ptr;
Data_Get_Struct(self, Buffer, ptr);
snprintf(tmp, sizeof(tmp), "#<FFI:Buffer:%p address=%p size=%ld>", ptr, ptr->memory.address, ptr->memory.size);
return rb_str_new2(tmp);
}
|
#slice(rbOffset, rbLength) ⇒ Object
143 144 145 146 147 |
# File 'ext/ffi_c/Buffer.c', line 143
static VALUE
buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength)
{
return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength));
}
|