--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi,
there's a bug in Ruby 1.8.2 that breaks the following code:
require "tempfile"
Tempfile.open("foo.rb") do |f|
# do stuff with tf
# make sure the file gets removed as soon as the block
# terminates:
f.unlink # this leads to an exception
end
/usr/lib/ruby/1.8/tempfile.rb:84:in `_close': undefined method `[] for nil:NilClass (NoMethodError)
from /usr/lib/ruby/1.8/tempfile.rb:97:in `close'
from /usr/lib/ruby/1.8/tempfile.rb:174:in `open'
This was then fixed in CVS by making Tempfile#_close only set @data[1]
to nil if @data isn't nil.
I suspect that this isn't the right way to fix it, maybe it's better to
only set @data[1] to nil instead of @data in #unlink (and #close!)?
Attached a diff against CVS HEAD.
--
Regards,
Tilman
--FL5UXtIhxfXey3p5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="ruby-tempfile.diff"
Index: lib/tempfile.rb
RCS file: /src/ruby/lib/tempfile.rb,v
retrieving revision 1.27
diff -u -r1.27 tempfile.rb
--- lib/tempfile.rb 15 Nov 2004 16:45:02 -0000 1.27
+++ lib/tempfile.rb 26 Mar 2005 17:41:17 -0000
@@ -81,8 +81,7 @@
def _close # :nodoc:
@tmpfile.close if @tmpfile
- @tmpfile il
- @data[1] il if @data
+ @data[1] tmpfile il
end
protected :_close
@@ -104,7 +103,7 @@
_close
@clean_proc.call
ObjectSpace.undefine_finalizer(self)
- @data tmpname il
+ @data[1] tmpname il
end
# Unlinks the file. On UNIX-like systems, it is often a good idea
@@ -116,7 +115,7 @@
begin
File.unlink(@tmpname) if File.exist?(@tmpname)
@@cleanlist.delete(@tmpname)
- @data tmpname il
+ @data[1] tmpname il
ObjectSpace.undefine_finalizer(self)
rescue Errno::EACCESS
# may not be able to unlink on Windows; just ignore
--FL5UXtIhxfXey3p5--