[#13775] Problems with racc rule definitions — Michael Neumann <neumann@...>

15 messages 2001/04/17
[#13795] Re: Problems with racc rule definitions — Minero Aoki <aamine@...> 2001/04/18

Hi,

[#13940] From Guido, with love... — Dave Thomas <Dave@...>

52 messages 2001/04/20

[#13953] regexp — James Ponder <james@...>

Hi, I'm new to ruby and am coming from a perl background - therefore I

19 messages 2001/04/21

[#14033] Distributed Ruby and heterogeneous networks — harryo@... (Harry Ohlsen)

I wrote my first small distributed application yesterday and it worked

15 messages 2001/04/22

[#14040] RCR: getClassFromString method — ptkwt@...1.aracnet.com (Phil Tomson)

It would be nice to have a function that returns a class type given a

20 messages 2001/04/22

[#14130] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Guy N. Hurst wrote:

21 messages 2001/04/24
[#14148] Re: Ruby mascot proposal — Stephen White <spwhite@...> 2001/04/24

On Tue, 24 Apr 2001, Conrad Schneiker wrote:

[#14188] Re: Ruby mascot proposal — matz@... (Yukihiro Matsumoto) 2001/04/25

Hi,

[#14193] Re: Ruby mascot proposal — "W. Kent Starr" <elderburn@...> 2001/04/25

On Tuesday 24 April 2001 23:02, Yukihiro Matsumoto wrote:

[#14138] Re: python on the smalltalk VM — Conrad Schneiker <schneik@...>

FYI: Thought this might be of interest to the JRuby and Ruby/GUI folks.

27 messages 2001/04/24
[#14153] Re: python on the smalltalk VM — Andrew Kuchling <akuchlin@...> 2001/04/24

Conrad Schneiker <schneik@austin.ibm.com> writes:

[#14154] array#flatten! question — Jim Freeze <jim@...> 2001/04/24

Hello.

[#14159] Can I insert into an array — Jim Freeze <jim@...> 2001/04/24

Ok, this may be a dumb question, but, is it possible to insert into an

[#14162] Re: Can I insert into an array — Dave Thomas <Dave@...> 2001/04/24

Jim Freeze <jim@freeze.org> writes:

[#14289] RCR: Array#insert — Shugo Maeda <shugo@...> 2001/04/27

At Wed, 25 Apr 2001 01:28:36 +0900,

[#14221] An or in an if. — Tim Pettman <tjp@...>

Hi there,

18 messages 2001/04/25

[#14267] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Danny van Bruggen,

16 messages 2001/04/26

[#14452] How to do it the Ruby-way 3 — Stefan Matthias Aust <sma@3plus4.de>

First a question: Why is

21 messages 2001/04/30

[ruby-talk:13854] Re: local vars in case

From: "K.Kosako" <kosako@...>
Date: 2001-04-19 10:52:22 UTC
List: ruby-talk #13854
 From Yukihiro Matsumoto
<987637838.835665.2921.nullmailer@ev.netlab.zetabits.com>
> |		print "a: #{a}\n"	# Name Error
> |
> | it will the first time compile the part between #{}. Because for this
> |iteration a was never assigned, it don't exist and ruby resolve it as a
> |function call. This is why it give an error.
> 
> That's what's happening.
> 
> But I feel it's a bug, or at most misfeature.  eval() should execute
> as if the evaluating string is embedded in the code, so that the error
> in this case is not what I expect.  But I found it's pretty hard to
> fix.  It will remain as it is until I reimplement the core in the
> future version.  Sorry.

Probably, I could fix it.

In this method, only values are cleared without removing dyna-var objects
at the end of rb_yield_0, and used in the next rb_yield_0 call.
It is not a good method because the argument "acheck" of rb_yield_0
is being referred to to do the decision of yield-call or proc/thread-call.

It took two hours to write this "English" mail.


[0,1].each {|n|
  print "n: #{n}\n"
  case n
  when 0
    a = 0
    print "a: #{a}\n"       # => 0
  when 1
    b = 1
    print "a: #{a}\n"       # => "a: "   (a == nil)
    print "b: #{b}\n"
  end
}


--- eval.c.orig	Wed Apr 18 00:35:04 2001
+++ eval.c	Thu Apr 19 18:16:38 2001
@@ -3601,17 +3601,47 @@
 	}
     }
 #else
-    if (ruby_dyna_vars && (block->flags & BLOCK_D_SCOPE) &&
-	!FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
-	struct RVarmap *vars = ruby_dyna_vars;
+    if ((block->flags & BLOCK_D_SCOPE) && ruby_dyna_vars) {
+	struct RVarmap *vars;
 
-	if (ruby_dyna_vars->id == 0) {
-	    vars = ruby_dyna_vars->next;
-	    rb_gc_force_recycle((VALUE)ruby_dyna_vars);
-	    while (vars && vars->id != 0) {
-		struct RVarmap *tmp = vars->next;
-		rb_gc_force_recycle((VALUE)vars);
-		vars = tmp;
+	if (acheck) { /* acheck == true : proc_call or thread_yield */
+	    if (!FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
+		vars = ruby_dyna_vars;
+		if (vars->id == 0) {
+		    vars = ruby_dyna_vars->next;
+		    rb_gc_force_recycle((VALUE)ruby_dyna_vars);
+		    while (vars && vars->id != 0) {
+			struct RVarmap *tmp = vars->next;
+			rb_gc_force_recycle((VALUE)vars);
+			vars = tmp;
+		    }
+		}
+	    }
+	}
+	else { /* acheck == false : normal yield */
+	    if (FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
+		/* copy dyna-vars-list for next yield */
+	 	if (ruby_dyna_vars->next && ruby_dyna_vars->next->id != 0) {
+		    vars = ruby_dyna_vars->next;
+		    vars = new_dvar(vars->id, Qnil, vars->next);
+		    block->dyna_vars = vars;
+		    for (; vars; vars = vars->next) {
+			if (!vars->next || vars->next->id == 0) break;
+			vars->next = new_dvar(vars->next->id, Qnil, vars->next->next);
+		    }
+		}
+	    }
+	    else {
+		/* clear dyna-vars value for next yield */
+		vars = ruby_dyna_vars;
+		if (vars->id == 0) {
+		    block->dyna_vars = vars = ruby_dyna_vars->next;
+		    rb_gc_force_recycle((VALUE)ruby_dyna_vars);
+		    while (vars && vars->id != 0) {
+			vars->val = Qnil;
+			vars = vars->next;
+		    }
+		}
 	    }
 	}
     }
----
K.Kosako

In This Thread