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