Ruby Forum Ruby-dev > fork $BIT2DG=$J4D6-$G$N(B test_argv0_noarg

Posted by wanabe (Guest)
on 11.05.2008 08:14
(Received via mailing list)
$B%o%J%Y$H?=$7$^$9!#(B

fork() $B$N$J$$4D6-$G$O(B exec $B7OE}$N%a%=%C%I$O(B redirect_fds 
$B$rL5;k$9$k$?$a(B
test_process.rb $B$N(B test_argv0_noarg 
$B$G%F%9%H$,?J$^$J$/$J$j$^$9!#(B
$B$3$N$h$&$J4D6-$G$O%F%9%H$r%9%-%C%W$7$?J}$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#(B

# $B$b$A$m$s!"%j%@%$%l%/%H$G$-$k$J$i$=$l$,0lHV$$$$$N$G$9$,!#(B

Index: test/ruby/test_process.rb
===================================================================
--- test/ruby/test_process.rb  (revision 16344)
+++ test/ruby/test_process.rb  (working copy)
@@ -800,6 +800,7 @@
   end

   def test_argv0_noarg
+    return unless respond?(:fork)
     with_tmpchdir {|d|
       open("t", "w") {|f| f.print "exit true" }
       open("f", "w") {|f| f.print "exit false" }
Posted by Yukihiro Matsumoto (Guest)
on 13.05.2008 03:00
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:34647] fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on Sun, 11 May 2008 15:13:11 +0900, wanabe <s.wanabe@gmail.com> 
writes:

|fork() $B$N$J$$4D6-$G$O(B exec $B7OE}$N%a%=%C%I$O(B redirect_fds $B$rL5;k$9$k$?$a(B
|test_process.rb $B$N(B test_argv0_noarg $B$G%F%9%H$,?J$^$J$/$J$j$^$9!#(B
|$B$3$N$h$&$J4D6-$G$O%F%9%H$r%9%-%C%W$7$?J}$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#(B
|
|# $B$b$A$m$s!"%j%@%$%l%/%H$G$-$k$J$i$=$l$,0lHV$$$$$N$G$9$,!#(B

$B$^$"!"$=$&$J$s$G$9$,!#$=$N%A%'%C%/$O(Brespond?(:fork)$B$G$O$h$/(B
$B$J$$$s$G$O$J$$$G$7$g$&$+!#(Bfork$B$O$$$D$bDj5A$5$l$F$$$k$h$&$K;W(B
$B$$$^$9!#(B
Posted by U.Nakamura (Guest)
on 14.05.2008 05:37
(Received via mailing list)
$B$3$s$K$A$O!"$J$+$`$i(B($B$&(B)$B$G$9!#(B

In message "[ruby-dev:34667] Re: fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on May.13,2008 09:58:07, <matz@ruby-lang.org> wrote:
> |fork() $B$N$J$$4D6-$G$O(B exec $B7OE}$N%a%=%C%I$O(B redirect_fds $B$rL5;k$9$k$?$a(B
> |test_process.rb $B$N(B test_argv0_noarg $B$G%F%9%H$,?J$^$J$/$J$j$^$9!#(B
> |$B$3$N$h$&$J4D6-$G$O%F%9%H$r%9%-%C%W$7$?J}$,$h$$$N$G$O$J$$$+$H;W$$$^$9!#(B
> |
> |# $B$b$A$m$s!"%j%@%$%l%/%H$G$-$k$J$i$=$l$,0lHV$$$$$N$G$9$,!#(B
> 
> $B$^$"!"$=$&$J$s$G$9$,!#$=$N%A%'%C%/$O(Brespond?(:fork)$B$G$O$h$/(B
> $B$J$$$s$G$O$J$$$G$7$g$&$+!#(Bfork$B$O$$$D$bDj5A$5$l$F$$$k$h$&$K;W(B
> $B$$$^$9!#(B

$B%F%9%H$b85!9$NLdBj$b4{$K2r7h:Q$_(B($B$?$V$s(B)$B$J$N$G$=$l$O$$$$$s$G(B
$B$9$,!"(Bfork$B$,(Brespond_to?$B$GH=CG$G$-$J$$$N$OITJX$J$N$G!"(B1.9$B$G$O(B
fork$B$,(BNotImplementedError$B$K$J$k%W%i%C%H%U%)!<%`$G$O(Bfork$B<+BN$r(B
$B>C$=$&$+$H;W$&$s$G$9$,!"$I$&$G$7$g$&$+(B?
($BB>$NN`;w$N%a%=%C%I$bF1MM(B)


$B$=$l$G$O!#(B
Posted by Yukihiro Matsumoto (Guest)
on 14.05.2008 11:34
(Received via mailing list)
$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message "Re: [ruby-dev:34684] Re: fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on Wed, 14 May 2008 12:37:01 +0900, "U.Nakamura" 
<usa@garbagecollect.jp> writes:

|$B%F%9%H$b85!9$NLdBj$b4{$K2r7h:Q$_(B($B$?$V$s(B)$B$J$N$G$=$l$O$$$$$s$G(B
|$B$9$,!"(Bfork$B$,(Brespond_to?$B$GH=CG$G$-$J$$$N$OITJX$J$N$G!"(B1.9$B$G$O(B
|fork$B$,(BNotImplementedError$B$K$J$k%W%i%C%H%U%)!<%`$G$O(Bfork$B<+BN$r(B
|$B>C$=$&$+$H;W$&$s$G$9$,!"$I$&$G$7$g$&$+(B?
|($BB>$NN`;w$N%a%=%C%I$bF1MM(B)

NotImplementedError$B$O$J$/$7$F!"%a%=%C%I$r:o$m$&$H$$$&J}?K$G$9(B
$B$+!)(B 
$B$^$"!"(Brespond_to?$B$GH=CG$G$-$k$N$OL@$i$+$J%a%j%C%H$J$N$G!"(B
$B$`$2$KH?BP$O$7$^$;$s$,!#I8=`$N%a%=%C%I$,%W%i%C%H%U%)!<%`$4$H(B
$B$K$"$C$?$j$J$+$C$?$j$9$k$N$K$b<c43Dq93$,$"$k$N$G$9$,!#$^$"!"(B
$B$b$H$b$HDs6!$7$F$$$J$$(B($B$G$-$J$$(B)$B%W%i%C%H%U%)!<%`$,$"$k5!G=$,(B
$BI8=`$K$"$k$H$$$&;~E@$G$7$g$&$,$J$$$s$G$7$g$&$,!#(B
Posted by Tanaka Akira (Guest)
on 14.05.2008 11:41
(Received via mailing list)
In article <E1JwDMS-0005A1-FF@x61.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> writes:

> NotImplementedError$B$O$J$/$7$F!"%a%=%C%I$r:o$m$&$H$$$&J}?K$G$9(B
> $B$+!)(B $B$^$"!"(Brespond_to?$B$GH=CG$G$-$k$N$OL@$i$+$J%a%j%C%H$J$N$G!"(B
> $B$`$2$KH?BP$O$7$^$;$s$,!#I8=`$N%a%=%C%I$,%W%i%C%H%U%)!<%`$4$H(B
> $B$K$"$C$?$j$J$+$C$?$j$9$k$N$K$b<c43Dq93$,$"$k$N$G$9$,!#$^$"!"(B
> $B$b$H$b$HDs6!$7$F$$$J$$(B($B$G$-$J$$(B)$B%W%i%C%H%U%)!<%`$,$"$k5!G=$,(B
> $BI8=`$K$"$k$H$$$&;~E@$G$7$g$&$,$J$$$s$G$7$g$&$,!#(B

$B<B9T$9$k$H(B NotImplementedError $B$K$J$j!"(Brespond_to? 
$B$GD4$Y$k(B
$B$H56$K$J$kFC<l$J%a%=%C%I$rF3F~$9$k$N$O$I$&$G$9$+$M!#(B

undef $B$_$?$$$J$+$s$8$G!#(B
Posted by U.Nakamura (Guest)
on 14.05.2008 11:50
(Received via mailing list)
$B$3$s$K$A$O!"$J$+$`$i(B($B$&(B)$B$G$9!#(B

In message "[ruby-dev:34694] Re: fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on May.14,2008 18:33:22, <matz@ruby-lang.org> wrote:
> |$B%F%9%H$b85!9$NLdBj$b4{$K2r7h:Q$_(B($B$?$V$s(B)$B$J$N$G$=$l$O$$$$$s$G(B
> |$B$9$,!"(Bfork$B$,(Brespond_to?$B$GH=CG$G$-$J$$$N$OITJX$J$N$G!"(B1.9$B$G$O(B
> |fork$B$,(BNotImplementedError$B$K$J$k%W%i%C%H%U%)!<%`$G$O(Bfork$B<+BN$r(B
> |$B>C$=$&$+$H;W$&$s$G$9$,!"$I$&$G$7$g$&$+(B?
> |($BB>$NN`;w$N%a%=%C%I$bF1MM(B)
> 
> NotImplementedError$B$O$J$/$7$F!"%a%=%C%I$r:o$m$&$H$$$&J}?K$G$9(B
> $B$+!)(B 

$BJ}?K$H$7$F$O!"(Bruby$B$N%3%s%Q%$%k;~$KH=CG$G$-$k$b$N$K$D$$$F$O%a(B
$B%=%C%I<+BN$r:o=|!"<B9T;~$K$7$+H=CG$G$-$J$$$b$N$O=>Mh$I$*$j$K(B
NotImplementedError$B$H$$$&0BD>$JJ}8~$r9M$($F$$$^$9!#(B


>      $B$^$"!"(Brespond_to?$B$GH=CG$G$-$k$N$OL@$i$+$J%a%j%C%H$J$N$G!"(B
> $B$`$2$KH?BP$O$7$^$;$s$,!#I8=`$N%a%=%C%I$,%W%i%C%H%U%)!<%`$4$H(B
> $B$K$"$C$?$j$J$+$C$?$j$9$k$N$K$b<c43Dq93$,$"$k$N$G$9$,!#$^$"!"(B
> $B$b$H$b$HDs6!$7$F$$$J$$(B($B$G$-$J$$(B)$B%W%i%C%H%U%)!<%`$,$"$k5!G=$,(B
> $BI8=`$K$"$k$H$$$&;~E@$G$7$g$&$,$J$$$s$G$7$g$&$,!#(B

$B%a%=%C%I$@$1$"$C$F$b@dBP<B9TIT2DG=$J$i0UL#$O$J$$$o$1$G!"$=$l(B
$B$J$i(Brespond_to?$B$GH=CG$G$-$k%a%j%C%H$NJ}$,>e$@$H;W$$$^$9!#(B
$BFC$K!"2?$i$+$N;v>p$G!"<B:]$K$=$N%a%=%C%I$r;HMQ$9$kA0$K!"K\Ev(B
$B$K;H$($k$+$I$&$+$rH=CG$7$?$$>l9g!"(Bfork$B$J$s$+$O;n$7$K<B9T$7$F(B
$B$*$$$F$_$k$N$O?4M}E*Dq93$,Bg$-$$$H;W$$$^$9!#(B
$B$=$N7k2L$H$7$F(BRUBY_PLATFORM$B$J$I$GH=CG$7$A$c$&$H$$$&7y$J%3!<%I(B
$B$,$O$S$3$C$F$$$^$9$7!"$=$NJU$r$J$s$H$+$7$?$$$H$$$&;W$$$,$"$j(B
$B$^$9!#(B


$B$=$l$G$O!#(B
Posted by Kouhei Sutou (Guest)
on 14.05.2008 11:55
(Received via mailing list)
$B?\F#$G$9!#(B

2008/05/14 18:49 U.Nakamura <usa@garbagecollect.jp>:

> $B%a%=%C%I$@$1$"$C$F$b@dBP<B9TIT2DG=$J$i0UL#$O$J$$$o$1$G!"$=$l(B
> $B$J$i(Brespond_to?$B$GH=CG$G$-$k%a%j%C%H$NJ}$,>e$@$H;W$$$^$9!#(B
> $BFC$K!"2?$i$+$N;v>p$G!"<B:]$K$=$N%a%=%C%I$r;HMQ$9$kA0$K!"K\Ev(B
> $B$K;H$($k$+$I$&$+$rH=CG$7$?$$>l9g!"(Bfork$B$J$s$+$O;n$7$K<B9T$7$F(B
> $B$*$$$F$_$k$N$O?4M}E*Dq93$,Bg$-$$$H;W$$$^$9!#(B
> $B$=$N7k2L$H$7$F(BRUBY_PLATFORM$B$J$I$GH=CG$7$A$c$&$H$$$&7y$J%3!<%I(B
> $B$,$O$S$3$C$F$$$^$9$7!"$=$NJU$r$J$s$H$+$7$?$$$H$$$&;W$$$,$"$j(B
> $B$^$9!#(B

respond_to?$B$GH=CG$9$k$h$j$b!"(Bforkable?$B$_$?$$$J%a%=%C%I$,$"$C$?J}$,(B
$B8+1I$($,NI$/$F;d$O9%$-$G$9!#(B
Posted by U.Nakamura (Guest)
on 14.05.2008 12:17
(Received via mailing list)
$B$3$s$K$A$O!"$J$+$`$i(B($B$&(B)$B$G$9!#(B

In message "[ruby-dev:34698] Re: fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on May.14,2008 18:54:24, <kou@cozmixng.org> wrote:
> $B8+1I$($,NI$/$F;d$O9%$-$G$9!#(B
fork$B0J30$O$3$&$G$9$+(B?

Dir.tellable?
Dir.seekable?
Dir.chrootable?
File.lchmodable?
File.lchownable?
File.linkable?
File.symlinkable?
File.readlinkable?
File.truncatable?
IO.fsyncable?
IO.close_on_execable?
IO.ioctlable?
IO.fcntlable?
syscallable?
IO.pipable?
forkable?
Process.getpgrpable?
Process.setpgrpable?
Process.getpgidable?
Process.setpgidable?
Process.setsidable?
Process.getprioritiable?
Process.setprioritiable?
Process.getrlimitable?
Process.setrlimitable?
Process.setuidable?
Process.setruidable?
Process.seteuidable?
Process.setreuidable?
Process.setresuidable?
Process::UID.change_privilegable?
Process::Sys.setgidable?
Process::Sys.setrgidable?
Process::Sys.setegidable?
Process::Sys.setregidable?
Process::Sys.setresgidable?
Process::Sys.issetugidable?
Process.setgidable?
Process.getgroupsable?
Process.setgroupsable?
Process.initgroupsable?
Process.daemonable?
Process::GID.change_privilegable?
Process.setegidable?
Process::UID.re_exchangable?
Process::GID.re_exchangable?
Process.timesable?


$B$b$A$m$s$3$l$O>iCL$G$9$1$I!"$"$j$($M!<$H;W$$$^$9!#(B


$B$=$l$G$O!#(B
Posted by Tanaka Akira (Guest)
on 14.05.2008 18:09
(Received via mailing list)
In article <87ve1hmde3.fsf@fsij.org>,
  Tanaka Akira <akr@fsij.org> writes:

> $B<B9T$9$k$H(B NotImplementedError $B$K$J$j!"(Brespond_to? $B$GD4$Y$k(B
> $B$H56$K$J$kFC<l$J%a%=%C%I$rF3F~$9$k$N$O$I$&$G$9$+$M!#(B
>
> undef $B$_$?$$$J$+$s$8$G!#(B

$B<BAu$9$k$H$3$s$J46$8$G$7$g$&$+!#(B

$B8D!9$N%a%=%C%I$K$D$$$F$O$H$j$"$($:(B fork $B$H(B File.lchmod 
$B$@$1(B
$BBP=h$7$F$"$j$^$9!#(B

GNU/Linux $B$K$O(B lchmod $B$,$J$$$N$G!"(BFile.respond_to?(:lchmod)
$B$O(B false $B$K$J$j!"(BFile.lchmod $B$r8F$S=P$9$H(B
NotImplementedError $B$K$J$j$^$9!#(B

% ./ruby -ve '
p File.respond_to?(:lchmod)
File.lchmod("foo", 0777)'
ruby 1.9.0 (2008-05-14 revision 16419) [i686-linux]
false
-e:3:in `lchmod': lchmod() function is unimplemented on this machine 
(NotImplementedError)
        from -e:3:in `<main>'

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h  (revision 16419)
+++ include/ruby/intern.h  (working copy)
@@ -252,6 +252,7 @@ int rb_method_boundp(VALUE, ID, int);
 VALUE rb_eval_cmd(VALUE, VALUE, int);
 int rb_obj_respond_to(VALUE, ID, int);
 int rb_respond_to(VALUE, ID);
+void rb_define_notimplement_method_id(VALUE mod, ID id, int noex);
 void rb_interrupt(void);
 VALUE rb_apply(VALUE, ID, VALUE);
 void rb_backtrace(void);
Index: include/ruby/node.h
===================================================================
--- include/ruby/node.h  (revision 16419)
+++ include/ruby/node.h  (working copy)
@@ -498,6 +498,8 @@ NODE *rb_node_newnode(enum node_type,VAL
 NODE* rb_method_node(VALUE klass, ID id);
 int rb_node_arity(NODE* node);

+int rb_notimplement_body_p(NODE*);
+
 struct global_entry *rb_global_entry(ID);
 VALUE rb_gvar_get(struct global_entry *);
 VALUE rb_gvar_set(struct global_entry *, VALUE);
Index: proc.c
===================================================================
--- proc.c  (revision 16419)
+++ proc.c  (working copy)
@@ -935,6 +935,15 @@ method_owner(VALUE obj)
     return data->oclass;
 }

+static VALUE
+method_notimplemented_p(VALUE obj)
+{
+    struct METHOD *data;
+
+    Data_Get_Struct(obj, struct METHOD, data);
+    return rb_notimplement_body_p(data->body) ? Qtrue : Qfalse;
+}
+
 /*
  *  call-seq:
  *     obj.method(sym)    => method
@@ -1763,6 +1772,7 @@ Init_Proc(void)
     rb_define_method(rb_cMethod, "name", method_name, 0);
     rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
+    rb_define_method(rb_cMethod, "notimplemented?", 
method_notimplemented_p, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
     rb_define_method(rb_mKernel, "public_method", rb_obj_public_method, 
1);

@@ -1780,6 +1790,7 @@ Init_Proc(void)
     rb_define_method(rb_cUnboundMethod, "name", method_name, 0);
     rb_define_method(rb_cUnboundMethod, "owner", method_owner, 0);
     rb_define_method(rb_cUnboundMethod, "bind", umethod_bind, 1);
+    rb_define_method(rb_cUnboundMethod, "notimplemented?", 
method_notimplemented_p, 0);

     /* Module#*_method */
     rb_define_method(rb_cModule, "instance_method", 
rb_mod_instance_method, 1);
Index: class.c
===================================================================
--- class.c  (revision 16419)
+++ class.c  (working copy)
@@ -759,25 +759,40 @@ rb_obj_singleton_methods(int argc, VALUE
 void
 rb_define_method_id(VALUE klass, ID name, VALUE (*func)(ANYARGS), int 
argc)
 {
-    rb_add_method(klass, name, NEW_CFUNC(func,argc), NOEX_PUBLIC);
+    if (func)
+        rb_add_method(klass, name, NEW_CFUNC(func,argc), NOEX_PUBLIC);
+    else
+        rb_define_notimplement_method_id(klass, name, NOEX_PUBLIC);
 }

 void
 rb_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), 
int argc)
 {
-    rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), 
NOEX_PUBLIC);
+    ID id = rb_intern(name);
+    if (func)
+        rb_add_method(klass, id, NEW_CFUNC(func, argc), NOEX_PUBLIC);
+    else
+        rb_define_notimplement_method_id(klass, id, NOEX_PUBLIC);
 }

 void
 rb_define_protected_method(VALUE klass, const char *name, VALUE 
(*func)(ANYARGS), int argc)
 {
-    rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), 
NOEX_PROTECTED);
+    ID id = rb_intern(name);
+    if (func)
+        rb_add_method(klass, id, NEW_CFUNC(func, argc), 
NOEX_PROTECTED);
+    else
+        rb_define_notimplement_method_id(klass, id, NOEX_PROTECTED);
 }

 void
 rb_define_private_method(VALUE klass, const char *name, VALUE 
(*func)(ANYARGS), int argc)
 {
-    rb_add_method(klass, rb_intern(name), NEW_CFUNC(func, argc), 
NOEX_PRIVATE);
+    ID id = rb_intern(name);
+    if (func)
+        rb_add_method(klass, id, NEW_CFUNC(func, argc), NOEX_PRIVATE);
+    else
+        rb_define_notimplement_method_id(klass, id, NOEX_PRIVATE);
 }

 void
Index: process.c
===================================================================
--- process.c  (revision 16419)
+++ process.c  (working copy)
@@ -2394,10 +2394,10 @@ rb_fork(int *status, int (*chfunc)(void*
  *  fork doesn't copy other threads.
  */

+#if defined(HAVE_FORK) && !defined(__NetBSD__)
 static VALUE
 rb_f_fork(VALUE obj)
 {
-#if defined(HAVE_FORK) && !defined(__NetBSD__)
     rb_pid_t pid;

     rb_secure(2);
@@ -2423,11 +2423,10 @@ rb_f_fork(VALUE obj)
       default:
   return PIDT2NUM(pid);
     }
+}
 #else
-    rb_notimplement();
+#define rb_f_fork 0
 #endif
-}
-

 /*
  *  call-seq:
Index: eval_method.c
===================================================================
--- eval_method.c  (revision 16419)
+++ eval_method.c  (working copy)
@@ -18,6 +18,8 @@ struct cache_entry {    /* method hash tab
 static struct cache_entry cache[CACHE_SIZE];
 static int ruby_running = 0;

+static NODE *notimplement_body = 0;
+
 void
 rb_clear_cache(void)
 {
@@ -403,6 +405,12 @@ rb_export_method(VALUE klass, ID name, I
 }

 int
+rb_notimplement_body_p(NODE *method)
+{
+    return method == notimplement_body ? Qtrue : Qfalse;
+}
+
+int
 rb_method_boundp(VALUE klass, ID id, int ex)
 {
     NODE *method;
@@ -411,6 +419,8 @@ rb_method_boundp(VALUE klass, ID id, int
   if (ex && (method->nd_noex & NOEX_PRIVATE)) {
       return Qfalse;
   }
+        if (rb_notimplement_body_p(method->nd_body))
+      return Qfalse;
   return Qtrue;
     }
     return Qfalse;
@@ -645,10 +655,49 @@ rb_mod_alias_method(VALUE mod, VALUE new
     return mod;
 }

+static VALUE
+notimplement_cfunc(VALUE obj)
+{
+    rb_notimplement();
+}
+
+void
+rb_define_notimplement_method_id(VALUE mod, ID id, int noex)
+{
+    rb_add_method(mod, id, notimplement_body, noex);
+}
+
+static VALUE
+rb_mod_notimplemented_method(int argc, VALUE *argv, VALUE mod)
+{
+    int i;
+    if (ruby_cbase() == rb_cObject && mod == rb_cObject) {
+        rb_secure(4);
+    }
+
+    for (i = 0; i < argc; i++) {
+        ID id = rb_to_id(argv[i]);
+
+        if (rb_safe_level() >= 4 && !OBJ_TAINTED(mod)) {
+            rb_raise(rb_eSecurityError, "Insecure: can't undef `%s'",
+                     rb_id2name(id));
+        }
+        rb_frozen_class_p(mod);
+        if (id == object_id || id == __send__ || id == init) {
+            rb_warn("notimplementing `%s' may cause serious problem", 
rb_id2name(id));
+        }
+  rb_define_notimplement_method_id(mod, id, NOEX_PUBLIC);
+    }
+    return mod;
+}
+
 static void
 Init_eval_method(void)
 {
     rb_define_private_method(rb_cModule, "remove_method", 
rb_mod_remove_method, -1);
     rb_define_private_method(rb_cModule, "undef_method", 
rb_mod_undef_method, -1);
     rb_define_private_method(rb_cModule, "alias_method", 
rb_mod_alias_method, 2);
+    rb_global_variable(&notimplement_body);
+    notimplement_body = NEW_CFUNC(notimplement_cfunc, -1);
+    rb_define_private_method(rb_cModule, "notimplemented_method", 
rb_mod_notimplemented_method, -1);
 }
Index: file.c
===================================================================
--- file.c  (revision 16419)
+++ file.c  (working copy)
@@ -1901,12 +1901,7 @@ rb_file_s_lchmod(int argc, VALUE *argv)
     return LONG2FIX(n);
 }
 #else
-static VALUE
-rb_file_s_lchmod(int argc, VALUE *argv)
-{
-    rb_notimplement();
-    return Qnil;    /* not reached */
-}
+#define rb_file_s_lchmod 0
 #endif

 struct chown_args {
Index: test/ruby/test_notimp.rb
===================================================================
--- test/ruby/test_notimp.rb  (revision 0)
+++ test/ruby/test_notimp.rb  (revision 0)
@@ -0,0 +1,33 @@
+require 'test/unit'
+
+class TestNotImplement < Test::Unit::TestCase
+  class C
+    notimplemented_method :n
+    def x() end
+  end
+
+  def test_respond_to
+    assert_equal(false, C.new.respond_to?(:n))
+    assert_equal(true, C.new.respond_to?(:x))
+  end
+
+  def test_call
+    assert_raise(NotImplementedError) { C.new.n }
+    assert_nothing_raised { C.new.x }
+  end
+
+  def test_method
+    m = C.new.method(:n)
+    assert(m.notimplemented?)
+    m = C.new.method(:x)
+    assert(!m.notimplemented?)
+  end
+
+  def test_umethod
+    m = C.instance_method(:n)
+    assert(m.notimplemented?)
+    m = C.instance_method(:x)
+    assert(!m.notimplemented?)
+  end
+
+end
Posted by Kouhei Sutou (Guest)
on 15.05.2008 13:51
(Received via mailing list)
$B?\F#$G$9!#(B

In <20080514190150.7956.C613B076@garbagecollect.jp>
  "[ruby-dev:34700] Re: fork $BIT2DG=$J4D6-$G$N(B test_argv0_noarg" on 
Wed, 14 May 2008 19:16:27 +0900,
  "U.Nakamura" <usa@garbagecollect.jp> wrote:

> > respond_to?$B$GH=CG$9$k$h$j$b!"(Bforkable?$B$_$?$$$J%a%=%C%I$,$"$C$?J}$,(B
> > $B8+1I$($,NI$/$F;d$O9%$-$G$9!#(B
> 
> fork$B0J30$O$3$&$G$9$+(B?

...

> $B$b$A$m$s$3$l$O>iCL$G$9$1$I!"$"$j$($M!<$H;W$$$^$9!#(B

$B$I$&$7$F$"$j$($M!<$H;W$&$N$+$o$+$i$J$$$N$G$9$,!";d$O$J$s$G>i(B
$BCL$J$s$@$m$&$H;W$$$^$7$?$7!"$"$j$($M!<$H$b;W$$$^$;$s$G$7$?!#(B

$B?t$,B?$9$.$k$H$$$&$3$H$G$9$+!)$J$s$G$b(Bable$B$D$1$l$P$$$$$C$F$b(B
$B$s$8$c$J$$$h$M!"$H$$$&$3$H$G$9$+!)(B


$BA0$N%a!<%k$K$O=q$$$F$$$J$+$C$?$N$G=q$$$F$*$/$H!";d$O$J$+$`$i(B
$B$5$s$N0F$K$O;?@.$7$F$$$^$9!#$=$N>e$G$5$i$K(Bfork$B$G$-$k$+$I$&$+(B
$B$rH=CG$G$-$k%a%=%C%I$,$"$l$P4r$7$$$H;W$C$F$$$^$9!#(B

respond_to?$B$@$H4V0c$C$F0z?t$K(B:folk$B$H$+=q$$$F$b$J$+$J$+5$$E$+(B
$B$J$$$N$G$9$,!"(Bfolkable?$B$_$?$$$K=q$$$F$7$^$&$HNc30$,$"$,$k$N(B
$B$G5$$E$-$d$9$$!"$H$$$&$N$b@lMQ%a%=%C%I$,$"$k$H4r$7$$M}M3$N(B1
$B$D$G$9!#!JFC$K;d$O(Btypo$B$,B?$$$N$G!K(B


$B$H$O$$$(!";d$N9%$_$O<u$1F~$l$i$lFq$$$b$N$,B?$$$h$&$J$N$G!"$"(B
$B$^$j5$$K$7$J$/$F7k9=$G$9!#(Brespond_to?$B$G$b$=$&$$$&H=CG$G$-$kJ}(B
$BK!$,$"$l$P<+J,$G@lMQ%a%=%C%I$r:n$C$F;H$($P$9$_$^$9$N$G!#(B
Posted by U.Nakamura (Guest)
on 15.05.2008 14:18
(Received via mailing list)
$B$3$s$K$A$O!"$J$+$`$i(B($B$&(B)$B$G$9!#(B

In message "[ruby-dev:34718] Re: fork $BIT2DG=$J4D6-$G$N(B 
test_argv0_noarg"
    on May.15,2008 20:50:40, <kou@cozmixng.org> wrote:
> > $B$b$A$m$s$3$l$O>iCL$G$9$1$I!"$"$j$($M!<$H;W$$$^$9!#(B
> 
> $B$I$&$7$F$"$j$($M!<$H;W$&$N$+$o$+$i$J$$$N$G$9$,!";d$O$J$s$G>i(B
> $BCL$J$s$@$m$&$H;W$$$^$7$?$7!"$"$j$($M!<$H$b;W$$$^$;$s$G$7$?!#(B
> 
> $B?t$,B?$9$.$k$H$$$&$3$H$G$9$+!)$J$s$G$b(Bable$B$D$1$l$P$$$$$C$F$b(B
> $B$s$8$c$J$$$h$M!"$H$$$&$3$H$G$9$+!)(B

$BN>J}$G$9$M!#(B

$B$5$i$K8@$&$H!"@h$K$"$2$?$b$N0J30$N%a%=%C%I$NB8:_$b3NG'$7$?$/(B
$B$J$C$?$i!"$=$l$b(B -able? $B$G3NG'$9$k$s$G$7$g$&$+(B?
systemable? $B$H$+!"(BArray.countable? $B$H$+!#(B
$B$=$&$8$c$J$/$F!"$I$N%a%=%C%I$K$OBP1~$9$k(B -able? $B$,$"$C$F!"$I(B
$B$N%a%=%C%I$K$O(B -able? $B$,$J$$!"$H$$$&$3$H$rA4It3NG'$7$F%3!<%I(B
$B$r=q$/$s$G$7$g$&$+(B?

$B$"$k%a%=%C%I$NB8:_$r3NG'$9$k$?$a$K!"?7$?$K$=$N3NG'MQ$N%a%=%C(B
$B%I$rDI2C$9$k!"$H$$$&H/A[$O!">r7o<0$NCM$r(Btrue$B$HHf3S$9$k$H$+$$(B
$B$&H/A[$HF1$8Fw$$$,$7$F!"@5D><u$1F~$l$i$l$^$;$s!#(B


> respond_to?$B$@$H4V0c$C$F0z?t$K(B:folk$B$H$+=q$$$F$b$J$+$J$+5$$E$+(B
> $B$J$$$N$G$9$,!"(Bfolkable?$B$_$?$$$K=q$$$F$7$^$&$HNc30$,$"$,$k$N(B
> $B$G5$$E$-$d$9$$!"$H$$$&$N$b@lMQ%a%=%C%I$,$"$k$H4r$7$$M}M3$N(B1
> $B$D$G$9!#!JFC$K;d$O(Btypo$B$,B?$$$N$G!K(B

$BNc$($P(B system $B$O$"$k$1$I(B systemable? 
$B$O$J$$!"$H$$$&$3$H$r3NG'(B
$B$9$kI,MW$,$"$k$J$i!"$=$N3NG'$N2aDx$G(Btypo$B$,F~$k2DG=@-$O8:$k$s(B
$B$8$c$J$$$+$H$$$&5$$,$7$^$9!#(B


> $B$H$O$$$(!";d$N9%$_$O<u$1F~$l$i$lFq$$$b$N$,B?$$$h$&$J$N$G!"$"(B
> $B$^$j5$$K$7$J$/$F7k9=$G$9!#(Brespond_to?$B$G$b$=$&$$$&H=CG$G$-$kJ}(B
> $BK!$,$"$l$P<+J,$G@lMQ%a%=%C%I$r:n$C$F;H$($P$9$_$^$9$N$G!#(B

$B$^$"!";d$N8@$C$F$k$N$b;d$N9%$_$NLdBj$J$N$G!"B>$N?M$K$O$^$?B>(B
$B$N0U8+$,$"$k$s$8$c$J$$$G$7$g$&$+!#(B
# forkable?$B$"$?$j$O(BActiveSupport$B$H$+$G:NMQ$5$l$?$j$7$F(B :)


$B$=$l$G$O!#(B
Posted by Kouhei Sutou (Guest)
on 15.05.2008 14:39
(Received via mailing list)
$B?\F#$G$9!#(B

In <20080515210433.2577.C613B076@garbagecollect.jp>
  "[ruby-dev:34719] Re: fork $BIT2DG=$J4D6-$G$N(B test_argv0_noarg" on 
Thu, 15 May 2008 21:17:28 +0900,
  "U.Nakamura" <usa@garbagecollect.jp> wrote:

> $B$5$i$K8@$&$H!"@h$K$"$2$?$b$N0J30$N%a%=%C%I$NB8:_$b3NG'$7$?$/(B
> $B$J$C$?$i!"$=$l$b(B -able? $B$G3NG'$9$k$s$G$7$g$&$+(B?
> systemable? $B$H$+!"(BArray.countable? $B$H$+!#(B

$B%W%i%C%H%U%)!<%`0MB8$N%a%=%C%I$NOC$@$H;W$C$F$$$^$7$?!#(B
$B%P!<%8%g%s4V$G$N8_49@-$N%A%'%C%/$H$+$O9M$($F$$$^$;$s$G$7$?!#(B

> $B$=$&$8$c$J$/$F!"$I$N%a%=%C%I$K$OBP1~$9$k(B -able? $B$,$"$C$F!"$I(B
> $B$N%a%=%C%I$K$O(B -able? $B$,$J$$!"$H$$$&$3$H$rA4It3NG'$7$F%3!<%I(B
> $B$r=q$/$s$G$7$g$&$+(B?

$B$J$s$G$b$+$s$G$b3NG'$9$k$H$O;W$($J$$$s$G$9$,!#!#!#(B
fork$B$H$+$O$+$J$jFC<l$J%a%=%C%I$@$H;W$C$F$$$^$7$?!#(B

> $B$"$k%a%=%C%I$NB8:_$r3NG'$9$k$?$a$K!"?7$?$K$=$N3NG'MQ$N%a%=%C(B
> $B%I$rDI2C$9$k!"$H$$$&H/A[$O!">r7o<0$NCM$r(Btrue$B$HHf3S$9$k$H$+$$(B
> $B$&H/A[$HF1$8Fw$$$,$7$F!"@5D><u$1F~$l$i$l$^$;$s!#(B

$B$=$NF1$8Fw$$$,$9$k463P$O$A$g$C$H$o$+$j$^$;$s$G$7$?!#(B

$BNc$($P!"(B

  if respond_to?(:fork) == true

$B$H(B

  if forkable?

$B$,F1$8$h$&$K5$;}$A0-$$$H$$$&$3$H$G$9$h$M!)(B

$B;d$O$=$&$O46$8$J$$$H$$$&$@$1$J$N$G!"$&!<$s!#!#!#(B


> > respond_to?$B$@$H4V0c$C$F0z?t$K(B:folk$B$H$+=q$$$F$b$J$+$J$+5$$E$+(B
> > $B$J$$$N$G$9$,!"(Bfolkable?$B$_$?$$$K=q$$$F$7$^$&$HNc30$,$"$,$k$N(B
> > $B$G5$$E$-$d$9$$!"$H$$$&$N$b@lMQ%a%=%C%I$,$"$k$H4r$7$$M}M3$N(B1
> > $B$D$G$9!#!JFC$K;d$O(Btypo$B$,B?$$$N$G!K(B
> 
> $BNc$($P(B system $B$O$"$k$1$I(B systemable? $B$O$J$$!"$H$$$&$3$H$r3NG'(B
> $B$9$kI,MW$,$"$k$J$i!"$=$N3NG'$N2aDx$G(Btypo$B$,F~$k2DG=@-$O8:$k$s(B
> $B$8$c$J$$$+$H$$$&5$$,$7$^$9!#(B

$B$3$l$b$A$g$C$H$o$+$i$J$+$C$?$G$9!#(B

$B$^$:!"$I$&$7$FNc$G$O(Bsystem$B$r;H$C$F$$$k$N$+$H$$$&$3$H$,$o$+$j(B
$B$^$;$s$G$7$?!#$*$=$i$/!"$3$3$i$X$s$rA0Ds$H$7$?OC$@$+$i$@$H$O(B
$B;W$&$N$G$9$,!";d$O$=$&$$$&Iw$K$O;W$o$J$$$N$G$A$g$C$H0U?^$,$o(B
$B$+$j$^$;$s$G$7$?!#(B

> $B$=$&$8$c$J$/$F!"$I$N%a%=%C%I$K$OBP1~$9$k(B -able? $B$,$"$C$F!"$I(B
> $B$N%a%=%C%I$K$O(B -able? $B$,$J$$!"$H$$$&$3$H$rA4It3NG'$7$F%3!<%I(B
> $B$r=q$/$s$G$7$g$&$+(B?


$B$"$H!"(Btypo$B$N2DG=@-$NOC$G$O$J$/$F!"(Btypo$B$r$7$F$7$^$C$?$H$-$K8+(B
$B$D$1$d$9$$$+$I$&$+$NOC$r$7$F$$$?$D$b$j$J$N$G!"(Btypo$B$,F~$k2DG=(B
$B@-1>!9$N0U?^$,$o$+$j$^$;$s$G$7$?!#!J(Btypo$B$O$J$/$J$i$J$$$H;W$C(B
$B$F$$$k!K(B
Posted by Tanaka Akira (Guest)
on 15.05.2008 14:41
(Received via mailing list)
In article <20080515210433.2577.C613B076@garbagecollect.jp>,
  "U.Nakamura" <usa@garbagecollect.jp> writes:

> $BNc$($P(B system $B$O$"$k$1$I(B systemable? $B$O$J$$!"$H$$$&$3$H$r3NG'(B
> $B$9$kI,MW$,$"$k$J$i!"$=$N3NG'$N2aDx$G(Btypo$B$,F~$k2DG=@-$O8:$k$s(B
> $B$8$c$J$$$+$H$$$&5$$,$7$^$9!#(B

$B$$$A$P$s(B typo $B$K5$$,$D$-$d$9$$=q$-J}$O$$$-$J$jL\E*$N%a%=%C%I(B
$B$r8F$s$G!"(BNotImplementedError $B$r(B rescue 
$B$9$k$3$H$G$O$J$$$G$7$g(B
$B$&$+!#(B

begin
  Process.setrlimit(...)
rescue NotImplementedError
  ...
end

$B$J$I$H$9$l$P!"(Bsetrlimit $B$K(B typo 
$B$,F~$l$P!"(BNoMethodError $B$K$J(B
$B$k$N$G!"(B($B$*$=$i$/(B) 
$B%"%W%j%1!<%7%g%s$OCfCG$5$l!"$9$0$K5$$,$D(B
$B$/$3$H$,$G$-$^$9!#(B

$B$b$A$m$s!"I{:nMQ$NOC$,$"$j$^$9$+$i!">o$K$3$N%9%?%$%k$G=q$1$k(B
$B$o$1$G$O$J$$$G$7$g$&$,!"(Bsetrlimit $B$G@)8B$G$-$l$P@)8B$9$k$,(B
setrlimit $B$,$J$1$l$P5$$K$7$J$$$GB3$1$k!"$H$$$C$?>u67$G$O$$$-(B
$B$J$j8F$S=P$9$3$H$,2DG=$G$9!#(B

$B$7$+$7!"(Bsetrlimit $B$,$J$$4D6-$G%a%=%C%I$rDj5A$5$l$J$/$J$k$H!"(B
$B$3$N%9%?%$%k$,;H$($J$/$J$j$^$9!#$"$($FF1$8%9%?%$%k$G=q$/$H$9(B
$B$l$P(B

begin
  Process.setrlimit(...)
rescue NoMethodError
  ...
end

$B$H$$$&$h$&$K(B NoMethodError $B$r(B rescue 
$B$9$k$3$H$K$J$j$^$9$,!"(B
$B$3$&$9$k$H(B setrlimit $B$KF~$j9~$`(B typo 
$B$rKI$2$J$/$J$j$^$9!#(B
setrlimit $B$r(B typo $B$9$k$H!"%a%=%C%I$,$J$$$N$G(B NoMethodError
$B$K$J$j!"(Bsetrlimit $B$,$J$$$H$-$N=hM}$K?J$s$G$7$^$$$^$9!#(B

$B=>$C$F!"4D6-0MB8$J%a%=%C%I$rDj5A$7$J$$$h$&$K$9$k$3$H$K$OH?BP(B
$B$7$^$9!#(B

$B$7$+$7!"$3$N%9%?%$%k$,;H$($J$$>u67$G$b0lHLE*$KH=CG$G$-$k$N$,(B
$BK>$^$7$$$N$O3N$+$G!"8F$S=P$9$H(B NotImplementedError 
$B$K$J$k$,!"(B
respond_to? $B$K$O56$rJV$9%a%=%C%I$rF3F~$9$k$H$$$&$N$rDs0F$9$k(B
$B$N$O$=$&$$$&$o$1$G$9!#(B