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

yarv-diff:117

From: ko1 atdot.net
Date: 3 Oct 2005 13:34:12 -0000
Subject: [yarv-diff:117] r273 - trunk

Author: ko1
Date: 2005-10-03 22:34:11 +0900 (Mon, 03 Oct 2005)
New Revision: 273

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/compile.h
   trunk/disasm.c
   trunk/insns.def
   trunk/test.rb
   trunk/vm.c
   trunk/vm_opts.h
   trunk/yarv.h
   trunk/yarvcore.c
Log:
	* compile.c : fix NODE_COLON2 bugs

	* compile.h : fix debug routine

	* disasm.c : add space between insn and operand

	* insns.def : add comment of classdef, singletonclassdef

	* vm.c, yarv.h : fix invoke_light routine

	* yarvcore.c : fix to mark each threads



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/ChangeLog	2005-10-03 13:34:11 UTC (rev 273)
@@ -4,6 +4,22 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+
+2005-10-03(Mon) 22:28:24 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c : fix NODE_COLON2 bugs
+
+	* compile.h : fix debug routine
+
+	* disasm.c : add space between insn and operand
+
+	* insns.def : add comment of classdef, singletonclassdef
+
+	* vm.c, yarv.h : fix invoke_light routine
+
+	* yarvcore.c : fix to mark each threads
+
+
 2005-10-02(Sun) 05:55:34 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* thread_pthread.h : add "system_working" global variable

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/compile.c	2005-10-03 13:34:11 UTC (rev 273)
@@ -1964,6 +1964,34 @@
 }
 
 static int
+compile_colon2(VALUE self, yarv_iseq_t *iseqobj, NODE *node,
+               LINK_ANCHOR *pref, LINK_ANCHOR *body)
+{
+  switch(nd_type(node)){
+  case NODE_CONST:
+    debugi("compile_colon2 - colon", node->nd_vid);
+    ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_vid));
+    break;
+  case NODE_COLON3:
+    debugi("compile_colon2 - colon3", node->nd_mid);
+    ADD_INSN (body, nd_line(node), pop);
+    ADD_INSN1(body, nd_line(node), putobject, rb_cObject);
+    ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
+    break;
+  case NODE_COLON2:
+    compile_colon2(self, iseqobj, node->nd_head, pref, body);
+    debugi("compile_colon2 - colon2", node->nd_mid);
+    ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
+    break;
+  default:
+    COMPILE(pref, "const colon2 prefix", node);
+    ADD_INSN (body, nd_line(node), pop);
+    break;
+  }
+  return COMPILE_OK;
+}
+
+static int
 defined_expr(VALUE self, yarv_iseq_t *iseqobj,
              LINK_ANCHOR *ret, NODE *node, LABEL *lfinish, VALUE needstr)
 {
@@ -3306,25 +3334,17 @@
     break;
   }
   case NODE_CONST:{
+    LABEL * lstart = NEW_LABEL(nd_line(node));
+    LABEL * lend   = NEW_LABEL(nd_line(node));
     debugi("nd_vid", node->nd_vid);
-    if(!poped){
-      if(iseqobj->compile_data->cached_const == Qfalse){
-        LABEL * lstart = NEW_LABEL(nd_line(node));
-        LABEL * lend   = NEW_LABEL(nd_line(node));
-        
-        ADD_LABEL(ret, lstart);
-        ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
-        /* ADD_INSN (ret, nd_line(node), pop); */
-        /* ADD_INSN (ret, nd_line(node), putnil); */ /* target class */
-        ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_vid));
-        ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
-        ADD_LABEL(ret, lend);
-      }
-      else{
-        ADD_INSN (ret, nd_line(node), putnil); /* target class */
-        ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_vid));
-      }
-    }
+
+    ADD_LABEL(ret, lstart);
+    ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
+    /* ADD_INSN (ret, nd_line(node), pop); */
+    /* ADD_INSN (ret, nd_line(node), putnil); */ /* target class */
+    ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_vid));
+    ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
+    ADD_LABEL(ret, lend);
     break;
   }
   case NODE_CVAR:{
@@ -3608,29 +3628,20 @@
     break;
   }
   case NODE_COLON2:{
-    
     if(rb_is_const_id(node->nd_mid)){
       /* constant */
-      debugi("nd_mid", node->nd_mid);
-      if(iseqobj->compile_data->cached_const == Qfalse){
-        LABEL * lstart = NEW_LABEL(nd_line(node));
-        LABEL * lend   = NEW_LABEL(nd_line(node));
-        
-        /* add cache insn */
-        iseqobj->compile_data->cached_const = Qtrue;
-        ADD_LABEL(ret, lstart);
-        ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
-        ADD_INSN (ret, nd_line(node), pop);
-        COMPILE  (ret, "colon2#nd_head", node->nd_head);
-        ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_mid));
-        ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
-        ADD_LABEL(ret, lend);
-        iseqobj->compile_data->cached_const = Qfalse;
-      }
-      else{
-        COMPILE(ret, "colon2#nd_head", node->nd_head);
-        ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_mid));
-      }
+      LABEL * lstart = NEW_LABEL(nd_line(node));
+      LABEL * lend   = NEW_LABEL(nd_line(node));
+      DECL_ANCHOR(pref);
+      DECL_ANCHOR(body);
+
+      compile_colon2(self, iseqobj, node, pref, body);
+      ADD_SEQ  (ret, pref);
+      ADD_LABEL(ret, lstart);
+      ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
+      ADD_SEQ  (ret, body);
+      ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
+      ADD_LABEL(ret, lend);
     }
     else{
       /* function call */
@@ -3644,24 +3655,19 @@
     break;
   }
   case NODE_COLON3:{
+    LABEL * lstart = NEW_LABEL(nd_line(node));
+    LABEL * lend   = NEW_LABEL(nd_line(node));
     debugi("colon3#nd_mid", node->nd_mid);
-    if(iseqobj->compile_data->cached_const == Qfalse){
-      LABEL * lstart = NEW_LABEL(nd_line(node));
-      LABEL * lend   = NEW_LABEL(nd_line(node));
 
-      /* add cache insn */
-      ADD_LABEL(ret, lstart);
-      ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
-      ADD_INSN (ret, nd_line(node), pop);
-      ADD_INSN1(ret, nd_line(node), putobject     , rb_cObject);
-      ADD_INSN1(ret, nd_line(node), getconstant   , ID2SYM(node->nd_mid));
-      ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
-      ADD_LABEL(ret, lend);
-    }
-    else{
-      ADD_INSN1(ret, nd_line(node), putobject, rb_cObject);
-      ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_mid));
-    }
+    /* add cache insn */
+    ADD_LABEL(ret, lstart);
+    ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
+    ADD_INSN (ret, nd_line(node), pop);
+    ADD_INSN1(ret, nd_line(node), putobject     , rb_cObject);
+    ADD_INSN1(ret, nd_line(node), getconstant   , ID2SYM(node->nd_mid));
+    ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
+    ADD_LABEL(ret, lend);
+    
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
     }

