Class: FFI::AbstractMemory
| Relationships & Source Files | |
| Extension / Inclusion / Inheritance Descendants | |
|
Subclasses:
|
|
| Inherits: | Object |
| Defined in: | ext/ffi_c/AbstractMemory.c, lib/ffi/abstract_memory.rb |
Overview
AbstractMemory is the base class for many memory management classes such as Buffer.
This class has a lot of methods to work with integers :
-
put_intsize(offset, value)
-
get_intsize(offset)
-
put_uintsize(offset, value)
-
get_uintsize(offset)
-
writeuintsize(value)
-
read_intsize
-
write_uintsize(value)
-
read_uintsize
-
put_array_of_intsize(offset, ary)
-
get_array_of_intsize(offset, length)
-
put_array_of_uintsize(offset, ary)
-
get_array_of_uintsize(offset, length)
-
write_array_of_intsize(ary)
-
read_array_of_intsize(length)
-
write_array_of_uintsize(ary)
-
read_array_of_uintsize(length)
where size is 8, 16, 32 or 64. Same methods exist for long type.
Aliases exist : char for int8, short for int16, int for int32 and long_long for int64.
Others methods are listed below.
Constant Summary
-
LONG_MAX =
private
# File 'lib/ffi/abstract_memory.rb', line 34FFI::Pointer.new(1).size
Instance Attribute Summary
-
#size_limit? ⇒ Boolean
readonly
Return
trueifselfhas a size limit.
Instance Method Summary
- #[](idx)
- #__copy_from__(rbsrc, rblen)
- #clear
-
#freeze
Freeze the
AbstractMemoryobject and unset the writable flag. - #get(type, offset)
- #get_array_of_double (also: #get_array_of_float64)
- #get_array_of_float (also: #get_array_of_float32)
-
#get_array_of_float32
Alias for #get_array_of_float.
-
#get_array_of_float64
Alias for #get_array_of_double.
- #get_array_of_pointer
- #get_array_of_string(offset, count = nil)
- #get_bytes(offset, length)
- #get_double (also: #get_float64)
- #get_float (also: #get_float32)
-
#get_float32
Alias for #get_float.
-
#get_float64
Alias for #get_double.
- #get_pointer
- #get_string(offset, length = nil)
- #put(type, offset, value)
- #put_array_of_double (also: #put_array_of_float64)
- #put_array_of_float (also: #put_array_of_float32)
-
#put_array_of_float32
Alias for #put_array_of_float.
-
#put_array_of_float64
Alias for #put_array_of_double.
- #put_array_of_pointer
- #put_bytes(offset, str, index = 0, length = nil)
- #put_double (also: #put_float64)
- #put_float (also: #put_float32)
-
#put_float32
Alias for #put_float.
-
#put_float64
Alias for #put_double.
- #put_pointer
- #put_string(offset, str)
- #read_array_of_double
- #read_array_of_float
- #read_array_of_pointer
- #read_array_of_string(count = nil)
- #read_bytes(length)
- #read_double
- #read_float
- #read_pointer
- #size (also: #total)
-
#size
Alias for #size.
- #type_size
- #write_array_of_double
- #write_array_of_float
- #write_array_of_pointer
- #write_bytes(str, index = 0, length = nil)
- #write_double
- #write_float
- #write_pointer
Instance Attribute Details
#size_limit? ⇒ Boolean (readonly)
Return true if self has a size limit.
Instance Method Details
#[](idx)
#read(accessor)
# File 'ext/ffi_c/AbstractMemory.c', line 660
static VALUE
memory_aref(VALUE self, VALUE idx)
{
AbstractMemory* ptr;
VALUE rbOffset = Qnil;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
return rb_funcall2(self, id_plus, 1, &rbOffset);
}
#__copy_from__(rbsrc, rblen)
[ GitHub ]# File 'ext/ffi_c/AbstractMemory.c', line 681
static VALUE
memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
{
AbstractMemory* dst;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, dst);
memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, &rbffi_abstract_memory_data_type)->address, NUM2INT(rblen));
return self;
}
#clear
#the(memory)
# File 'ext/ffi_c/AbstractMemory.c', line 315
static VALUE
memory_clear(VALUE self)
{
AbstractMemory* ptr = MEMORY(self);
checkWrite(ptr);
memset(ptr->address, 0, ptr->size);
return self;
}
#freeze
Freeze the AbstractMemory object and unset the writable flag.
# File 'ext/ffi_c/AbstractMemory.c', line 699
static VALUE
memory_freeze(VALUE self)
{
AbstractMemory* ptr = MEMORY(self);
ptr->flags &= ~MEM_WR;
return rb_call_super(0, NULL);
}
#get(type, offset)
#data(of)
# File 'ext/ffi_c/AbstractMemory.c', line 347
static VALUE
memory_get(VALUE self, VALUE type_name, VALUE offset)
{
AbstractMemory* ptr;
VALUE nType;
Type *type;
MemoryOp *op;
nType = rbffi_Type_Lookup(type_name);
if(NIL_P(nType)) goto undefined_type;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
op = get_memory_op(type);
if(op == NULL) goto undefined_type;
return op->get(ptr, NUM2LONG(offset));
undefined_type: {
VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name);
rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
return Qnil;
}
}
#get_array_of_double Also known as: #get_array_of_float64
[ GitHub ]#get_array_of_float Also known as: #get_array_of_float32
[ GitHub ]#get_array_of_float32
Alias for #get_array_of_float.
#get_array_of_float64
Alias for #get_array_of_double.
#get_array_of_pointer
[ GitHub ]
#get_array_of_string(offset, count = nil)
#an(array)
# File 'ext/ffi_c/AbstractMemory.c', line 444
static VALUE
memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
{
VALUE offset = Qnil, countnum = Qnil, retVal = Qnil;
AbstractMemory* ptr;
long off;
int count;
rb_scan_args(argc, argv, "11", &offset, &countnum);
off = NUM2LONG(offset);
count = (countnum == Qnil ? 0 : NUM2INT(countnum));
retVal = rb_ary_new2(count);
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
checkRead(ptr);
if (countnum != Qnil) {
int i;
checkBounds(ptr, off, count * sizeof (char*));
for (i = 0; i < count; ++i) {
const char* strptr = *((const char**) (ptr->address + off) + i);
rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_str_new2(strptr)));
}
} else {
checkBounds(ptr, off, sizeof (char*));
for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) {
const char* strptr = *(const char**) (ptr->address + off);
if (strptr == NULL) {
break;
}
rb_ary_push(retVal, rb_str_new2(strptr));
}
}
return retVal;
}
#get_bytes(offset, length)
#string(contained)
# File 'ext/ffi_c/AbstractMemory.c', line 544
static VALUE
memory_get_bytes(VALUE self, VALUE offset, VALUE length)
{
AbstractMemory* ptr = MEMORY(self);
long off, len;
off = NUM2LONG(offset);
len = NUM2LONG(length);
checkRead(ptr);
checkBounds(ptr, off, len);
return rb_str_new((char *) ptr->address + off, len);
}
#get_double Also known as: #get_float64
[ GitHub ]#get_float Also known as: #get_float32
[ GitHub ]#get_float32
Alias for #get_float.
#get_float64
Alias for #get_double.
#get_pointer
[ GitHub ]
#get_string(offset, length = nil)
#string(contained)
# File 'ext/ffi_c/AbstractMemory.c', line 416
static VALUE
memory_get_string(int argc, VALUE* argv, VALUE self)
{
VALUE length = Qnil, offset = Qnil;
AbstractMemory* ptr = MEMORY(self);
long off, len;
char* end;
int nargs = rb_scan_args(argc, argv, "11", &offset, &length);
off = NUM2LONG(offset);
len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off);
checkRead(ptr);
checkBounds(ptr, off, len);
end = memchr(ptr->address + off, 0, len);
return rb_str_new((char *) ptr->address + off,
(end != NULL ? end - ptr->address - off : len));
}
#put(type, offset, value)
# File 'ext/ffi_c/AbstractMemory.c', line 380
static VALUE
memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
{
AbstractMemory* ptr;
VALUE nType;
Type *type;
MemoryOp *op;
nType = rbffi_Type_Lookup(type_name);
if(NIL_P(nType)) goto undefined_type;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
op = get_memory_op(type);
if(op == NULL) goto undefined_type;
op->put(ptr, NUM2LONG(offset), value);
return Qnil;
undefined_type: {
VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name);
rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
return Qnil;
}
}
#put_array_of_double Also known as: #put_array_of_float64
[ GitHub ]#put_array_of_float Also known as: #put_array_of_float32
[ GitHub ]#put_array_of_float32
Alias for #put_array_of_float.
#put_array_of_float64
Alias for #put_array_of_double.
#put_array_of_pointer
[ GitHub ]
#put_bytes(offset, str, index = 0, length = nil)
#a(string)
# File 'ext/ffi_c/AbstractMemory.c', line 572
static VALUE
memory_put_bytes(int argc, VALUE* argv, VALUE self)
{
AbstractMemory* ptr = MEMORY(self);
VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil;
long off, len, idx;
int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength);
Check_Type(str, T_STRING);
off = NUM2LONG(offset);
idx = nargs > 2 ? NUM2LONG(rbIndex) : 0;
if (idx < 0) {
rb_raise(rb_eRangeError, "index cannot be less than zero");
return Qnil;
}
len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx);
if ((idx + len) > RSTRING_LEN(str)) {
rb_raise(rb_eRangeError, "index+length is greater than size of string");
return Qnil;
}
checkWrite(ptr);
checkBounds(ptr, off, len);
memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len);
return self;
}
#put_double Also known as: #put_float64
[ GitHub ]#put_float Also known as: #put_float32
[ GitHub ]#put_float32
Alias for #put_float.
#put_float64
Alias for #put_double.
#put_pointer
[ GitHub ]
#put_string(offset, str)
#a(string)
# File 'ext/ffi_c/AbstractMemory.c', line 516
static VALUE
memory_put_string(VALUE self, VALUE offset, VALUE str)
{
AbstractMemory* ptr = MEMORY(self);
long off, len;
Check_Type(str, T_STRING);
off = NUM2LONG(offset);
len = RSTRING_LEN(str);
checkWrite(ptr);
checkBounds(ptr, off, len + 1);
memcpy(ptr->address + off, RSTRING_PTR(str), len);
*((char *) ptr->address + off + len) = '\0';
return self;
}
#read_array_of_double
[ GitHub ]#read_array_of_float
[ GitHub ]#read_array_of_pointer
[ GitHub ]
#read_array_of_string(count = nil)
#an(array)
#get_array_of_string(0, count)
# File 'ext/ffi_c/AbstractMemory.c', line 491
static VALUE
memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
{
VALUE* rargv = ALLOCA_N(VALUE, argc + 1);
int i;
rargv[0] = INT2FIX(0);
for (i = 0; i < argc; i++) {
rargv[i + 1] = argv[i];
}
return memory_get_array_of_string(argc + 1, rargv, self);
}
#read_bytes(length)
#equivalent(to :)
#get_bytes(0, length)
# File 'ext/ffi_c/AbstractMemory.c', line 609
static VALUE
memory_read_bytes(VALUE self, VALUE length)
{
return memory_get_bytes(self, INT2FIX(0), length);
}
#read_double
[ GitHub ]#read_float
[ GitHub ]#read_pointer
[ GitHub ]
#size
#memory(size)
Also known as: #total
# File 'ext/ffi_c/AbstractMemory.c', line 329
static VALUE
memory_size(VALUE self)
{
AbstractMemory* ptr;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
return LONG2NUM(ptr->size);
}
#size
#memory(size)
Alias for #size.
#type_size
#the(memory)
# File 'ext/ffi_c/AbstractMemory.c', line 643
static VALUE
memory_type_size(VALUE self)
{
AbstractMemory* ptr;
TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
return INT2NUM(ptr->typeSize);
}
#write_array_of_double
[ GitHub ]#write_array_of_float
[ GitHub ]#write_array_of_pointer
[ GitHub ]
#write_bytes(str, index = 0, length = nil)
#equivalent(to :)
#put_bytes(0, str, index, length)
# File 'ext/ffi_c/AbstractMemory.c', line 624
static VALUE
memory_write_bytes(int argc, VALUE* argv, VALUE self)
{
VALUE* wargv = ALLOCA_N(VALUE, argc + 1);
int i;
wargv[0] = INT2FIX(0);
for (i = 0; i < argc; i++) {
wargv[i + 1] = argv[i];
}
return memory_put_bytes(argc + 1, wargv, self);
}