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