yarv-dev:684
From: Minero Aoki <aamine loveruby.net>
Date: Fri, 09 Dec 2005 00:56:52 +0900 (JST)
Subject: [yarv-dev:684] [PATCH] rev 303 problems on LP64 systems
青木です。
Linux/AMD64 システムで trunk rev 303 が 2F になります。
~/c/yarv2 % uname -a
Linux serenade 2.6.8-11-amd64-k8 #1 Wed Jun 1 01:03:08 CEST 2005 x86_64 GNU/Linux
~/c/yarv2 % gcc -dumpversion
3.3.5
~/c/yarv2 % make yarv-test-all
ruby -I. ./yarvtest/runner.rb yarv=./miniruby ruby=ruby
"./yarvtest/test_massign.rb"
"./yarvtest/test_jump.rb"
"./yarvtest/test_exception.rb"
"./yarvtest/test_test.rb"
"./yarvtest/test_flow.rb"
"./yarvtest/test_bin.rb"
"./yarvtest/test_block.rb"
"./yarvtest/test_syntax.rb"
"./yarvtest/test_yield.rb"
"./yarvtest/test_method.rb"
"./yarvtest/test_class.rb"
"./yarvtest/test_proc.rb"
Loaded suite ./yarvtest/runner
Started
.............................F.....F.......................................................................................................................(eval):8: warning: multiple values for a block parameter (0 for 1)
from (eval):4
(eval):14: warning: multiple values for a block parameter (2 for 1)
from (eval):4
(eval):17: warning: multiple values for a block parameter (3 for 1)
from (eval):4
....
Finished in 5.86435 seconds.
1) Failure:
test_for(TestBlock)
[/home/aamine/c/yarv2/yarvtest/yarvtest.rb:107:in `ae'
/home/aamine/c/yarv2/yarvtest/test_block.rb:292:in `test_for']:
<"1..3\n"> expected but was
<"">.
2) Failure:
test_rest(TestBlock)
[/home/aamine/c/yarv2/yarvtest/yarvtest.rb:107:in `ae'
/home/aamine/c/yarv2/yarvtest/test_block.rb:335:in `test_rest']:
<"[1, [2]]\n"> expected but was
<"[[1, 2], nil]\n">.
159 tests, 402 assertions, 2 failures, 0 errors
make: *** [yarv-test-all] Error 1
このエラーは次のパッチで解消できました。
Index: compile.c
===================================================================
--- compile.c (revision 303)
+++ compile.c (working copy)
@@ -276,6 +276,7 @@
VALUE th_eval(void *);
+
static int
iseq_translate_direct_threaded_code(yarv_iseq_t *iseq)
{
@@ -310,7 +311,7 @@
static void *
-compile_data_alloc(yarv_iseq_t *iseq, int size)
+compile_data_alloc(yarv_iseq_t *iseq, size_t size)
{
void *ptr = 0;
struct iseq_compile_data_storage *storage = iseq->compile_data->storage_current;
@@ -896,7 +897,7 @@
}
if(node->nd_var->nd_args){
NODE *sn = node->nd_var->nd_args;
- if((int)sn != -1){
+ if((long)sn != -1){
if(nd_type(sn) == NODE_DASGN_CURR){
rb_ary_push(param_vars, ID2SYM(sn->nd_vid));
}
@@ -1021,7 +1022,7 @@
}
}
- if((int)node->nd_var->nd_args > 0){
+ if((long)node->nd_var->nd_args > 0){
iseq->argc++;
iseq->arg_rest = i + 1;
@@ -4366,7 +4367,7 @@
}
default:
/* ignore */
- printf("%d\n", FIX2INT(link->type));
+ printf("%ld\n", FIX2INT(link->type));
rb_bug("dump_disasm_list error");
}
link = link->next;
Index: range.c
===================================================================
--- range.c (revision 303)
+++ range.c (working copy)
@@ -366,6 +366,8 @@
* 10 11 12 13 14 15
*/
+VALUE yarv_invoke_Range_each_special_block(VALUE, VALUE, VALUE, int);
+
static VALUE
range_each(VALUE range)
{
Index: numeric.c
===================================================================
--- numeric.c (revision 303)
+++ numeric.c (working copy)
@@ -2725,11 +2725,13 @@
* 0 1 2 3 4
*/
+VALUE yarv_invoke_Integer_times_special_block(VALUE);
+
static VALUE
int_dotimes(VALUE num)
{
VALUE val;
- if((val = yarv_invoke_Integer_times_specail_block(num)) != Qundef){
+ if((val = yarv_invoke_Integer_times_special_block(num)) != Qundef){
return val;
}
Index: blockinlining.c
===================================================================
--- blockinlining.c (revision 303)
+++ blockinlining.c (working copy)
@@ -119,7 +119,7 @@
}
VALUE
-yarv_invoke_Integer_times_specail_block(VALUE num)
+yarv_invoke_Integer_times_special_block(VALUE num)
{
yarv_thread_t *th = GET_THREAD();
yarv_block_t *orig_block = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
検証
~/c/yarv2 % patch -p0 < di
略
~/c/yarv2 % make clean; make
略
~/c/yarv2 % make yarv-test-all
ruby -I. ./yarvtest/runner.rb yarv=./miniruby ruby=ruby
"./yarvtest/test_massign.rb"
"./yarvtest/test_jump.rb"
"./yarvtest/test_exception.rb"
"./yarvtest/test_test.rb"
"./yarvtest/test_flow.rb"
"./yarvtest/test_bin.rb"
"./yarvtest/test_block.rb"
"./yarvtest/test_syntax.rb"
"./yarvtest/test_yield.rb"
"./yarvtest/test_method.rb"
"./yarvtest/test_class.rb"
"./yarvtest/test_proc.rb"
Loaded suite ./yarvtest/runner
Started
...........................................................................................................................................................(eval):8: warning: multiple values for a block parameter (0 for 1)
from (eval):4
(eval):14: warning: multiple values for a block parameter (2 for 1)
from (eval):4
(eval):17: warning: multiple values for a block parameter (3 for 1)
from (eval):4
....
Finished in 5.777544 seconds.
159 tests, 405 assertions, 0 failures, 0 errors
また、日記とメールで書いた SEGV を追跡したところ、これは gcc の -O2 が
あるかどうかだけに依存することがわかりました。blockinlining.c を gcc -O0
でコンパイルすると落ちるようになります。
~/c/yarv % rm blockinlining.o
~/c/yarv % make yarv-test-all CFLAGS='-g -Wall -DRUBY_EXPORT'
gcc -g -Wall -DRUBY_EXPORT -I. -I. -c blockinlining.c
ar rcu libruby-static.a array.o ascii.o bignum.o class.o compar.o dir.o dln.o enum.o enumerator.o error.o euc_jp.o eval.o eval_load.o eval_proc.o eval_thread.o file.o gc.o hash.o inits.o io.o marshal.o math.o numeric.o object.o pack.o parse.o process.o prec.o random.o range.o re.o regcomp.o regenc.o regerror.o regexec.o regparse.o ruby.o signal.o sjis.o sprintf.o st.o string.o struct.o time.o utf8.o util.o variable.o version.o blockinlining.o compile.o debug.o disasm.o vm.o vm_dump.o yarvcore.o thread.o dmyext.o
gcc main.o libruby-static.a -lpthread -ldl -lcrypt -lm -o miniruby -g -Wall -DRUBY_EXPORT -rdynamic -Wl,-export-dynamic
ruby -I. ./yarvtest/runner.rb yarv=./miniruby ruby=ruby
"./yarvtest/test_massign.rb"
"./yarvtest/test_jump.rb"
"./yarvtest/test_exception.rb"
"./yarvtest/test_test.rb"
"./yarvtest/test_flow.rb"
"./yarvtest/test_bin.rb"
"./yarvtest/test_block.rb"
"./yarvtest/test_syntax.rb"
"./yarvtest/test_yield.rb"
"./yarvtest/test_method.rb"
"./yarvtest/test_class.rb"
"./yarvtest/test_proc.rb"
Loaded suite ./yarvtest/runner
Started
.............................[BUG] Segmentation fault
ruby 1.9.0 (2005-11-18) [x86_64-linux]
F[BUG] Segmentation fault
ruby 1.9.0 (2005-11-18) [x86_64-linux]
F........[BUG] Segmentation fault
ruby 1.9.0 (2005-11-18) [x86_64-linux]
F....[BUG] Segmentation fault
ruby 1.9.0 (2005-11-18) [x86_64-linux]
つまり gcc -O2 でコンパイルしておけば当面は回避できます。
追跡は継続しますが特に急ぐ必要はなさそうです。
--
青木峰郎
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
683 2005-12-06 16:50 [ko1 atdot.net ] [BUG] YARV craches with other program -> 684 2005-12-09 00:56 ┗[aamine loveruby.net ] [PATCH] rev 303 problems on LP64 systems 685 2005-12-09 01:31 ┗[ko1 atdot.net ] 687 2005-12-09 03:50 ┗[aamine loveruby.net ] 688 2005-12-09 05:09 ┗[ko1 atdot.net ]