diff options
author | Wayne Meissner <wmeissner@gmail.com> | 2012-09-23 11:02:17 +1000 |
---|---|---|
committer | Wayne Meissner <wmeissner@gmail.com> | 2012-09-23 11:02:17 +1000 |
commit | 7c5a5ec1fff298675fa4108507c8b8508b76c45b (patch) | |
tree | 8f0c978cb840118ca2b89f768975fa7fa37707ad | |
parent | d4cc6536f6921e6d3db885490e267be1c710d1a6 (diff) | |
download | ffi-7c5a5ec1fff298675fa4108507c8b8508b76c45b.tar.gz |
Fix issue #112 - delegate Pointer#autorelease? to AutoPointer::Releaser
-rw-r--r-- | lib/ffi/autopointer.rb | 17 | ||||
-rw-r--r-- | spec/ffi/pointer_spec.rb | 17 |
2 files changed, 26 insertions, 8 deletions
diff --git a/lib/ffi/autopointer.rb b/lib/ffi/autopointer.rb index 7e6eed0..6dac0ad 100644 --- a/lib/ffi/autopointer.rb +++ b/lib/ffi/autopointer.rb @@ -94,11 +94,19 @@ module FFI @releaser.autorelease=(autorelease) end + # @return [Boolean] +autorelease+ + # Get +autorelease+ property. See {Pointer Autorelease section at Pointer}. + def autorelease? + @releaser.autorelease + end + # @abstract Base class for {AutoPointer}'s releasers. # # All subclasses of Releaser should define a +#release(ptr)+ method. # A releaser is an object in charge of release an {AutoPointer}. class Releaser + attr_accessor :autorelease + # @param [Pointer] ptr # @param [#call] proc # @return [nil] @@ -119,14 +127,7 @@ module FFI @proc = nil end end - - # @param [Boolean] autorelease - # @return [Boolean] autorelease - # Set +autorelease+ attribute for pointer managed by Releaser. - def autorelease=(autorelease) - @autorelease = autorelease if @ptr - end - + # @param args # Release pointer if +autorelease+ is set. def call(*args) diff --git a/spec/ffi/pointer_spec.rb b/spec/ffi/pointer_spec.rb index b0101e9..09bf80b 100644 --- a/spec/ffi/pointer_spec.rb +++ b/spec/ffi/pointer_spec.rb @@ -210,5 +210,22 @@ describe "AutoPointer" do end end + + describe "#autorelease?" do + ptr_class = Class.new(FFI::AutoPointer) do + def self.release(ptr); end + end + + it "should be true by default" do + ptr_class.new(FFI::Pointer.new(0xdeadbeef)).autorelease?.should be_true + end + + it "should return false when autorelease=(false)" do + ptr = ptr_class.new(FFI::Pointer.new(0xdeadbeef)) + ptr.autorelease = false + ptr.autorelease?.should be_false + end + end + end |