summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Meissner <wmeissner@gmail.com>2012-09-23 11:02:17 +1000
committerWayne Meissner <wmeissner@gmail.com>2012-09-23 11:02:17 +1000
commit7c5a5ec1fff298675fa4108507c8b8508b76c45b (patch)
tree8f0c978cb840118ca2b89f768975fa7fa37707ad
parentd4cc6536f6921e6d3db885490e267be1c710d1a6 (diff)
downloadffi-7c5a5ec1fff298675fa4108507c8b8508b76c45b.tar.gz
Fix issue #112 - delegate Pointer#autorelease? to AutoPointer::Releaser
-rw-r--r--lib/ffi/autopointer.rb17
-rw-r--r--spec/ffi/pointer_spec.rb17
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