24d69d0
Thu Jul 23 15:04:20 2009  Keiju Ishitsuka  <keiju@ruby-lang.org>
24d69d0
24d69d0
ruby* lib/irb.rb, lib/irb/init.rb, lib/irb/ext/save-history.rb: add
24d69d0
ruby  IRB::irb_at_exit. no use finalizer saving history. [ruby-dev-38563]
24d69d0
24d69d0
Index: lib/irb/ext/save-history.rb
24d69d0
===================================================================
24d69d0
--- lib/irb/ext/save-history.rb	(revision 24225)
24d69d0
+++ lib/irb/ext/save-history.rb	(revision 24254)
24d69d0
@@ -50,23 +50,24 @@
24d69d0
   module HistorySavingAbility
24d69d0
     include Readline
24d69d0
 
24d69d0
-    def HistorySavingAbility.create_finalizer
24d69d0
-      proc do
24d69d0
-	if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
24d69d0
-	  if hf = IRB.conf[:HISTORY_FILE]
24d69d0
-	    file = File.expand_path(hf)
24d69d0
-	  end
24d69d0
-	  file = IRB.rc_file("_history") unless file
24d69d0
-	  open(file, 'w' ) do |f|
24d69d0
-	    hist = HISTORY.to_a
24d69d0
-	    f.puts(hist[-num..-1] || hist)
24d69d0
-	  end
24d69d0
-	end
24d69d0
-      end
24d69d0
-    end
24d69d0
+#     def HistorySavingAbility.create_finalizer
24d69d0
+#       proc do
24d69d0
+# 	if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
24d69d0
+# 	  if hf = IRB.conf[:HISTORY_FILE]
24d69d0
+# 	    file = File.expand_path(hf)
24d69d0
+# 	  end
24d69d0
+# 	  file = IRB.rc_file("_history") unless file
24d69d0
+# 	  open(file, 'w' ) do |f|
24d69d0
+# 	    hist = HISTORY.to_a
24d69d0
+# 	    f.puts(hist[-num..-1] || hist)
24d69d0
+# 	  end
24d69d0
+# 	end
24d69d0
+#       end
24d69d0
+#     end
24d69d0
 
24d69d0
     def HistorySavingAbility.extended(obj)
24d69d0
-      ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer)
24d69d0
+#      ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer)
24d69d0
+      IRB.conf[:AT_EXIT].push proc{obj.save_history}
24d69d0
       obj.load_history
24d69d0
       obj
24d69d0
     end
24d69d0
@@ -80,6 +81,19 @@
24d69d0
 	end
24d69d0
       end
24d69d0
     end
24d69d0
+
24d69d0
+    def save_history
24d69d0
+      if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
24d69d0
+	if history_file = IRB.conf[:HISTORY_FILE]
24d69d0
+	  history_file = File.expand_path(history_file)
24d69d0
+	end
24d69d0
+	history_file = IRB.rc_file("_history") unless history_file
24d69d0
+	open(history_file, 'w' ) do |f|
24d69d0
+	  hist = HISTORY.to_a
24d69d0
+	  f.puts(hist[-num..-1] || hist)
24d69d0
+	end
24d69d0
+      end
24d69d0
+    end
24d69d0
   end
24d69d0
 end
24d69d0
 
24d69d0
Index: lib/irb/init.rb
24d69d0
===================================================================
24d69d0
--- lib/irb/init.rb	(revision 24225)
24d69d0
+++ lib/irb/init.rb	(revision 24254)
24d69d0
@@ -114,6 +114,8 @@
24d69d0
 #    @CONF[:LC_MESSAGES] = "en"
24d69d0
     @CONF[:LC_MESSAGES] = Locale.new
24d69d0
     
24d69d0
+    @CONF[:AT_EXIT] = []
24d69d0
+    
24d69d0
     @CONF[:DEBUG_LEVEL] = 1
24d69d0
   end
24d69d0
 
24d69d0
Index: lib/irb.rb
24d69d0
===================================================================
24d69d0
--- lib/irb.rb	(revision 24225)
24d69d0
+++ lib/irb.rb	(revision 24254)
24d69d0
@@ -65,13 +65,21 @@
24d69d0
     trap("SIGINT") do
24d69d0
       irb.signal_handle
24d69d0
     end
24d69d0
-    
24d69d0
-    catch(:IRB_EXIT) do
24d69d0
-      irb.eval_input
24d69d0
+
24d69d0
+    begin
24d69d0
+      catch(:IRB_EXIT) do
24d69d0
+	irb.eval_input
24d69d0
+      end
24d69d0
+    ensure
24d69d0
+      irb_at_exit
24d69d0
     end
24d69d0
 #    print "\n"
24d69d0
   end
24d69d0
 
24d69d0
+  def IRB.irb_at_exit
24d69d0
+    @CONF[:AT_EXIT].each{|hook| hook.call}
24d69d0
+  end
24d69d0
+
24d69d0
   def IRB.irb_exit(irb, ret)
24d69d0
     throw :IRB_EXIT, ret
24d69d0
   end