[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:260

From: ko1 atdot.net
Date: 15 Feb 2006 11:07:00 -0000
Subject: [yarv-diff:260] r423 - trunk

Author: ko1
Date: 2006-02-15 20:06:59 +0900 (Wed, 15 Feb 2006)
New Revision: 423

Modified:
   trunk/
   trunk/ChangeLog
   trunk/compile.c
   trunk/insns.def
   trunk/test.rb
   trunk/vm.c
   trunk/yarvcore.c
Log:
 r635@lermite:  ko1 | 2006-02-15 19:50:29 +0900
 	* insns.def, compile.c, vm.c : remove methoddef, singletonmethoddef
 	instructions and make new insn definemethod
 
 	* yarvcore.c : set toplevel visibility to private
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:633
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:635

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/ChangeLog	2006-02-15 11:06:59 UTC (rev 423)
@@ -9,6 +9,14 @@
 	* test/rss: imported from Ruby CVS trunk HEAD.
 
 
+2006-02-15(Wed) 19:47:51 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* insns.def, compile.c, vm.c : remove methoddef, singletonmethoddef
+	instructions and make new insn definemethod
+
+	* yarvcore.c : set toplevel visibility to private
+
+
 2006-02-15(Wed) 17:39:16 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval_intern.h : 

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/compile.c	2006-02-15 11:06:59 UTC (rev 423)
@@ -4024,8 +4024,9 @@
 
 	  debugp_param("defn/iseq", iseqval);
 
-	  ADD_INSN2(ret, nd_line(node), methoddef, ID2SYM(node->nd_mid),
-		    iseqval);
+	  ADD_INSN (ret, nd_line(node), putnil);
+	  ADD_INSN3(ret, nd_line(node), definemethod,
+		    ID2SYM(node->nd_mid), iseqval, INT2FIX(0));
 	  if (!poped) {
 	      ADD_INSN(ret, nd_line(node), putnil);
 	  }
@@ -4040,8 +4041,8 @@
 	  debugp_param("defs/iseq", iseqval);
 
 	  COMPILE(ret, "defs: recv", node->nd_recv);
-	  ADD_INSN2(ret, nd_line(node), singletonmethoddef,
-		    ID2SYM(node->nd_mid), iseqval);
+	  ADD_INSN3(ret, nd_line(node), definemethod,
+		    ID2SYM(node->nd_mid), iseqval, INT2FIX(1));
 	  if (!poped) {
 	      ADD_INSN(ret, nd_line(node), putnil);
 	  }

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/insns.def	2006-02-15 11:06:59 UTC (rev 423)
@@ -794,101 +794,20 @@
 
 /**
   @c setting
-  @e define method id as body
-  @j \bh m  body `B
+  @e define (singleton) method id as body
+  @j ij\bh m  body `B
  */
 DEFINE_INSN
-methoddef
-(ID id, VALUE body)
-()
-()
-{
-    NODE *newbody;
-    yarv_iseq_t *miseq;
-    NODE *cref = get_cref(GET_ISEQ(), GET_LFP());
-    int noex = cref->nd_visi;
-    VALUE klass = cref->nd_clss;
-
-    /* dup */
-    GetISeqVal(body, miseq);
-
-    COPY_CREF(miseq->cref_stack, cref);
-    miseq->klass = th_get_cbase(th);
-    miseq->defined_method_id = rb_to_id(miseq->name);
-    
-    /* make new node */
-    newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
-    // printf("define: %s: %s\n", rb_id2name(id), node_name(nd_type(newbody)));
-
-    //debugp_(-1, "self", GET_SELF());
-    //printf("%s\n", body_name(nd_type(newbody)));
-    //fflush(stdout);
-
-    if (GET_ISEQ()->type == ISEQ_TYPE_METHOD) {
-	noex = NOEX_PUBLIC;
-	klass = CLASS_OF(GET_SELF());
-    }
-    else {
-	klass = cref->nd_clss;
-    }
-
-    rb_add_method(klass, id, newbody, noex);
-
-    if (noex == NOEX_MODFUNC) {
-	rb_add_method(rb_singleton_class(klass), id, newbody, NOEX_PUBLIC);
-    }
-
-    INC_VM_STATE_VERSION();
-}
-
-/**
-  @c setting
-  @e define singleton method id as body to obj.
-  @j \bh m  body  obj `B
- */
-DEFINE_INSN
-singletonmethoddef
-(ID id, VALUE body)
+definemethod
+(ID id, VALUE body, num_t is_singleton)
 (VALUE obj)
 ()
 {
-    VALUE klass;
-    NODE *newbody;
-    yarv_iseq_t *siseq;
-    int noex = NOEX_PUBLIC;
-
-    if (FIXNUM_P(obj) || SYMBOL_P(obj)) {
-	rb_raise(rb_eTypeError,
-		 "can't define singleton method \"%s\" for %s",
-		 rb_id2name(id), rb_obj_classname(obj));
-    }
-
-    if (OBJ_FROZEN(obj)) {
-	rb_error_frozen("object");
-    }
-
-    klass = rb_singleton_class(obj);
-    if (st_lookup(RCLASS(klass)->m_tbl, id, (void *)&newbody)) {
-	if (ruby_safe_level >= 4) {
-	    rb_raise(rb_eSecurityError, "redefining method prohibited");
-	}
-	if (RTEST(ruby_verbose)) {
-	    rb_warning("redefine %s", rb_id2name(id));
-	}
-    }
-
-    GetISeqVal(body, siseq);
-    COPY_CREF(siseq->cref_stack, get_cref(GET_ISEQ(), GET_LFP()));
-    siseq->klass = CLASS_OF(obj);
-    siseq->defined_method_id = id;
-
-    newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
-
-    rb_add_method(klass, id, newbody, noex);
-
-    INC_VM_STATE_VERSION();
+    eval_define_method(th, obj, id, body, is_singleton,
+		       get_cref(GET_ISEQ(), GET_LFP()));
 }
 
+
 /**
   @c setting
   @e make alias (if v_p is Qtrue, make valias)

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/test.rb	2006-02-15 11:06:59 UTC (rev 423)
@@ -1,13 +1,38 @@
+class C
+  def m
+  end
+  alias mm m
+  private :mm
+end
 
-def m
-  Thread.new{
-    eval("return")
-  }
+p C.new.m   # private method `m' called for #<C:0x00002a95eae8c0> (NoMethodError)
+
+__END__
+
+class C
+  def m
+    1.times{
+      def m1
+      end
+    }
+  end
 end
 
-m.join
+C.new.m
+C.new.m1
+
 __END__
+fork do
+  break
+end
+__END__
 
+Thread.new{
+  eval("return")
+}.join
+
+__END__
+
 Thread.new{}.kill
 __END__
 Thread.new{}

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/vm.c	2006-02-15 11:06:59 UTC (rev 423)
@@ -864,6 +864,16 @@
     return lfp_set_special_cref(lfp, cref_stack);
 }
 
+void
+debug_cref(NODE *cref)
+{
+    while (cref) {
+	dp(cref->nd_clss);
+	printf("%d\n", cref->nd_visi);
+	cref = cref->nd_next;
+    }
+}
+
 static NODE *
 get_cref(yarv_iseq_t *iseq, VALUE *lfp)
 {
@@ -1012,6 +1022,52 @@
     return klass;
 }
 
+EVALBODY_HELPER_FUNCTION void
+eval_define_method(yarv_thread_t *th, VALUE obj,
+		   ID id, VALUE body, num_t is_singleton, NODE *cref)
+{
+    NODE *newbody;
+    yarv_iseq_t *miseq;
+    int noex = cref->nd_visi;
+    VALUE klass = cref->nd_clss;
+    GetISeqVal(body, miseq);
+
+    if (is_singleton) {
+	if (FIXNUM_P(obj) || SYMBOL_P(obj)) {
+	    rb_raise(rb_eTypeError,
+		     "can't define singleton method \"%s\" for %s",
+		     rb_id2name(id), rb_obj_classname(obj));
+	}
+	if (OBJ_FROZEN(obj)) {
+	    rb_error_frozen("object");
+	}
+
+	klass = rb_singleton_class(obj);
+	noex = NOEX_PUBLIC;
+
+	if (st_lookup(RCLASS(klass)->m_tbl, id, (void *)&newbody)) {
+	    if (ruby_safe_level >= 4) {
+		rb_raise(rb_eSecurityError, "redefining method prohibited");
+	    }
+	    if (RTEST(ruby_verbose)) {
+		rb_warning("redefine %s", rb_id2name(id));
+	    }
+	}
+    }
+
+    /* dup */
+    COPY_CREF(miseq->cref_stack, cref);
+    miseq->klass = klass;
+    miseq->defined_method_id = id;
+    newbody = NEW_NODE(YARV_METHOD_NODE, 0, body, 0);
+    rb_add_method(klass, id, newbody, noex);
+
+    if (!is_singleton && noex == NOEX_MODFUNC) {
+	rb_add_method(rb_singleton_class(klass), id, newbody, NOEX_PUBLIC);
+    }
+    INC_VM_STATE_VERSION();
+}
+
 EVALBODY_HELPER_FUNCTION VALUE
 eval_search_super_klass(VALUE klass, VALUE recv)
 {

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/yarvcore.c	2006-02-15 11:06:59 UTC (rev 423)
@@ -445,10 +445,12 @@
 
     /* set class nest stack */
     if (type == ISEQ_TYPE_TOP) {
+	/* toplevel is private */
 	iseq->cref_stack = NEW_BLOCK(rb_cObject);
+	iseq->cref_stack->nd_visi = NOEX_PRIVATE;
     }
     else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) {
-	iseq->cref_stack = NEW_BLOCK(0);
+	iseq->cref_stack = NEW_BLOCK(0); /* place holder */
     }
     else if (parent) {
 	yarv_iseq_t *piseq;


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]