summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kane <andrew@chartkick.com>2020-11-24 12:26:02 -0800
committerAndrew Kane <andrew@chartkick.com>2020-11-24 12:26:02 -0800
commit761c03e1938a925ad0553ec614ed7e9d59bbdd19 (patch)
treee38a48f82717656ca0876d34cf5134140a60f214
parent7ff53479e060475672d34ed94714742f343041e7 (diff)
downloadffi-761c03e1938a925ad0553ec614ed7e9d59bbdd19.tar.gz
Added size_limit? method
-rw-r--r--ext/ffi_c/Pointer.c17
-rw-r--r--spec/ffi/pointer_spec.rb10
2 files changed, 27 insertions, 0 deletions
diff --git a/ext/ffi_c/Pointer.c b/ext/ffi_c/Pointer.c
index 153fff1..9e5ed5f 100644
--- a/ext/ffi_c/Pointer.c
+++ b/ext/ffi_c/Pointer.c
@@ -315,6 +315,22 @@ ptr_address(VALUE self)
return ULL2NUM((uintptr_t) ptr->memory.address);
}
+/*
+ * Document-method: size_limit?
+ * call-seq: ptr.size_limit?
+ * @return [Boolean]
+ * Return +true+ if +self+ has a size limit.
+ */
+static VALUE
+ptr_size_limit(VALUE self)
+{
+ Pointer* ptr;
+
+ Data_Get_Struct(self, Pointer, ptr);
+
+ return ptr->memory.size == LONG_MAX ? Qfalse : Qtrue;
+}
+
#if BYTE_ORDER == LITTLE_ENDIAN
# define SWAPPED_ORDER BIG_ENDIAN
#else
@@ -497,6 +513,7 @@ rbffi_Pointer_Init(VALUE moduleFFI)
rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0);
rb_define_method(rbffi_PointerClass, "free", ptr_free, 0);
rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0);
+ rb_define_method(rbffi_PointerClass, "size_limit?", ptr_size_limit, 0);
rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass);
/*
diff --git a/spec/ffi/pointer_spec.rb b/spec/ffi/pointer_spec.rb
index 3ddfeb7..4cffb5c 100644
--- a/spec/ffi/pointer_spec.rb
+++ b/spec/ffi/pointer_spec.rb
@@ -228,6 +228,16 @@ describe "Pointer" do
expect(pointer.read_int32).to eq(16909060)
end
end if RUBY_ENGINE != "truffleruby"
+
+ describe "#size_limit?" do
+ it "should not have size limit" do
+ expect(FFI::Pointer.new(0).size_limit?).to be false
+ end
+
+ it "should have size limit" do
+ expect(FFI::Pointer.new(0).slice(0, 10).size_limit?).to be true
+ end
+ end if RUBY_ENGINE != "truffleruby"
end
describe "AutoPointer" do