[前][次][番号順一覧][スレッド一覧][生データ]

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       ]