summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Kanis <lars@greiz-reinsdorf.de>2020-11-25 06:53:43 +0100
committerGitHub <noreply@github.com>2020-11-25 06:53:43 +0100
commit7865f3f28ac6b92476047b02e24fa1d97952fd5a (patch)
treeedc0c1a775c7657a45fab55f3ebf8d7d0798dc0d
parente88bd3679066fcc765167195171bbda6690c7ecb (diff)
parent761c03e1938a925ad0553ec614ed7e9d59bbdd19 (diff)
downloadffi-7865f3f28ac6b92476047b02e24fa1d97952fd5a.tar.gz
Merge pull request #829 from ankane/bounded
Adds method to check of pointer size if bounded
-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