summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--common.mk5
-rw-r--r--inits.c2
-rw-r--r--prelude.rb14
-rw-r--r--thread.c6
-rw-r--r--tool/compile_prelude.rb25
6 files changed, 60 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e5373e3dc4..0f0f1838cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Sat Aug 25 00:22:31 2007 Koichi Sasada <ko1@atdot.net>
+
+ * prelude.rb: added. run this script on startup.
+
+ * tool/compile_prelude.rb: compile prelude.rb to C string.
+ (prelude.rb -> prelude.c)
+
+ * common.mk: fix to build with prelude.c.
+
+ * inits.c (rb_call_inits): ditto.
+
+ * thread.c (Init_Thread): move definition of Mutex#synchronize
+ to prelude.rb.
+
Sat Aug 25 00:08:43 2007 Koichi Sasada <ko1@atdot.net>
* compile.c (compile_massign_opt): fix to skip massign optimization
diff --git a/common.mk b/common.mk
index 060e0501ec..742223fa7f 100644
--- a/common.mk
+++ b/common.mk
@@ -76,6 +76,7 @@ OBJS = array.$(OBJEXT) \
thread.$(OBJEXT) \
cont.$(OBJEXT) \
id.$(OBJEXT) \
+ prelude.$(OBJEXT) \
$(MISSING)
SCRIPT_ARGS = --dest-dir="$(DESTDIR)" \
@@ -588,6 +589,7 @@ blockinlining.$(OBJEXT): {$(VPATH)}blockinlining.c \
{$(VPATH)}debug.h {$(VPATH)}vm_opts.h \
{$(VPATH)}thread_$(THREAD_MODEL).h
id.$(OBJEXT): {$(VPATH)}id.c {$(VPATH)}ruby.h
+prelude.$(OBJEXT): {$(VPATH)}prelude.c {$(VPATH)}ruby.h
MATZRUBY = $(MATZRUBYDIR)ruby
@@ -621,6 +623,9 @@ incs: $(INSNS) node_name.inc
node_name.inc: {$(VPATH)}node.h
$(BASERUBY) -n $(srcdir)/tool/node_name.rb $? > $@
+prelude.c: {$(VPATH)}prelude.rb
+ $(BASERUBY) $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb prelude.c
+
docs:
$(BASERUBY) -I$(srcdir) $(srcdir)/tool/makedocs.rb $(INSNS2VMOPT)
diff --git a/inits.c b/inits.c
index f63ea7de0e..7c53fb7aa2 100644
--- a/inits.c
+++ b/inits.c
@@ -51,6 +51,7 @@ void Init_VM(void);
void Init_Thread(void);
void Init_Cont(void);
void Init_top_self(void);
+void Init_prelude(void);
void
rb_call_inits()
@@ -94,4 +95,5 @@ rb_call_inits()
Init_Thread();
Init_Cont();
Init_version();
+ Init_prelude();
}
diff --git a/prelude.rb b/prelude.rb
new file mode 100644
index 0000000000..423c9c423e
--- /dev/null
+++ b/prelude.rb
@@ -0,0 +1,14 @@
+
+# Mutex
+
+class Mutex
+ class Mutex
+ def synchronize
+ self.lock
+ yield
+ ensure
+ self.unlock
+ end
+ end
+end
+
diff --git a/thread.c b/thread.c
index 9a20254c6a..cedfcbea49 100644
--- a/thread.c
+++ b/thread.c
@@ -2968,12 +2968,6 @@ Init_Thread(void)
rb_define_method(rb_cMutex, "unlock", rb_mutex_unlock, 0);
rb_define_method(rb_cMutex, "sleep", mutex_sleep, -1);
- rb_iseq_eval(rb_iseq_compile(
- rb_str_new2("class Mutex;"
- " def synchronize; self.lock; yield; ensure; self.unlock; end;"
- "end;"),
- rb_str_new2(__FILE__), INT2FIX(__LINE__)));
-
recursive_key = rb_intern("__recursive_key__");
rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);
diff --git a/tool/compile_prelude.rb b/tool/compile_prelude.rb
new file mode 100644
index 0000000000..13ccb8aced
--- /dev/null
+++ b/tool/compile_prelude.rb
@@ -0,0 +1,25 @@
+
+prelude, outfile = *ARGV
+lines = []
+
+File.readlines(prelude).each{|line|
+ lines << "#{line.dump}"
+}
+
+open(outfile, 'w'){|f|
+f.puts <<EOS__
+
+#include "ruby/ruby.h"
+static const char *prelude_code =
+#{lines.join("\n")}
+;
+void
+Init_prelude(void)
+{
+ rb_iseq_eval(rb_iseq_compile(
+ rb_str_new2(prelude_code),
+ rb_str_new2("prelude.rb"), INT2FIX(1)));
+}
+EOS__
+}
+