yarv-diff:306
From: ko1 atdot.net
Date: 22 Feb 2006 14:39:45 -0000
Subject: [yarv-diff:306] r471 - in trunk: . ext/etc ext/win32ole
Author: ko1
Date: 2006-02-22 23:39:44 +0900 (Wed, 22 Feb 2006)
New Revision: 471
Modified:
trunk/
trunk/ChangeLog
trunk/common.mk
trunk/eval.c
trunk/eval_load.c
trunk/eval_proc.c
trunk/eval_thread.c
trunk/ext/etc/etc.c
trunk/ext/win32ole/win32ole.c
trunk/gc.c
trunk/ruby.h
trunk/signal.c
trunk/thread.c
trunk/vm_evalbody.h
trunk/yarvcore.c
trunk/yarvcore.h
Log:
r726@lermite: ko1 | 2006-02-22 23:38:42 +0900
* common.mk : add rule "runruby"
* eval_thread.c : remove obsolete comment
* eval.c : remove unused functions
* signal.c : ditto
* gc.c : add rb_register_mark_object() and use it
* eval_load.c : ditto
* eval_proc.c : ditto
* ext/etc/etc.c : ditto
* ext/win32ole/win32ole.c : ditto
* ruby.h : ditto
* yarvcore.h : ditto
* thread.c : add rb_thread_run_parallel()
* yarvcore.c : change bootstrap
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:724
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:726
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ChangeLog 2006-02-22 14:39:44 UTC (rev 471)
@@ -4,6 +4,35 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-02-22(Wed) 23:33:47 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * common.mk : add rule "runruby"
+
+ * eval_thread.c : remove obsolete comment
+
+ * eval.c : remove unused functions
+
+ * signal.c : ditto
+
+ * gc.c : add rb_register_mark_object() and use it
+
+ * eval_load.c : ditto
+
+ * eval_proc.c : ditto
+
+ * ext/etc/etc.c : ditto
+
+ * ext/win32ole/win32ole.c : ditto
+
+ * ruby.h : ditto
+
+ * yarvcore.h : ditto
+
+ * thread.c : add rb_thread_run_parallel()
+
+ * yarvcore.c : change bootstrap
+
+
2006-02-22(Wed) 19:27:33 +0900 Koichi Sasada <ko1 atdot.net>
* ext/win32ole/.cvsignore : removed
Modified: trunk/common.mk
===================================================================
--- trunk/common.mk 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/common.mk 2006-02-22 14:39:44 UTC (rev 471)
@@ -433,6 +433,9 @@
run: miniruby$(EXEEXT)
$(MINIRUBY) -I$(srcdir)/lib $(srcdir)/test.rb $(RUNOPT)
+runruby: $(RUBY)
+ ./$(RUBY) -I$(srcdir)/lib -I. $(srcdir)/rb/runruby.rb $(srcdir)/test.rb
+
parse: miniruby$(EXEEXT)
$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test.rb
@@ -456,9 +459,11 @@
run.gdb:
echo b debug_breakpoint > run.gdb
+ echo handle SIGINT nostop
+ echo handle SIGPIPE nostop
echo run >> run.gdb
-gdb: miniruby$(EXEEXT)
+gdb: miniruby$(EXEEXT) run.gdb
gdb -x run.gdb --quiet --args $(MINIRUBY) -I$(srcdir)/lib $(srcdir)/test.rb
# Intel VTune
Modified: trunk/eval.c
===================================================================
--- trunk/eval.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -45,6 +45,8 @@
static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int));
static VALUE rb_call(VALUE, VALUE, ID, int, const VALUE *, int);
+static void rb_clear_trace_func(void);
+
typedef struct event_hook {
rb_event_hook_func_t func;
rb_event_t events;
@@ -63,8 +65,6 @@
} \
} while (0)
-static VALUE trace_func = 0;
-static int tracing = 0;
static void call_trace_func _((rb_event_t, NODE *, VALUE, ID, VALUE));
@@ -90,25 +90,6 @@
void Init_stack _((VALUE *));
void Init_heap _((void));
void Init_ext _((void));
-
-#ifdef HAVE_NATIVETHREAD
-rb_nativethread_t ruby_thid;
-int
-is_ruby_native_thread()
-{
- return NATIVETHREAD_EQUAL(ruby_thid, NATIVETHREAD_CURRENT());
-}
-
-# ifdef HAVE_NATIVETHREAD_KILL
-void
-ruby_native_thread_kill(sig)
- int sig;
-{
- NATIVETHREAD_KILL(ruby_thid, sig);
-}
-# endif
-#endif
-
void Init_yarv(void);
void
@@ -120,9 +101,6 @@
if (initialized)
return;
initialized = 1;
-#ifdef HAVE_NATIVETHREAD
- ruby_thid = NATIVETHREAD_CURRENT();
-#endif
#ifdef __MACOS__
rb_origenviron = 0;
@@ -134,9 +112,6 @@
Init_stack((void *)&state);
Init_heap();
- /* default visibility is private at toplevel */
- // SCOPE_SET(SCOPE_PRIVATE);
-
PUSH_TAG(PROT_NONE);
if ((state = EXEC_TAG()) == 0) {
rb_call_inits();
@@ -170,8 +145,7 @@
ruby_process_options(argc, argv);
}
else {
- trace_func = 0;
- tracing = 0;
+ rb_clear_trace_func();
exit(error_handle(state));
}
POP_THREAD_TAG();
@@ -196,8 +170,7 @@
signal(SIGINT, SIG_DFL);
GET_THREAD()->errinfo = 0;
rb_gc_call_finalizer_at_exit();
- trace_func = 0;
- tracing = 0;
+ rb_clear_trace_func();
}
void
@@ -534,6 +507,12 @@
return -1;
}
+static void
+rb_clear_trace_func(void)
+{
+ // TODO: fix me
+}
+
/*
* call-seq:
* set_trace_func(proc) => proc
@@ -579,20 +558,22 @@
static VALUE
-set_trace_func(obj, trace)
- VALUE obj, trace;
+set_trace_func(VALUE obj, VALUE trace)
{
rb_event_hook_t *hook;
if (NIL_P(trace)) {
- trace_func = 0;
+ rb_clear_trace_func();
rb_remove_event_hook(call_trace_func);
return Qnil;
}
if (!rb_obj_is_proc(trace)) {
rb_raise(rb_eTypeError, "trace_func needs to be Proc");
}
- trace_func = trace;
+
+ // register trace func
+ // trace_func = trace;
+
for (hook = event_hooks; hook; hook = hook->next) {
if (hook->func == call_trace_func)
return trace;
@@ -629,6 +610,8 @@
static void
call_trace_func(rb_event_t event, NODE *node, VALUE self, ID id, VALUE klass)
{
+ // TODO: fix me
+#if 0
int state, raised;
NODE *node_save;
VALUE srcfile;
@@ -641,7 +624,7 @@
if (id == ID_ALLOCATOR)
return;
if (!node && ruby_sourceline == 0)
- return;
+ return;
if (!(node_save = ruby_current_node)) {
node_save = NEW_BEGIN(0);
@@ -682,6 +665,7 @@
SET_CURRENT_SOURCE();
if (state)
JUMP_TAG(state);
+#endif
}
@@ -2822,6 +2806,8 @@
void
Init_eval()
{
+ GET_THREAD()->vm->mark_object_ary = rb_ary_new();
+
init = rb_intern("initialize");
eqq = rb_intern("===");
each = rb_intern("each");
@@ -2854,7 +2840,7 @@
rb_define_method(rb_mKernel, "respond_to?", obj_respond_to, -1);
respond_to = rb_intern("respond_to?");
basic_respond_to = rb_method_node(rb_cObject, respond_to);
- rb_global_variable((VALUE *)&basic_respond_to);
+ rb_register_mark_object((VALUE)basic_respond_to);
rb_define_global_function("raise", rb_f_raise, -1);
rb_define_global_function("fail", rb_f_raise, -1);
@@ -2920,7 +2906,6 @@
rb_define_global_function("untrace_var", rb_f_untrace_var, -1); /* in variable.c */
rb_define_global_function("set_trace_func", set_trace_func, 1);
- rb_global_variable(&trace_func);
rb_define_virtual_variable("$SAFE", safe_getter, safe_setter);
}
Modified: trunk/eval_load.c
===================================================================
--- trunk/eval_load.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_load.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -504,5 +504,5 @@
rb_define_global_function("autoload?", rb_f_autoload_p, 1);
ruby_dln_librefs = rb_ary_new();
- rb_global_variable(&ruby_dln_librefs);
+ rb_register_mark_object(ruby_dln_librefs);
}
Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_proc.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -1114,12 +1114,12 @@
rb_define_method(rb_eLocalJumpError, "reason", localjump_reason, 0);
exception_error = rb_exc_new2(rb_eFatal, "exception reentered");
- rb_global_variable(&exception_error);
+ rb_register_mark_object(exception_error);
rb_eSysStackError = rb_define_class("SystemStackError", rb_eException);
sysstack_error = rb_exc_new2(rb_eSysStackError, "stack level too deep");
OBJ_TAINT(sysstack_error);
- rb_global_variable(&sysstack_error);
+ rb_register_mark_object(sysstack_error);
rb_define_global_function("proc", rb_block_proc, 0);
rb_define_global_function("lambda", proc_lambda, 0);
Modified: trunk/eval_thread.c
===================================================================
--- trunk/eval_thread.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/eval_thread.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -659,21 +659,6 @@
{
recursive_key = rb_intern("__recursive_key__");
rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
- return;
-
- /*
- VALUE cThGroup;
- rb_cThread = rb_define_class("Thread", rb_cObject);
- rb_undef_alloc_func(rb_cThread);
-
- rb_cCont = rb_define_class("Continuation", rb_cObject);
- rb_undef_alloc_func(rb_cCont);
- rb_undef_method(CLASS_OF(rb_cCont), "new");
- rb_define_method(rb_cCont, "call", rb_cont_call, -1);
- rb_define_method(rb_cCont, "[]", rb_cont_call, -1);
- rb_define_global_function("callcc", rb_callcc, 0);
-
- */
}
static VALUE
Modified: trunk/ext/etc/etc.c
===================================================================
--- trunk/ext/etc/etc.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ext/etc/etc.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -521,7 +521,6 @@
rb_define_module_function(mEtc, "endgrent", etc_endgrent, 0);
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
- rb_global_variable(&sPasswd);
sPasswd = rb_struct_define("Passwd",
"name", "passwd", "uid", "gid",
#ifdef HAVE_ST_PW_GECOS
@@ -548,12 +547,15 @@
#endif
NULL);
+ rb_register_mark_object(sPasswd);
+
#ifdef HAVE_GETGRENT
- rb_global_variable(&sGroup);
sGroup = rb_struct_define("Group", "name",
#ifdef HAVE_ST_GR_PASSWD
"passwd",
#endif
"gid", "mem", NULL);
+
+ rb_register_mark_object(sGroup);
#endif
}
Modified: trunk/ext/win32ole/win32ole.c
===================================================================
--- trunk/ext/win32ole/win32ole.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ext/win32ole/win32ole.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -6930,8 +6930,8 @@
void
Init_win32ole()
{
- rb_global_variable(&ary_ole_event);
ary_ole_event = rb_ary_new();
+ rb_register_mark_object(ary_ole_event);
id_events = rb_intern("events");
com_vtbl.QueryInterface = QueryInterface;
@@ -6941,9 +6941,8 @@
com_vtbl.GetTypeInfo = GetTypeInfo;
com_vtbl.GetIDsOfNames = GetIDsOfNames;
com_vtbl.Invoke = Invoke;
- rb_global_variable(&com_hash);
com_hash = Data_Wrap_Struct(rb_cData, rb_mark_hash, st_free_table, st_init_numtable());
-
+ rb_register_mark_object(com_hash);
cWIN32OLE = rb_define_class("WIN32OLE", rb_cObject);
rb_define_alloc_func(cWIN32OLE, fole_s_allocate);
Modified: trunk/gc.c
===================================================================
--- trunk/gc.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/gc.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -365,6 +365,12 @@
}
void
+rb_register_mark_object(VALUE obj)
+{
+ rb_ary_push(GET_THREAD()->vm->mark_object_ary, obj);
+}
+
+void
rb_gc_unregister_address(VALUE *addr)
{
struct gc_list *tmp = global_List;
@@ -1266,103 +1272,105 @@
static int
garbage_collect(void)
{
- struct gc_list *list;
- jmp_buf save_regs_gc_mark;
- yarv_thread_t *th = GET_THREAD();
+ struct gc_list *list;
+ jmp_buf save_regs_gc_mark;
+ yarv_thread_t *th = GET_THREAD();
- if (!heaps){
- return Qfalse;
- }
+ if (!heaps) {
+ return Qfalse;
+ }
- if (dont_gc || during_gc) {
- if (!freelist) {
- add_heap();
+ if (dont_gc || during_gc) {
+ if (!freelist) {
+ add_heap();
+ }
+ return Qtrue;
}
- return Qtrue;
- }
- during_gc++;
+ during_gc++;
- YARV_SET_STACK_END;
+ YARV_SET_STACK_END;
- init_mark_stack();
+ init_mark_stack();
- if (finalizer_table) {
- mark_tbl(finalizer_table, 0);
- }
+ rb_gc_mark(GET_THREAD()->vm->self);
- FLUSH_REGISTER_WINDOWS;
- /* This assumes that all registers are saved into the jmp_buf (and stack) */
- setjmp(save_regs_gc_mark);
- mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+ if (finalizer_table) {
+ mark_tbl(finalizer_table, 0);
+ }
+ FLUSH_REGISTER_WINDOWS;
+ /* This assumes that all registers are saved into the jmp_buf (and stack) */
+ setjmp(save_regs_gc_mark);
+ mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
+
#if STACK_GROW_DIRECTION < 0
- rb_gc_mark_locations(th->machine_stack_end, th->machine_stack_start);
+ rb_gc_mark_locations(th->machine_stack_end, th->machine_stack_start);
#elif STACK_GROW_DIRECTION > 0
- rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
+ rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
#else
- if (th->machine_stack_end < th->machin_stack_start)
- rb_gc_mark_locations(th->machine_stack_end, th->machin_stack_start);
- else
- rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
+ if (th->machine_stack_end < th->machin_stack_start)
+ rb_gc_mark_locations(th->machine_stack_end, th->machin_stack_start);
+ else
+ rb_gc_mark_locations(th->machin_stack_start, th->machine_stack_end + 1);
#endif
#ifdef __ia64__
- /* mark backing store (flushed register window on the stack) */
- /* the basic idea from guile GC code */
- {
- ucontext_t ctx;
- VALUE *top, *bot;
+ /* mark backing store (flushed register window on the stack) */
+ /* the basic idea from guile GC code */
+ {
+ ucontext_t ctx;
+ VALUE *top, *bot;
#if defined(HAVE_UNWIND_H) && defined(HAVE__UNW_CREATECONTEXTFORSELF)
- _Unwind_Context *unwctx = _UNW_createContextForSelf();
+ _Unwind_Context *unwctx = _UNW_createContextForSelf();
#endif
- getcontext(&ctx);
- mark_locations_array((VALUE*)&ctx.uc_mcontext,
- ((size_t)(sizeof(VALUE)-1 + sizeof ctx.uc_mcontext)/sizeof(VALUE)));
+ getcontext(&ctx);
+ mark_locations_array((VALUE*)&ctx.uc_mcontext,
+ ((size_t)(sizeof(VALUE)-1 + sizeof ctx.uc_mcontext)/sizeof(VALUE)));
#if defined(HAVE_UNWIND_H) && defined(HAVE__UNW_CREATECONTEXTFORSELF)
- _UNW_currentContext(unwctx);
- bot = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSP);
- top = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSPSTORE);
- _UNW_destroyContext(unwctx);
+ _UNW_currentContext(unwctx);
+ bot = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSP);
+ top = (VALUE*)(long)_UNW_getAR(unwctx, _UNW_AR_BSPSTORE);
+ _UNW_destroyContext(unwctx);
#else
- bot = (VALUE*)__libc_ia64_register_backing_store_base;
- top = (VALUE*)ctx.uc_mcontext.IA64_BSPSTORE;
+ bot = (VALUE*)__libc_ia64_register_backing_store_base;
+ top = (VALUE*)ctx.uc_mcontext.IA64_BSPSTORE;
#endif
- rb_gc_mark_locations(bot, top);
- }
+ rb_gc_mark_locations(bot, top);
+ }
#endif
#if defined(__human68k__) || defined(__mc68000__)
- rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
- (VALUE*)((char*)STACK_START + 2));
+ rb_gc_mark_locations((VALUE*)((char*)STACK_END + 2),
+ (VALUE*)((char*)STACK_START + 2));
#endif
- rb_gc_mark_threads();
+ rb_gc_mark_threads();
- /* mark protected global variables */
- for (list = global_List; list; list = list->next) {
- rb_gc_mark_maybe(*list->varptr);
- }
- rb_mark_end_proc();
- rb_gc_mark_global_tbl();
+ /* mark protected global variables */
+ for (list = global_List; list; list = list->next) {
+ rb_gc_mark_maybe(*list->varptr);
+ }
+ rb_mark_end_proc();
+ rb_gc_mark_global_tbl();
- rb_mark_tbl(rb_class_tbl);
- rb_gc_mark_trap_list();
+ rb_mark_tbl(rb_class_tbl);
+ rb_gc_mark_trap_list();
- /* mark generic instance variables for special constants */
- rb_mark_generic_ivar_tbl();
+ /* mark generic instance variables for special constants */
+ rb_mark_generic_ivar_tbl();
- rb_gc_mark_parser();
+ rb_gc_mark_parser();
- /* gc_mark objects whose marking are not completed*/
- while (!MARK_STACK_EMPTY){
- if (mark_stack_overflow){
- gc_mark_all();
+ /* gc_mark objects whose marking are not completed*/
+ while (!MARK_STACK_EMPTY){
+ if (mark_stack_overflow){
+ gc_mark_all();
+ }
+ else {
+ gc_mark_rest();
+ }
}
- else {
- gc_mark_rest();
- }
- }
- gc_sweep();
- return Qtrue;
+ gc_sweep();
+ return Qtrue;
}
void
Modified: trunk/ruby.h
===================================================================
--- trunk/ruby.h 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/ruby.h 2006-02-22 14:39:44 UTC (rev 471)
@@ -549,6 +549,7 @@
void rb_define_attr(VALUE,const char*,int,int);
void rb_global_variable(VALUE*);
+void rb_register_mark_object(VALUE);
void rb_gc_register_address(VALUE*);
void rb_gc_unregister_address(VALUE*);
@@ -754,14 +755,6 @@
# define NATIVETHREAD_EQUAL(t1,t2) ((t1) == (t2))
# define HAVE_NATIVETHREAD
#endif
-#ifdef HAVE_NATIVETHREAD
-int is_ruby_native_thread(void);
-#else
-#define is_ruby_native_thread() (1)
-#endif
-#ifdef HAVE_NATIVETHREAD_KILL
-void ruby_native_thread_kill(int);
-#endif
#if defined(__cplusplus)
#if 0
Modified: trunk/signal.c
===================================================================
--- trunk/signal.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/signal.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -386,28 +386,6 @@
#endif
#endif
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
-static void
-sigsend_to_ruby_thread(int sig)
-{
-#ifdef HAVE_SIGPROCMASK
- sigset_t mask, old_mask;
-#else
- int mask, old_mask;
-#endif
-
-#ifdef HAVE_SIGPROCMASK
- sigfillset(&mask);
- sigprocmask(SIG_BLOCK, &mask, &old_mask);
-#else
- mask = sigblock(~0);
- sigsetmask(mask);
-#endif
-
- ruby_native_thread_kill(sig);
-}
-#endif
-
#include <node.h>
#include "yarvcore.h"
@@ -436,13 +414,6 @@
static RETSIGTYPE
sigbus(int sig)
{
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
- if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- sigsend_to_ruby_thread(sig);
- return;
- }
-#endif
-
rb_bug("Bus Error");
}
#endif
@@ -452,12 +423,6 @@
static RETSIGTYPE
sigsegv(int sig)
{
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
- if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- sigsend_to_ruby_thread(sig);
- return;
- }
-#endif
if (segv_received) {
fprintf(stderr, "SEGV recieved in SEGV handler\n");
exit(1);
Modified: trunk/thread.c
===================================================================
--- trunk/thread.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/thread.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -550,6 +550,21 @@
return Qnil;
}
+
+VALUE
+rb_thread_run_parallel(VALUE(*func)(yarv_thread_t *th, void *), void *data)
+{
+ VALUE val;
+ yarv_thread_t *th = GET_THREAD();
+
+ GVL_UNLOCK_RANGE({
+ val = func(th, data);
+ });
+
+ return val;
+}
+
+
/*
* call-seq:
* Thread.pass => nil
Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/vm_evalbody.h 2006-02-22 14:39:44 UTC (rev 471)
@@ -83,7 +83,6 @@
return (VALUE)insns_address_table;
}
#endif
-
reg_cfp = th->cfp;
reg_pc = reg_cfp->pc;
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/yarvcore.c 2006-02-22 14:39:44 UTC (rev 471)
@@ -520,6 +520,7 @@
yarv_vm_t *vm = ptr;
st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
MARK_UNLESS_NULL(vm->thgroup_default);
+ MARK_UNLESS_NULL(vm->mark_object_ary);
}
MARK_REPORT("<- vm", 0);
}
@@ -533,6 +534,12 @@
return obj;
}
+static void
+vm_init2(yarv_vm_t *vm)
+{
+ MEMZERO(vm, yarv_vm_t, 1);
+}
+
static VALUE
vm_init(VALUE self, VALUE node)
{
@@ -540,6 +547,7 @@
yarv_vm_t *vm;
GetVMVal(self, vm);
vm->self = self;
+ vm->mark_object_ary = rb_ary_new();
return self;
}
@@ -1227,11 +1235,14 @@
VALUE vmval = rb_class_new_instance(0, 0, cYarvVM);
yarv_vm_t *vm;
yarv_thread_t *th;
- GetVMVal(vmval, vm);
- theYarvVM = vm;
+ vm = theYarvVM;
+ xfree(RDATA(vmval)->data);
+ RDATA(vmval)->data = vm;
+ vm->self = vmval;
+
yarvVMArray = rb_ary_new();
- rb_global_variable(&yarvVMArray);
+ rb_register_mark_object(yarvVMArray);
rb_ary_push(yarvVMArray, vm->self);
/* create main thread */
@@ -1270,7 +1281,13 @@
Init_yarv(void)
{
/* initialize main thread */
+ yarv_vm_t *vm = ALLOC(yarv_vm_t);
yarv_thread_t *th = ALLOC(yarv_thread_t);
+
+ vm_init2(vm);
+ theYarvVM = vm;
+
th_init2(th);
+ th->vm = vm;
yarv_set_current_running_thread_raw(th);
}
Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h 2006-02-22 11:21:20 UTC (rev 470)
+++ trunk/yarvcore.h 2006-02-22 14:39:44 UTC (rev 471)
@@ -295,6 +295,11 @@
int thread_abort_on_exception;
int exit_code;
unsigned long trace_flag;
+
+
+ /* object management */
+ VALUE mark_object_ary;
+
} yarv_vm_t;
typedef struct {
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml