[#1094] Re: [ruby-cvs] ruby, ruby/lib: * eval.c (ev_const_defined, ev_const_get), variable.c — Dave Thomas <dave@...>

> * eval.c (rb_mod_autoload, rb_mod_autoload_p): new method;

12 messages 2003/05/29
[#1095] Re: [ruby-cvs] ruby, ruby/lib: * eval.c (ev_const_defined, ev_const_get), variable.c — nobu.nokada@... 2003/05/29

Hi,

Re: [1.8] terminated object / invalid inspect_tbl

From: nobu.nokada@...
Date: 2003-05-26 15:13:28 UTC
List: ruby-core #1085
Hi,

At Mon, 26 May 2003 23:36:06 +0900,
ts wrote:
> n> You're right.  I guess ruby_frame->last_class should not be a
> n> T_MODULE but T_CLASS or T_ICLASS.
> 
>  Well, it work with hook (I must stop to write stupid thing :-)))

Have you implemented method hook?

Anyway, this seems to work.


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.445
diff -u -2 -p -r1.445 eval.c
--- eval.c	26 May 2003 08:22:27 -0000	1.445
+++ eval.c	26 May 2003 15:06:08 -0000
@@ -6893,4 +6893,5 @@ block_invoke(block, args, self)
     struct RVarmap * volatile old_dvars = ruby_dyna_vars;
     int pcall;
+    VALUE klass;
 
     if (rb_block_given_p() && ruby_frame->last_func) {
@@ -6910,4 +6911,20 @@ block_invoke(block, args, self)
     _block = *data;
     _block.frame.self = self;
+    klass = _block.frame.last_class;
+    if (klass && BUILTIN_TYPE(klass) == T_MODULE) {
+	struct st_table *m = RCLASS(klass)->m_tbl;
+
+	klass = CLASS_OF(self);
+	while (!(BUILTIN_TYPE(klass) == T_ICLASS && RCLASS(klass)->m_tbl == m)) {
+	    klass = RCLASS(klass)->super;
+	    if (!klass) {
+		rb_raise(rb_eTypeError, "%s is not included in %s",
+			 rb_class2name(_block.frame.last_class),
+			 RSTRING(rb_obj_as_string(self))->ptr);
+	    }
+	}
+	_block.frame.last_class = klass;
+    }
+
     ruby_block = &_block;
 


-- 
Nobu Nakada

In This Thread