Modified: trunk/compile.h
===================================================================
--- trunk/compile.h	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/compile.h	2005-10-03 13:34:11 UTC (rev 273)
@@ -60,9 +60,6 @@
 
 #define debug_nodeprint_close()  gl_node_level --;
 
-#define debugs debug_indent(-1, CPDEBUG, gl_node_level*2), printf
-#define debug_compile(msg, v) (debug_indent(-1, CPDEBUG, gl_node_level*2), printf("%s", msg), (v))
-
 #else
 
 static inline ID r_id(id){
@@ -79,6 +76,12 @@
 #define debugp_param(header, value)        r_value(value)
 #define debug_nodeprint(node)
 #define debug_nodeprint_close()
+#endif
+
+#if CPDEBUG > 1
+#define debugs debug_indent(-1, CPDEBUG, gl_node_level*2), printf
+#define debug_compile(msg, v) (debug_indent(-1, CPDEBUG, gl_node_level*2), printf("%s", msg), (v))
+#else
 #define debugs                             if(0)printf
 #define debug_compile(msg, v) (v)
 #endif

Modified: trunk/disasm.c
===================================================================
--- trunk/disasm.c	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/disasm.c	2005-10-03 13:34:11 UTC (rev 273)
@@ -119,7 +119,7 @@
   }
   
   snprintf(buff, sizeof(buff),
-           "%04d %-16s", pos, insn_name_buff);
+           "%04d %-16s ", pos, insn_name_buff);
   rb_str_cat2(str, buff);
   
   for(j=0;types[j]; j++){

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/insns.def	2005-10-03 13:34:11 UTC (rev 273)
@@ -995,6 +995,7 @@
 (VALUE cbase, VALUE super)
 (VALUE val)
 {
+  /* val is dummy.  classdef returns class scope value */
   yarv_iseq_t *klass_iseq;
   int i;
   VALUE klass;
@@ -1048,6 +1049,7 @@
 (VALUE obj)
 (VALUE val)
 {
+  /* val is dummy.  classdef returns class scope value */
   val = Qnil;
 }
 

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/test.rb	2005-10-03 13:34:11 UTC (rev 273)
@@ -1,3 +1,104 @@
+class                                                  NP
+def  initialize a=@p=[], b=@b=[];                      end
+def +@;@b<<1;b2c end;def-@;@b<<0;b2c                   end
+def  b2c;if @b.size==8;c=0; b.each{|b|c<<=1;c|=b};send(
+     'lave'.reverse,( p.join))if c==0; p<<c.chr; b=[]  end
+     self end end ; begin _ = NP.new                   end
+
+
+# The Programming Language `NegaPosi'
++-+--++----+--+-+++--+-------+--++--+++---+-+++-+-+-+++-----+++-_
++--++++--+---++-+-+-+++--+--+-+------+--++++-++---++-++---++-++-_
++++--++-+-+--++--+++--+------+----+--++--+++-++-+----++------+--_
+-+-+----+++--+--+----+--+--+-++-++--+++-++++-++-----+-+-+----++-_
+---------+-+----                                                _
+__END__
+
+1.times{
+  a = 1
+  class A
+    B = 1
+  end
+  2.times{
+    a+=1
+  }
+  a
+}
+
+
+__END__
+1.times{
+  a = 0
+  class A
+    B = 1
+  end
+  2.times{
+    p 1
+    a+=1#(a += 1; A)::B
+    p 2
+  }
+  a
+}
+
+__END__
+
+1.times{
+  a = 0
+  class A
+    B = 1
+  end
+  2.times{
+    (a += 1; A)
+  }
+  p a
+}
+__END__
+A = :A
+      class B
+        C = :C
+      end
+      class D
+        E = :E
+      end
+      a = []
+p      a << ((a << (a << A; B)::C); D)::E
+
+__END__
+
+def fact(n)
+        if(n > 1)
+          n * fact(n-1)
+        else
+          1
+        end
+      end
+      p fact(300)
+__END__
+
+def proc(&pr)
+  pr
+end
+
+def m
+  a = 1
+  m2{
+    a
+  }
+end
+
+def m2
+  b = 2
+  proc{
+    [yield, b]
+  }
+  10000.times{|x|
+    "#{x}"
+  }
+  yield
+end
+m
+__END__
+
 (1..10)
 __END__
 [('a'..'b'), ('a'...'b')]

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/vm.c	2005-10-03 13:34:11 UTC (rev 273)
@@ -481,7 +481,9 @@
       data->pc = block->iseq->iseq_encoded;
       data->sp = th->cfp->sp;
       data->argc = argc;
-      
+#if OPT_STACK_CACHING != 1
+      data->spbuff = *(th->cfp->sp-1);
+#endif
       th->cfp+=2; // pop, pop
     }
     else{
@@ -505,15 +507,21 @@
     th->cfp -= 2;
     th->cfp->pc = data->pc;
     // th->cfp->sp = data->sp;
+#if OPT_STACK_CACHING != 1
+    /* if not stack caching, "end" insn break dfp var.
+       so, this dfp var must be restore
+     */
+    *(th->cfp->sp-1) = data->spbuff;
+#endif
     
     for(i=0; i<data->argc; i++){
       th->cfp->dfp[i - data->local_size] = argv[i];
     }
-
     val = th_eval_body(th);
     (th->cfp-1)->pc--;
   }
   else{
+    rb_bug("unsupported\n");
     val = Qundef;
   }
   return val;

Modified: trunk/vm_opts.h
===================================================================
--- trunk/vm_opts.h	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/vm_opts.h	2005-10-03 13:34:11 UTC (rev 273)
@@ -21,7 +21,7 @@
 #define OPT_INSTRUCTIONS_UNIFICATION 1
 #define OPT_UNIFY_ALL_COMBINATION    1
 
-#define OPT_STACK_CACHING            0
+#define OPT_STACK_CACHING            1
 
 #endif /* IGNORE_OPTIMIZE */
 

Modified: trunk/yarv.h
===================================================================
--- trunk/yarv.h	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/yarv.h	2005-10-03 13:34:11 UTC (rev 273)
@@ -68,6 +68,7 @@
   yarv_block_t *block;
   VALUE *pc;
   VALUE *sp;
+  VALUE spbuff;
   int argc;
   int local_size;
 };

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2005-10-01 20:57:58 UTC (rev 272)
+++ trunk/yarvcore.c	2005-10-03 13:34:11 UTC (rev 273)
@@ -523,11 +523,19 @@
   FREE_REPORT("<- vm");
 }
 
+static int
+vm_mark_each_thread_func(st_data_t key, st_data_t value, st_data_t dummy)
+{
+  VALUE thval = (VALUE)key;
+  rb_gc_mark(thval);
+  return ST_CONTINUE;
+}
+
 static void vm_mark(void *ptr){
   MARK_REPORT("-> vm", 1);
   if(ptr){
-    yarv_vm_t *vmobj = ptr;
-    /* */
+    yarv_vm_t *vm = ptr;
+    st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
   }
   MARK_REPORT("<- vm", 0);
 }


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

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