SEGV by test/ruby/test_fiber.rb

test/ruby/test_fiber.rb e$B$G$9$,!"0J2<$N$h$&$Ke(B insnhelper.ci
e$BFb$Ne(B rb_ary_new4 e$B8F$S=P$7$N$H$3$m$Ge(B GC
e$B$rKh2s5/F0$9$k$h$&$Ke(B
e$B$9$k$H?t2s$K0lEY$/$i$$$N3d9g$Ge(B SEGV e$B$9$k$h$&$K$J$j$^$9!#e(B

Index: insnhelper.ci

— insnhelper.ci (e$B%j%S%8%g%se(B 14103)
+++ insnhelper.ci (e$B:n6H%3%T!<e(B)
@@ -159,6 +159,7 @@

/* rest arguments */
if (iseq->arg_rest != -1) {

  •        rb_gc();
     dst[iseq->arg_rest] = rb_ary_new4(argc, argv);
     argc = 0;
    
    }

% ./miniruby test/ruby/test_fiber.rb
Loaded suite test/ruby/test_fiber
Started
…/tmp/a/lib/ruby/1.9/test/unit/assertions.rb:79: – control frame

c:0004 p:0018 s:0017 b:0012 l:000011 d:000011 METHOD
/tmp/a/lib/ruby/1.9/test/unit/assertions.rb:79
c:0003 p:0012 s:0005 b:0005 l:001120 d:000004 BLOCK
test/ruby/test_fiber.rb:10
c:0002 p:---- s:0004 b:0003 l:000002 d:000002 FINISH
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------

DBG> : “test/ruby/test_fiber.rb:10:in `block in test_normal’”
– backtrace of native function call (Use addr2line) –
0x81148a5
0x806f963
0x806fa2b
0x80da420
0xb7f8f440
0x810a5fd
0x80826c8
0x810a591
0x80deaa6
0x810a980
0x80826c8
0x8082f23
0x80836eb
0x810bde4
0x810cc89
0x810fb16
0x8113174
0x810c3b7
0x810cad7
0x8119b98
0x8072c93
0x8076af8
0x8058120
0xb7df0ea8
0x8058031

[BUG] Segmentation fault
ruby 1.9.0 (2007-12-04) [i686-linux]

zsh: abort (core dumped) ./miniruby test/ruby/test_fiber.rb
% gdb miniruby core.6261
GNU gdb 6.4.90-debian
Copyright © 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for
details.
This GDB was configured as “i486-linux-gnu”…Using host libthread_db
library “/lib/tls/i686/cmov/libthread_db.so.1”.

warning: Can’t read pathname for load map: Input/output error.
Reading symbols from /lib/tls/i686/cmov/libpthread.so.0…done.
Loaded symbols for /lib/tls/i686/cmov/libpthread.so.0
Reading symbols from /lib/tls/i686/cmov/librt.so.1…done.
Loaded symbols for /lib/tls/i686/cmov/librt.so.1
Reading symbols from /lib/tls/i686/cmov/libdl.so.2…done.
Loaded symbols for /lib/tls/i686/cmov/libdl.so.2
Reading symbols from /lib/tls/i686/cmov/libcrypt.so.1…done.
Loaded symbols for /lib/tls/i686/cmov/libcrypt.so.1
Reading symbols from /lib/tls/i686/cmov/libm.so.6…done.
Loaded symbols for /lib/tls/i686/cmov/libm.so.6
Reading symbols from /lib/tls/i686/cmov/libc.so.6…done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2…done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /tmp/a/lib/ruby/1.9/i686-linux/fiber.so…done.
Loaded symbols for /tmp/a/lib/ruby/1.9/i686-linux/fiber.so
Reading symbols from
/tmp/a/lib/ruby/1.9/i686-linux/continuation.so…done.
Loaded symbols for /tmp/a/lib/ruby/1.9/i686-linux/continuation.so
Reading symbols from /lib/libgcc_s.so.1…done.
Loaded symbols for /lib/libgcc_s.so.1
Core was generated by `test/ruby/test_fiber.rb test_norma’.
Program terminated with signal 6, Aborted.
#0 0xb7f8f410 in ?? ()
(gdb) bt
#0 0xb7f8f410 in ?? ()
#1 0xbfa33bfc in ?? ()
#2 0x00000006 in ?? ()
#3 0x00001875 in ?? ()
#4 0xb7e04811 in raise () from /lib/tls/i686/cmov/libc.so.6
#5 0xb7e05fb9 in abort () from /lib/tls/i686/cmov/libc.so.6
#6 0x0806fa30 in rb_bug (fmt=0x813593d “Segmentation fault”) at
error.c:228
#7 0x080da420 in sigsegv (sig=11) at signal.c:541
#8 0xb7f8f440 in ?? ()
#9 0x0000000b in ?? ()
#10 0xbfa33d8c in ?? ()
#11 0xbfa33e0c in ?? ()
#12 0x0000000b in ?? ()
#13 0x00000000 in ?? ()
(gdb)

In article [email protected],
Tanaka A. [email protected] writes:

test/ruby/test_fiber.rb e$B$G$9$,!"0J2<$N$h$&$Ke(B insnhelper.ci
e$BFb$Ne(B rb_ary_new4 e$B8F$S=P$7$N$H$3$m$Ge(B GC e$B$rKh2s5/F0$9$k$h$&$Ke(B
e$B$9$k$H?t2s$K0lEY$/$i$$$N3d9g$Ge(B SEGV e$B$9$k$h$&$K$J$j$^$9!#e(B

e$B0J2<$N$h$&$K$9$k$H>I>u$,$*$5$^$j$^$9$,!"$I$&$G$9$+$M!#e(B
e$B$J$s$H$bBP>INEK!$N$h$&$J5$$b$7$^$9$,!#e(B

Index: vm.c

— vm.c (revision 14113)
+++ vm.c (working copy)
@@ -1622,7 +1622,7 @@ rb_thread_mark(void *ptr)
(void *)(th->stack + th->stack_size);

   while (p < sp) {
  • rb_gc_mark(*p++);
  • rb_gc_mark_maybe(*p++);
    }
    while (cfp != limit_cfp) {
    rb_gc_mark(cfp->proc);

e$B1sF#$H?=$7$^$9!#e(B

07/12/07 e$B$Ke(B Tanaka A.[email protected] e$B$5$s$O=q$-$^$7$?e(B:

test/ruby/test_fiber.rb e$B$G$9$,!"0J2<$N$h$&$Ke(B insnhelper.ci
e$BFb$Ne(B rb_ary_new4 e$B8F$S=P$7$N$H$3$m$Ge(B GC e$B$rKh2s5/F0$9$k$h$&$Ke(B
e$B$9$k$H?t2s$K0lEY$/$i$$$N3d9g$Ge(B SEGV e$B$9$k$h$&$K$J$j$^$9!#e(B

vm_invoke_block e$B7PM3$Ge(B vm_callee_setup_arg e$B$,8F$P$l$k;~$Oe(B
sp e$B$,e(B argv e$B$N@hC<$r;X$7$F$$$k$h$&$J$N$G$9$,!"e(B
vm_setup_method e$B7PM3$Ge(B vm_callee_setup_arg e$B$,8F$P$l$k;~$Oe(B
sp e$B$,e(B argv e$B$N=*C<e(B (e$B$N<!e(B)
e$B$r;X$7$F$$$k$H;W$$$^$9!#e(B

e$B$3$N$?$ae(B vm_setup_method e$B7PM3$N>l9g!"%9%?%C%/$N=*C<$rD6$($?e(B
e$BHO0O$^$Ge(B mark e$B$5$l$F$7$^$C$F$$$k$N$G$O$J$$$+$H;W$$$^$9!#e(B
(vm_callee_setup_arg e$BCf$Ge(B th->mark_stack_len = iseq->arg_size;
e$B$7$F$$$k$?$ae(B)

e$B0J2<$N%Q%C%A$Ge(B rb_gc() e$B$rF~$l$F$b>I>u$,=P$J$/$J$j$^$7$?!#e(B

reg_cfp e$B$He(B cfp

e$B$NJQ?tL>$N;H$$J,$1$K$O0UL#$,$"$k$s$G$7$g$&$+!#e(B

Index: insnhelper.ci

— insnhelper.ci (revision 14130)
+++ insnhelper.ci (working copy)
@@ -429,7 +429,9 @@
/* TODO: eliminate it */
GetISeqPtr(iseqval, iseq);

  • cfp->sp -= argc;
    opt_pc = vm_callee_setup_arg(th, iseq, argc, rsp, &blockptr);

  • cfp->sp += argc;
    sp = rsp + iseq->arg_size;

    /* stack overflow check */

e$B!!$5$5$@$G$9!%e(B

Yusuke ENDOH wrote:

e$B0J2<$N%Q%C%A$Ge(B rb_gc() e$B$rF~$l$F$b>I>u$,=P$J$/$J$j$^$7$?!#e(B
e$B!!$I$&$b$"$j$,$H$&$4$6$$$^$9!%A4$/$=$NDL$j$G$9!%%9%?%C%/>e$K$Oe(B
Ruby
e$B%%V%8%’%/%H0J30CV$+$J$$$h$&$K$7$F$$$?$D$b$j$G$7$?$,!$$4;XE&$N$H$$je(B
e$B7j$,$"$C$?$h$&$G$9!%e(B

e$B!!CV$+$J$$MM$K$7$F$$$?$N$O!$$^$5$Ke(B maybe e$B$K$7$Fe(B GC
e$B$rCY$/$7$?$/$Je(B
e$B$+$C$?$?$a$G$7$?!%e(B

reg_cfp e$B$He(B cfp e$B$NJQ?tL>$N;H$$J,$1$K$O0UL#$,$"$k$s$G$7$g$&$+!#e(B

e$B!!e(Bcfp e$B$O!$IaDL$K;H$&%m!<%+%kJQ?t!$e(Breg_cfp e$B$Oe(B VM
e$B4X?tCf$GEP>l$9$k!$e(B

#define REG_CFP (reg_cfp)

e$B$H@k8@$5$l$F$$$k$b$N$G$9!%K\Ev$Oe(B reg_cfp
e$B$C$FD>@=q$$$A$c$$$1$J$$$se(B
e$B$G$9$h$M$’!%e(B

e$B1sF#$G$9!#e(B

07/12/09 e$B$Ke(B SASADA Koichi[email protected] e$B$5$s$O=q$-$^$7$?e(B:

e$B0J2<$N%Q%C%A$Ge(B rb_gc() e$B$rF~$l$F$b>I>u$,=P$J$/$J$j$^$7$?!#e(B

e$B!!$I$&$b$“$j$,$H$&$4$6$$$^$9!%A4$/$=$NDL$j$G$9!%%9%?%C%/>e$K$Oe(B Ruby
e$B%%V%8%'%/%H0J30CV$+$J$$$h$&$K$7$F$$$?$D$b$j$G$7$?$,!$$4;XE&$N$H$$je(B
e$B7j$,$”$C$?$h$&$G$9!%e(B

r14156 e$B$r8+$^$7$?$,!“e(Bcfp->sp
e$B$r=q$-49$($J$$$N$OM}M3$,$”$k$N$G$7$g$&$+!#e(B
e$B$"$He(B sp e$B$NBeF~$r0\F0$7$?0U?^$,$o$+$j$^$;$s!#e(B

e$B$^$?!“8e$G5$$E$-$^$7$?$,e(B mark_stack_len = iseq->arg_size;
e$B$OIT==J,$@$He(B
e$B;W$$$^$9!#e(Bsp e$B$,e(B argv e$B$N@hF,$N$H$-!”$=$3$+$ie(B
iseq->arg_size e$BJ,$7$+e(B mark
e$B$5$l$^$;$s!#$=$N$?$ae(B argv e$B$ND9$5$,e(B iseq->arg_size
e$B$h$jD9$+$C$?>l9g!"e(B
e$BNc$N>l=j$Ge(B gc e$B$,5/$-$?$ie(B argv e$B$NCf$NMWAG$,e(B gc
e$B$5$l$F$7$^$&$H;W$$$^$9!#e(B

e$BZNc$G$9!#e(Brb_gc()
e$B$rNc$N>l=j$XA^F~$7$F$*$/$H0J2<$GMn$A$^$9!#K\Ev$Ke(B
e$B$3$N$;$$$GMn$A$F$$$k$N$+$I$&$+$OL$3NG’$G$9$,!#e(B

$ ./ruby -e ’
def foo
yield(Object.new, Object.new, Object.new)
end

foo(&lambda {|*a| p a })

-e:6: – control frame ----------
c:0007 p:---- s:0016 b:0016 l:000015 d:000015 CFUNC :inspect
c:0006 p:---- s:0014 b:0014 l:000013 d:000013 CFUNC :stuck_out_tongue:
c:0005 p:0010 s:0010 b:0010 l:000584 d:000009 BLOCK -e:6
c:0004 p:0042 s:0008 b:0008 l:000007 d:000007 METHOD -e:3
c:0003 p:0019 s:0005 b:0005 l:000584 d:000584 TOP -e:6
c:0002 p:---- s:0003 b:0003 l:000002 d:000002 FINISH :inherited
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------

DBG> : “-e:6:in p'" DBG> : "-e:6:in block in '”
DBG> : “-e:3:in foo'" DBG> : "-e:6:in '”
– backtrace of native function call (Use addr2line) –
0x80eaa75
0x8108d83
0x8108e4b
0x80bc770
0xffffe440
0x8058424
0x8058473
0x805ac97
0x805b010
0x805b376
0x807d666
0x80f3d91
0x80eef96
0x80f3cf6
0x80e9935
0x805acf8
0x805b010
0x805b376
0x807d666
0x8069b01
0x806fcdc
0x80e135e
0x80e3093
0x80e5cd6
0x80e9334
0x80e966b
0x805a219
0x805e080
0x8057d70
0xb7de7ea8
0x8057c91

[BUG] Segmentation fault
ruby 1.9.0 (2007-12-10) [i686-linux]

e$B%"%!<%H$7$^$7$?e(B

e$B40c$$$@$C$?$i$9$_$^$;$s$,!"e(Bvm_callee_setup_arg
e$B$K$h$C$F%9%?%C%/$,e(B
(Qnil e$B0J30$Ge(B) e$B?-$S$k$N$Oe(B arg_block
e$B$@$1$@$H;W$$$^$9!#$b$7$=$&$J$ie(B
vm_callee_setup_arg e$B$r8F$V;~$Oe(B sp e$B$re(B argv
e$B$N=C<$N<!$K$"$o$;$F$$-e(B
(e$B$D$^$je(B vm_invoke_block e$B$Ne(B DEC_SP(argc) e$B$r$d$a$ke(B)
e$B!"e(Bmark_stack_len e$B$Oe(B
e$B>o$Ke(B 0 e$B$K$7$F$
$/$N$,NI$$$H;W$$$^$9!#e(B

e$B$H$j$“$($:!”$9$4$/0B0W$J%Q%C%A$G$9!#e(B

Index: insnhelper.ci

— insnhelper.ci (revision 14169)
+++ insnhelper.ci (working copy)
@@ -115,7 +115,7 @@
VALUE * const dst = argv;
int opt_pc = 0;

  • th->mark_stack_len = iseq->arg_size;
  • th->mark_stack_len = argc > iseq->arg_size ? argc : iseq->arg_size;

    /* mandatory /
    if (argc < (m + iseq->arg_post_len)) { /
    check with post arg /
    @@ -434,6 +434,7 @@
    /
    TODO: eliminate it */
    GetISeqPtr(iseqval, iseq);
    sp = rsp + iseq->arg_size;

  • cfp->sp = rsp;

    opt_pc = vm_callee_setup_arg(th, iseq, argc, rsp, &blockptr);

e$B1sF#$G$9!#e(B

07/12/11 e$B$Ke(B SASADA Koichi[email protected] e$B$5$s$O=q$-$^$7$?e(B:

e$B!!$5$5$@$G$9!%e(B

Yusuke ENDOH wrote:

r14156 e$B$r8+$^$7$?$,!“e(Bcfp->sp e$B$r=q$-49$($J$$$N$OM}M3$,$”$k$N$G$7$g$&$+!#e(B

e$B!!%9%?%C%/%H%C%W$N@h$K!$e(BVALUE e$B0J30$NCM$,F~$C$F$$$J$$$3$H$rJ]>Z$G$-$Je(B
e$B$$$?$a$G$9!%e(B

e$B$&!<$s!“$A$g$C$H0UL#$,$o$+$j$^$;$s$G$7$?!#$9$_$^$;$s!#e(B
e$B$d$C$Q$j5$$K$J$k$N$G!”;d$N9M$($F$$$k$3$H$r$b$&>/$7@bL@$7$^$9!#e(B
e$B;d$N4*0c$$$@$C$?$iL5;k$7$F$b$i$C$F$b9=$$$^$;$s!#e(B

e$BNc$N>l=j$Ge(B gc e$B$,5/$-$k$H$-$N%9%?%C%/$N>u67$r?^<($7$F$_$^$9!#e(B

e$B$^$:!"e(Bvm_invoke_block e$B$be(B vm_setup_method e$B$be(B
vm_callee_setup_arg e$B$re(B
e$B8F$VA0$Oe(Bargv e$B$,%9%?%C%/%H%C%W$KCV$+$l$F$$$k$H;W$$$^$9!#e(B

           sp
            v

-±-±-±-±-±-+
… | argv… | ? ? ? ?
-±-±-±-±-±-+

e$B$5$5$@$5$s$,!V%9%?%C%/%H%C%W$N@h$K!$e(BVALUE

e$B0J30$NCM$,F~$C$F$$$J$$e(B

e$B$3$H$rJ]>Z$G$-$J$$!W$H$*$C$7$c$C$F$$$k$N$O!"e(B?

e$B$NItJ,$K2?$,F~$C$Fe(B

e$B$$$k$+$o$+$i$J$$$H$$$&$3$H$G$7$g$&$+!#$=$l$OF10U$7$^$9!#e(B

vm_invoke_block e$B$Oe(B DEC_SP(argc) e$B$7$F$+$ie(B vm_yield_setup_args
e$B$r8F$Se(B
e$B$=$NCf$Ge(B vm_callee_setup_arg e$B$r8F$V$N$G!"Nc$N>l=j$Ge(B gc
e$B$,5/$-$?>l9g$Oe(B

sp sp+mark_stack_len
v v
-±-±-±-±-±-+
… | argv… | ? ? ? ?
-±-±-±-±-±-+

e$B$H$$$&>u67$K$J$j$^$9e(B (e$B4JC1$N$?$a!"e(Biseq->arg_size e$B$He(B
argc e$B$,Ey$7$$$He(B
e$B$7$F$$$^$9e(B) e$B!#e(B
e$B0lJ}e(B vm_setup_method e$B$O!"e(Bsp e$B$r$:$i$5$:e(B
vm_callee_setup_arg e$B$r8F$V$N$Ge(B

           sp         sp+mark_stack_len
            v           v

-±-±-±-±-±-+
… | argv… | ? ? ? ?
-±-±-±-±-±-+

e$B$H$$$&>u67$Ge(B gc
e$B$,=hM}$5$l$^$9!#EDCf$5$s$,$3$NLdBj$r;XE&$7$?;~E@$G$Oe(B
? e$B$N$H$3$m$^$Ge(B mark_maybe e$B$G$J$/e(B mark e$B$7$F$$$?$?$ae(B
segv e$B$7$F$$$^$7$?!#e(B

vm_invoke_block e$B$He(B vm_setup_method e$B$G$3$s$JIw$Ke(B sp
e$B$N07$$$,0[$J$k$N$Oe(B
e$B0U?^E*$J$s$G$7$g$&$+!#e(B

e$B;d$Oe(B sp e$B$N07$$$r6&DL$K$9$Y$-$H9M$(!"e(Bvm_setup_method
e$B$G$be(B sp e$B$r$:$i$9e(B
(cfp->sp -= argc;) e$B%Q%C%A$r=q$-$^$7$?!#e(B

e$B!!$5$5$@$G$9!%e(B

Yusuke ENDOH wrote:

r14156 e$B$r8+$^$7$?$,!“e(Bcfp->sp e$B$r=q$-49$($J$$$N$OM}M3$,$”$k$N$G$7$g$&$+!#e(B

e$B!!%9%?%C%/%H%C%W$N@h$K!$e(BVALUE
e$B0J30$NCM$,F~$C$F$$$J$$$3$H$rJ]>Z$G$-$Je(B
e$B$$$?$a$G$9!%e(B

e$B$"$He(B sp e$B$NBeF~$r0\F0$7$?0U?^$,$o$+$j$^$;$s!#e(B

e$B!!<qL#$G$9!%e(B

e$B$^$?!“8e$G5$$E$-$^$7$?$,e(B mark_stack_len = iseq->arg_size; e$B$OIT==J,$@$He(B
e$B;W$$$^$9!#e(Bsp e$B$,e(B argv e$B$N@hF,$N$H$-!”$=$3$+$ie(B iseq->arg_size e$BJ,$7$+e(B mark
e$B$5$l$^$;$s!#$=$N$?$ae(B argv e$B$ND9$5$,e(B iseq->arg_size e$B$h$jD9$+$C$?>l9g!"e(B
e$BNc$N>l=j$Ge(B gc e$B$,5/$-$?$ie(B argv e$B$NCf$NMWAG$,e(B gc e$B$5$l$F$7$^$&$H;W$$$^$9!#e(B

e$BZNc$G$9!#e(Brb_gc() e$B$rNc$N>l=j$XA^F~$7$F$*$/$H0J2<$GMn$A$^$9!#K\Ev$Ke(B
e$B$3$N$;$$$GMn$A$F$$$k$N$+$I$&$+$OL$3NG’$G$9$,!#e(B

e$B!!3N$+$K!%C1=c$Ke(B argc
e$B$rB-$9$@$1$G$O%@%a$+$J$!!%87L)$K$O%@%a$G$9$he(B
e$B$M$’!%J,4tA}$d$7$?$/$J$$$J$"!%e(B

e$B40c$$$@$C$?$i$9$_$^$;$s$,!"e(Bvm_callee_setup_arg e$B$K$h$C$F%9%?%C%/$,e(B
(Qnil e$B0J30$Ge(B) e$B?-$S$k$N$Oe(B arg_block e$B$@$1$@$H;W$$$^$9!#$b$7$=$&$J$ie(B
vm_callee_setup_arg e$B$r8F$V;~$Oe(B sp e$B$re(B argv e$B$N=C<$N<!$K$"$o$;$F$$-e(B
(e$B$D$^$je(B vm_invoke_block e$B$Ne(B DEC_SP(argc) e$B$r$d$a$ke(B) e$B!"e(Bmark_stack_len e$B$Oe(B
e$B>o$Ke(B 0 e$B$K$7$F$
$/$N$,NI$$$H;W$$$^$9!#e(B

e$B!!>e=R$7$?LdBj$K$h$j!$B?J,%@%a$G$9!%e(B

e$B!!$5$5$@$9!%e(B

e$B!!JV;v$,CY$l$F$9$_$^$;$s!%e(B

Yusuke ENDOH wrote:

e$B$3$H$rJ]>Z$G$-$J$$!W$H$*$C$7$c$C$F$$$k$N$O!"e(B? e$B$NItJ,$K2?$,F~$C$Fe(B

e$B$$$k$+$o$+$i$J$$$H$$$&$3$H$G$7$g$&$+!#$=$l$OF10U$7$^$9!#e(B

e$B!!$O$$!%e(B

vm_invoke_block e$B$He(B vm_setup_method e$B$G$3$s$JIw$Ke(B sp e$B$N07$$$,0[$J$k$N$Oe(B
e$B0U?^E*$J$s$G$7$g$&$+!#e(B

e$B!!0U?^E*$G$O$"$j$^$;$s!%$$$D$N4V$K$+$3$s$J$3$H$K$J$C$F$$$?!$$H$$$&46e(B
e$B$8$G$9!%Nr;KE*7P0^$H$7$F$O!$$3$3$N=hM}$r$/$C$D$1$?$N$,:G6a!$$H$$$&$Ne(B
e$B$,$"$j$^$9!%e(B

e$B;d$Oe(B sp e$B$N07$$$r6&DL$K$9$Y$-$H9M$(!"e(Bvm_setup_method e$B$G$be(B sp e$B$r$:$i$9e(B
(cfp->sp -= argc;) e$B%Q%C%A$r=q$-$^$7$?!#e(B

e$B!!$I$A$i$+$H$$$&$H!$e(Bsp e$B$,e(B argv
e$B$N>l=j$K$"$k$[$&$,?’!9$J0UL#$G4r$7$$e(B
e$B$J$!!$$H;W$C$F$$$^$7$?!%e(B

(1) sp e$B$N7W;;$,0l2s8:$ke(B
(2) gc_mark_maybe e$B$N2s?t$,8:$ke(B

e$B!!$$$d!$$I$A$i$b1F6AL5$$$KEy$7$$$s$G$9$,e(B…e$B!%$&!<$s!$$I$&$7$h$&$+$J!%e(B