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

yarv-diff:57

From: ko1 atdot.net
Date: 28 Jul 2005 11:19:24 -0000
Subject: [yarv-diff:57] r212 - trunk

Author: ko1
Date: 2005-07-28 20:19:23 +0900 (Thu, 28 Jul 2005)
New Revision: 212

Modified:
   trunk/ChangeLog
   trunk/insnhelper.h
   trunk/insns.def
   trunk/test.rb
   trunk/vm_dump.c
   trunk/vm_evalbody.h
   trunk/vm_macro.def
   trunk/yarvcore.c
Log:
	* yarvcore.c : add mark/free message to debug gc

	* insnhelper.h, insns.def, vm_macro.def : remove and
	add new RESTORE_REGS

	* vm_evalbody.h : fix register allocation



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/ChangeLog	2005-07-28 11:19:23 UTC (rev 212)
@@ -4,6 +4,16 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-07-28(Thu) 20:17:09 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* yarvcore.c : add mark/free message to debug gc
+
+	* insnhelper.h, insns.def, vm_macro.def : remove and
+	add new RESTORE_REGS
+
+	* vm_evalbody.h : fix register allocation
+
+
 2005-07-28(Thu) 02:00:42 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* vm.c, etc : change VM stack structure. re-write all

Modified: trunk/insnhelper.h
===================================================================
--- trunk/insnhelper.h	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/insnhelper.h	2005-07-28 11:19:23 UTC (rev 212)
@@ -58,11 +58,14 @@
 #define REG_LFP (REG_CFP->lfp)
 #define REG_DFP (REG_CFP->dfp)
 
+#define RESTORE_REGS() \
+{ \
+  REG_CFP = th->cfp; \
+}
+
 #define REG_A   reg_a
 #define REG_B   reg_b
 
-#define RESTORE_REGS()       (0)
-
 #ifdef COLLECT_USAGE_ANALYSIS
 #define USAGE_ANALYSIS_REGISTER_HELPER(a, b, v) \
   (USAGE_ANALYSIS_REGISTER(a, b), (v))

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/insns.def	2005-07-28 11:19:23 UTC (rev 212)
@@ -953,7 +953,7 @@
              FRAME_MAGIC_CLASS, klass, 0,
              klass_iseq->ISEQ_MEMBER, 0,
              klass_iseq->local_size, 0, 0);
-  reg_cfp = th->cfp;
+  RESTORE_REGS();
   
   /* others */
   rb_ary_push(th->klass_nest_stack, klass);
@@ -1015,7 +1015,7 @@
              FRAME_MAGIC_CLASS, module, 0,
              module_iseq->ISEQ_MEMBER, 0,
              module_iseq->local_size, 0, 0);
-  reg_cfp = th->cfp;
+  RESTORE_REGS();
   
   /* others */
   rb_ary_push(th->klass_nest_stack, module);
@@ -1204,7 +1204,7 @@
                iseq->ISEQ_MEMBER, block->lfp,
                iseq->local_size - num, 0, 0);
     reg_cfp->sp -= num;
-    reg_cfp = th->cfp;
+    RESTORE_REGS();
     NEXT_INSN();
     /* unreachable */
   }
@@ -1231,7 +1231,7 @@
 #else
   ORPHAN_ENV(GET_DFP());
   POP_CONTROL_STACK_FRAME(th);
-  REG_CFP = th->cfp;
+  RESTORE_REGS();
 #endif
 }
 

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/test.rb	2005-07-28 11:19:23 UTC (rev 212)
@@ -7,11 +7,14 @@
 $line = __LINE__ + 3
 ###########################################################
 $prog =<<'__EOP__'
+def m
+  p :m
+end
 
-require 'stringio'
+p 1
+m
+p 2
 
-str = StringIO.new('hoge')
-
 __END__
 3.times{|bl|
   break 10

Modified: trunk/vm_dump.c
===================================================================
--- trunk/vm_dump.c	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/vm_dump.c	2005-07-28 11:19:23 UTC (rev 212)
@@ -59,7 +59,6 @@
   printf("s:%-8s ", selfstr);
   printf("%-2s ", biseq_name);
   printf("\n");
-  printf("%p\n", cfp);
 }
 
 void stack_dump_raw(yarv_thread_t *th, yarv_control_frame_t *cfp){
@@ -239,7 +238,6 @@
     int pc = cfp->pc - iseq->ISEQ_MEMBER;
     
     iseq_disasm_insn(0, seq, pc, iseq, 0);
-    printf("--\n");
   }
   
 #if VMDEBUG > 3
