A field in a {StructLayout}.
static VALUE struct_field_initialize(int argc, VALUE* argv, VALUE self) { VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil; StructField* field; int nargs; Data_Get_Struct(self, StructField, field); nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType); if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) { rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)", rb_obj_classname(rbName)); } Check_Type(rbOffset, T_FIXNUM); if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) { rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)", rb_obj_classname(rbType)); } field->offset = NUM2UINT(rbOffset); field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName); field->rbType = rbType; Data_Get_Struct(field->rbType, Type, field->type); field->memoryOp = get_memory_op(field->type); field->referenceIndex = -1; switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) { case NATIVE_FUNCTION: case NATIVE_CALLBACK: case NATIVE_POINTER: field->referenceRequired = true; break; default: field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?")) && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL))) || (rb_respond_to(rbType, rb_intern("reference_required?")) && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL))); break; } return self; }
static VALUE struct_field_alignment(VALUE self) { StructField* field; Data_Get_Struct(self, StructField, field); return UINT2NUM(field->type->ffiType->alignment); }
static VALUE struct_field_get(VALUE self, VALUE pointer) { StructField* f; Data_Get_Struct(self, StructField, f); if (f->memoryOp == NULL) { rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType)); return Qnil; } return (*f->memoryOp->get)(MEMORY(pointer), f->offset); }
static VALUE struct_field_name(VALUE self) { StructField* field; Data_Get_Struct(self, StructField, field); return field->rbName; }
static VALUE struct_field_offset(VALUE self) { StructField* field; Data_Get_Struct(self, StructField, field); return UINT2NUM(field->offset); }
static VALUE struct_field_put(VALUE self, VALUE pointer, VALUE value) { StructField* f; Data_Get_Struct(self, StructField, f); if (f->memoryOp == NULL) { rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType)); return self; } (*f->memoryOp->put)(MEMORY(pointer), f->offset, value); return self; }
static VALUE struct_field_size(VALUE self) { StructField* field; Data_Get_Struct(self, StructField, field); return UINT2NUM(field->type->ffiType->size); }
static VALUE struct_field_type(VALUE self) { StructField* field; Data_Get_Struct(self, StructField, field); return field->rbType; }