summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ricsin/ChangeLog4
-rw-r--r--ricsin/ricsin.rb26
-rw-r--r--ricsin/t.rcb8
3 files changed, 34 insertions, 4 deletions
diff --git a/ricsin/ChangeLog b/ricsin/ChangeLog
index 60e7b76a92..e5466a3bf0 100644
--- a/ricsin/ChangeLog
+++ b/ricsin/ChangeLog
@@ -1,3 +1,7 @@
+Fri Sep 26 12:49:52 2008 Koichi Sasada <ko1@atdot.net>
+
+ * ricsin/ricsin.rb: fix $0 and fix to output ricsin_#{name}.rb.
+
Wed Sep 24 17:42:30 2008 Koichi Sasada <ko1@atdot.net>
* ricsin/test.rcb: add 2 assersions.
diff --git a/ricsin/ricsin.rb b/ricsin/ricsin.rb
index 2967b3b759..9fb63618c8 100644
--- a/ricsin/ricsin.rb
+++ b/ricsin/ricsin.rb
@@ -15,8 +15,8 @@ class Ricsin
@basename = File.basename(file, '.rcb')
@output_dir = option[:output_dir]
@src_rcb = file
- @out_rb = File.join(@output_dir, "#{@basename}.rb")
- @out_c = File.join(@output_dir, "#{@basename}.c")
+ @out_rb = File.join(@output_dir, "ricsin_#{@basename}.rb")
+ @out_c = File.join(@output_dir, "ricsin_#{@basename}.c")
@out_so = nil
@so_basename = "ricsin_#{@basename}"
@src = nil
@@ -27,6 +27,7 @@ class Ricsin
def run
raise unless @out_so
require @out_so
+ ::RICSIN_ISEQMAP[@so_basename].eval
end
def generate
@@ -37,6 +38,15 @@ class Ricsin
generate_csrc
generate_dll
+ generate_rb
+ end
+
+ def generate_rb
+ open(@out_rb, 'wb'){|f|
+ f.puts "require '#{@so_basename}.so'"
+ f.puts "$0 = '#{@basename}.rcb' if $0 == __FILE__"
+ f.puts "::RICSIN_ISEQMAP['#{@so_basename}'].eval"
+ }
end
def preprocess file
@@ -75,7 +85,7 @@ class Ricsin
system("#{ruby} extconf.rb")
else
cmd = "#{ruby} -r mkmf -e "\
- "'$objs=[#{(File.basename(@src_rcb, '.rcb')+'.o').dump}]; " \
+ "'$objs=[#{(File.basename(@out_c, '.c')+'.o').dump}]; " \
"create_makefile(#{@so_basename.dump})'"
system(cmd)
end or raise "extconf"
@@ -152,6 +162,7 @@ Init_#{@so_basename}(void)
VALUE file = rb_str_new2("#{File.basename(@src_rcb)}");
VALUE line = INT2FIX(1);
VALUE opt = rb_hash_new();
+ VALUE map;
VALUE iseq;
#{
@@ -176,7 +187,14 @@ Init_#{@so_basename}(void)
rb_io_puts(1, &disasm_str, rb_stdout);
}
- rb_iseq_eval(iseq);
+ if (rb_const_defined(rb_cObject, rb_intern("RICSIN_ISEQMAP"))) {
+ map = rb_const_get(rb_cObject, rb_intern("RICSIN_ISEQMAP"));
+ }
+ else {
+ map = rb_hash_new();
+ rb_const_set(rb_cObject, rb_intern("RICSIN_ISEQMAP"), map);
+ }
+ rb_hash_aset(map, rb_str_new2("#{@so_basename}"), iseq);
}
EOS
end
diff --git a/ricsin/t.rcb b/ricsin/t.rcb
index 450bc76f8c..c032c8a450 100644
--- a/ricsin/t.rcb
+++ b/ricsin/t.rcb
@@ -1,3 +1,11 @@
+p $0
+p $0 == __FILE__
+
+__END__
+p $0
+p $"
+
+__END__
$foo = 42
p __C__('return $foo; /* $foo */')