[#6864] ruby 1.8.4 rc breaks alias_method/rails in bad ways — "Ara.T.Howard" <ara.t.howard@...>

20 messages 2005/12/09
[#6870] Re: ruby 1.8.4 rc breaks alias_method/rails in bad ways — =?ISO-8859-15?Q?Florian_Gro=DF?= <florgro@...> 2005/12/12

Ara.T.Howard wrote:

[#6872] Re: ruby 1.8.4 rc breaks alias_method/rails in bad ways — ara.t.howard@... 2005/12/12

On Tue, 13 Dec 2005, [ISO-8859-15] Florian Growrote:

[#6873] Re: ruby 1.8.4 rc breaks alias_method/rails in bad ways — James Edward Gray II <james@...> 2005/12/12

On Dec 12, 2005, at 1:19 PM, ara.t.howard@noaa.gov wrote:

[#6874] Re: ruby 1.8.4 rc breaks alias_method/rails in bad ways — ara.t.howard@... 2005/12/12

On Tue, 13 Dec 2005, James Edward Gray II wrote:

[#6891] Time.utc! and Time.localtime! — Daniel Hobe <hobe@...>

Writing a script yesterday I found out, much to my surprise, that the

16 messages 2005/12/14

[#6918] change to yaml in 1.8.4 — ara.t.howard@...

14 messages 2005/12/16

[#6934] 1.8.x, YAML, and release management — Ryan Davis <ryand-ruby@...>

I'm concerned that 1.8.3's acceptance of non-backwards-compatible

28 messages 2005/12/18

[#6996] Problems building 1.8.4 with VS8 C++ Express Edition (cl 14.00) — Austin Ziegler <halostatue@...>

Visual Studio C++ 2005 Express Edition (VS 8.0)

20 messages 2005/12/27

Re: [PATCH] Re: IO.open not calling close in block form?

From: nobuyoshi nakada <nobuyoshi.nakada@...>
Date: 2005-12-16 03:12:15 UTC
List: ruby-core #6914
Hi,

At Fri, 16 Dec 2005 10:45:35 +0900,
Mauricio Fernandez wrote in [ruby-core:06912]:
> What about this?

It won't work fine if closed? method is overridden.

I think the original problem posted at [ruby-dev:27156] is
which should be honored, a jump from the body or one from the
ensure clause.  Currently, this code just returns an exception
instead of raising it.

  def protect
    yield
  ensure
    return $!
  end
  p protect {raise} # => RuntimeError, not `unhandled exception'

One thought is to give priority to the body than the ensure
clause.  That is to let the following code raise "foo" instead
of "bar".

  begin
    raise "foo"
  ensure
    raise "bar"
  end


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.616.2.140
diff -U2 -p -u -r1.616.2.140 eval.c
--- eval.c	12 Dec 2005 03:36:48 -0000	1.616.2.140
+++ eval.c	16 Dec 2005 02:17:50 -0000
@@ -995,4 +995,20 @@ static struct tag *prot_tag;
 #define TAG_DST() (_tag.dst == (VALUE)ruby_frame->uniq)
 
+#define ENSURE_PROC(state, ensures) do {			    \
+	volatile VALUE retval = prot_tag ? prot_tag->retval : Qnil; \
+	volatile VALUE errinfo = ruby_errinfo;			    \
+								    \
+	if (state) {						    \
+	    PUSH_TAG(PROT_NONE);				    \
+	    if (!EXEC_TAG()) {ensures;}				    \
+	    POP_TAG();						    \
+	}							    \
+	else {							    \
+	    ensures;						    \
+	}							    \
+	if (prot_tag) return_value(retval);			    \
+	ruby_errinfo = errinfo;					    \
+    } while (0)
+
 #define TAG_RETURN	0x1
 #define TAG_BREAK	0x2
@@ -3247,10 +3263,5 @@ rb_eval(self, n)
 	POP_TAG();
 	if (node->nd_ensr) {
-	    VALUE retval = prot_tag->retval; /* save retval */
-	    VALUE errinfo = ruby_errinfo;
-
-	    rb_eval(self, node->nd_ensr);
-	    return_value(retval);
-	    ruby_errinfo = errinfo;
+	    ENSURE_PROC(state, rb_eval(self, node->nd_ensr));
 	}
 	if (state) JUMP_TAG(state);
@@ -5356,5 +5367,4 @@ rb_ensure(b_proc, data1, e_proc, data2)
     int state;
     volatile VALUE result = Qnil;
-    VALUE retval;
 
     PUSH_TAG(PROT_NONE);
@@ -5363,7 +5373,5 @@ rb_ensure(b_proc, data1, e_proc, data2)
     }
     POP_TAG();
-    retval = prot_tag ? prot_tag->retval : Qnil;	/* save retval */
-    (*e_proc)(data2);
-    if (prot_tag) return_value(retval);
+    ENSURE_PROC(state, (*e_proc)(data2));
     if (state) JUMP_TAG(state);
     return result;
Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.246.2.93
diff -U2 -p -r1.246.2.93 io.c
--- io.c	12 Dec 2005 03:36:49 -0000	1.246.2.93
+++ io.c	16 Dec 2005 01:12:07 -0000
@@ -2151,8 +2151,4 @@ io_close(io)
     VALUE io;
 {
-    if (TYPE(io) == T_FILE) {
-	rb_io_close(io);
-	return Qnil;
-    }
     return rb_funcall(io, rb_intern("close"), 0, 0);
 }


-- 
Nobu Nakada

In This Thread