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
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 = nil
-    @data[1] = nil if @data
+    @data[1] = @tmpfile = nil
   end
   protected :_close
 
@@ -104,7 +103,7 @@
     _close
     @clean_proc.call
     ObjectSpace.undefine_finalizer(self)
-    @data = @tmpname = nil
+    @data[1] = @tmpname = nil
   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 = nil
+      @data[1] = @tmpname = nil
       ObjectSpace.undefine_finalizer(self)
     rescue Errno::EACCESS
       # may not be able to unlink on Windows; just ignore