@@ -253,8 +251,10 @@
                       , VALUE reg_a, VALUE reg_b
 #endif
                       ){
-SDR2(cfp);
-  
+#if VMDEBUG > 9
+  SDR2(cfp);
+#endif
+
 #if VMDEBUG > 3
   printf("        (2)");
   debug_print_register(th);
@@ -274,7 +274,7 @@
   }
 #endif
 #endif
-  
+
 #if VMDEBUG > 9
   GC_CHECK();
 #endif

Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/vm_evalbody.h	2005-07-28 11:19:23 UTC (rev 212)
@@ -21,32 +21,43 @@
 #ifdef OPT_STACK_CACHING
 #if 0
 #elif __GNUC__ && __x86_64
-  DECL_SC_REG(VALUE, a, "13");
-  DECL_SC_REG(VALUE, b, "14");
+  DECL_SC_REG(VALUE, a, "12");
+  DECL_SC_REG(VALUE, b, "13");
 #else
   register VALUE reg_a;
   register VALUE reg_b;
 #endif
 #endif
 
-#if 0
-
-#elif __GNUC__ && __i386__
-  //DECL_SC_REG(VALUE *, pc,  "di");
-  register VALUE *reg_pc;
+#if __GNUC__ && __i386__
+  DECL_SC_REG(VALUE *, pc,  "di");
   DECL_SC_REG(yarv_control_frame_t *, cfp, "si");
-#undef  SET_PC
-#define SET_PC(x) (reg_cfp->pc = REG_PC = (x))
+#define USE_MACHINE_REGS 1
 
-#elif __GNUC__ && __x86_64
-  DECL_SC_REG(VALUE *, pc, "15");
+#elif __GNUC__ && __AMD64__
+  DECL_SC_REG(VALUE *, pc, "14");
+  DECL_SC_REG(yarv_control_frame_t *, cfp, "15");
+#define USE_MACHINE_REGS 1
+#endif
+
+#if USE_MACHINE_REGS
+
+#undef  RESTORE_REGS
+#define RESTORE_REGS() \
+{ \
+  REG_CFP = th->cfp; \
+  reg_pc  = reg_cfp->pc; \
+}
+
+#undef  REG_PC
+#define REG_PC reg_pc
+#undef  GET_PC
+#define GET_PC() (reg_pc)
 #undef  SET_PC
 #define SET_PC(x) (reg_cfp->pc = REG_PC = (x))
 #endif
 
   ID tmp_id;
-  
-  int state;
 
 #ifdef OPT_THREADED_CODE
 #include "vmtc.inc"

Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/vm_macro.def	2005-07-28 11:19:23 UTC (rev 212)
@@ -167,7 +167,7 @@
                niseq->ISEQ_MEMBER + opt_pc, 0,
                0, 0, 0);
     reg_cfp->sp = rsp;
-    reg_cfp = th->cfp;
+    RESTORE_REGS();
   }
 }
 

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2005-07-27 17:14:43 UTC (rev 211)
+++ trunk/yarvcore.c	2005-07-28 11:19:23 UTC (rev 212)
@@ -45,9 +45,6 @@
 ID idEach;
 ID idLength;
 
-#define MARK_UNLESS_NULL(ptr) if(ptr){rb_gc_mark(ptr);}
-#define FREE_UNLESS_NULL(ptr) if(ptr){ruby_xfree(ptr);}
-
 unsigned long yarvGlobalStateVersion = 1;
 
 
@@ -60,7 +57,18 @@
 #define va_init_list(a,b) va_start(a)
 #endif
 
+#if 0
+#define MARK_REPORT(msg) printf("mark: %s\n", msg)
+#define FREE_REPORT(msg) printf("free: %s\n", msg)
+#else
+#define MARK_REPORT(msg)
+#define FREE_REPORT(msg)
+#endif
 
+#define MARK_UNLESS_NULL(ptr) if(ptr){rb_gc_mark(ptr);}
+#define FREE_UNLESS_NULL(ptr) if(ptr){ruby_xfree(ptr);}
+
+
 /************/
 /* YARVCore */
 /************/
