diff options
author | Andrew Kane <andrew@chartkick.com> | 2020-11-24 12:26:02 -0800 |
---|---|---|
committer | Andrew Kane <andrew@chartkick.com> | 2020-11-24 12:26:02 -0800 |
commit | 761c03e1938a925ad0553ec614ed7e9d59bbdd19 (patch) | |
tree | e38a48f82717656ca0876d34cf5134140a60f214 | |
parent | 7ff53479e060475672d34ed94714742f343041e7 (diff) | |
download | ffi-761c03e1938a925ad0553ec614ed7e9d59bbdd19.tar.gz |
Added size_limit? method
-rw-r--r-- | ext/ffi_c/Pointer.c | 17 | ||||
-rw-r--r-- | spec/ffi/pointer_spec.rb | 10 |
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 |