@@ -292,6 +300,7 @@
 
 static void iseq_free(void *ptr){
   yarv_iseq_t *iseqobj;
+  FREE_REPORT("-> iseq");
   
   if(ptr){
     iseqobj = ptr;
@@ -306,10 +315,12 @@
     compile_data_free(iseqobj->compile_data);
     ruby_xfree(ptr);
   }
+  FREE_REPORT("<- iseq");
 }
 
 static void iseq_mark(void *ptr){
   yarv_iseq_t *iseq;
+  MARK_REPORT("-> iseq");
   if(ptr){
     iseq = ptr;
     MARK_UNLESS_NULL(iseq->iseq_mark_ary);
@@ -324,6 +335,7 @@
       MARK_UNLESS_NULL(iseq->compile_data->err_info);
     }
   }
+  MARK_REPORT("<- iseq");
 }
 
 static VALUE iseq_alloc(VALUE klass){
@@ -416,17 +428,21 @@
 /******/
 
 static void vm_free(void *ptr){
+  FREE_REPORT("-> vm");
   if(ptr){
     ruby_xfree(ptr);
   }
+  FREE_REPORT("<- vm");
 }
 
 static void vm_mark(void *ptr){
   yarv_vm_t *vmobj;
+  MARK_REPORT("-> vm");
   if(ptr){
     vmobj = ptr;
     rb_gc_mark(vmobj->main_thread);
   }
+  MARK_REPORT("<- vm");
 }
 
 static VALUE vm_alloc(VALUE klass){
@@ -466,15 +482,18 @@
 
 static void thread_free(void *ptr){
   yarv_thread_t *th;
+  FREE_REPORT("-> thread");
   if(ptr){
     th = ptr;
     FREE_UNLESS_NULL(th->stack);
     ruby_xfree(ptr);
   }
+  FREE_REPORT("<- thread");
 }
 
 static void thread_mark(void *ptr){
   yarv_thread_t *th;
+  MARK_REPORT("-> thread");
   if(ptr){
     th = ptr;
     if(th->stack){
@@ -490,6 +509,7 @@
     MARK_UNLESS_NULL(th->stat_insn_usage);
     MARK_UNLESS_NULL(th->klass_nest_stack);
   }
+  MARK_REPORT("<- thread");
 }
 
 static VALUE thread_alloc(VALUE klass){
@@ -529,6 +549,8 @@
   return self;
 }
 
+VALUE th_eval_body(yarv_thread_t *th);
+
 static VALUE thread_eval(VALUE self, VALUE iseq){
   VALUE val;
   yarv_thread_t *th;
@@ -537,7 +559,6 @@
   yarvCurrentRunningThread = self;
   thread_set_top_stack(self, iseq);
   val = th_eval_body(th);
-
   return val;
 }
 
@@ -548,15 +569,18 @@
 
 static void env_free(void *ptr){
   yarv_env_t *env;
+  FREE_REPORT("-> env");
   if(ptr){
     env = ptr;
     FREE_UNLESS_NULL(env->env);
     ruby_xfree(ptr);
   }
+  FREE_REPORT("<- env");
 }
 
 static void env_mark(void *ptr){
   yarv_env_t *env;
+  MARK_REPORT("-> env");
   if(ptr){
     env = ptr;
     if(env->env){
@@ -565,6 +589,7 @@
     }
     MARK_UNLESS_NULL(env->prev_envval);
   }
+  MARK_REPORT("<- env");
 }
 
 static VALUE env_alloc(VALUE klass){
@@ -581,18 +606,22 @@
 /***************/
 
 static void proc_free(void *ptr){
+  FREE_REPORT("-> proc");
   if(ptr){
     ruby_xfree(ptr);
   }
+  FREE_REPORT("<- proc");
 }
 
 static void proc_mark(void *ptr){
   yarv_proc_t *proc;
+  MARK_REPORT("-> proc");
   if(ptr){
     proc = ptr;
     MARK_UNLESS_NULL(proc->envval);
-//    MARK_UNLESS_NULL(proc->blockprocval);
+    MARK_UNLESS_NULL(proc->blockprocval);
   }
+  MARK_REPORT("<- proc");
 }
 
 static VALUE proc_alloc(VALUE klass){


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

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