なかだです。

http://www.geocities.co.jp/SiliconValley-PaloAlto/1409/ruby/beos.html
の能条さんのBeOS用パッチを見て気づいたんですが、
2003-08-04-p2.diffは他の環境でも必要になる可能性があります。1.8
ではAC_SYS_LARGEFILEを使っているのでst_inoがlongより大きい場合
がありますし、常にerrnoがFixnumに収まるという保証はありません。

2003-08-04-p1.diffのsocket関連はよく分からないのでパス。
2003-08-04-p3.diffは、binのものは一応instruby.rbで置換してるの
で、それ以外のサンプルとかテストはとりあえず我慢してもらうとい
うことで。


Index: configure.in =================================================================== RCS file: /cvs/ruby/src/ruby/configure.in,v retrieving revision 1.186 diff -u -2 -p -r1.186 configure.in --- configure.in 7 Aug 2003 05:43:58 -0000 1.186 +++ configure.in 13 Aug 2003 19:03:57 -0000 @@ -625,4 +625,16 @@ if test "$rb_cv_need_io_flush_before_see fi +AC_CACHE_CHECK([whether st_ino is huge], rb_cv_huge_st_ino, +[AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([ +#include <sys/stat.h> +struct stat test_stat; +], [sizeof(test_stat.st_ino)>sizeof(long)])], +rb_cv_huge_st_ino=yes, +rb_cv_huge_st_ino=no) +]) +if test $rb_cv_huge_st_ino = yes; then + AC_DEFINE(HUGE_ST_INO) +fi + case "$target_cpu" in m68*|i?86|sparc) rb_cv_stack_grow_dir=-1;; Index: error.c =================================================================== RCS file: /cvs/ruby/src/ruby/error.c,v retrieving revision 1.75 diff -u -2 -p -r1.75 error.c --- error.c 30 Jul 2003 06:10:08 -0000 1.75 +++ error.c 13 Aug 2003 09:37:27 -0000 @@ -607,5 +607,5 @@ syserr_eqq(self, exc) VALUE self, exc; { - VALUE num; + VALUE num, e; if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse; @@ -621,5 +621,6 @@ syserr_eqq(self, exc) num = rb_const_get(klass, rb_intern("Errno")); } - if (rb_const_get(self, rb_intern("Errno")) == num) + e = rb_const_get(self, rb_intern("Errno")); + if (FIXNUM_P(num) ? num == e : rb_equal(num, e)) return Qtrue; return Qfalse; @@ -671,5 +672,11 @@ Init_Exception() rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException); - init_syserr(); + syserr_tbl = st_init_numtable(); + rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError); + rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1); + rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0); + rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1); + + rb_mErrno = rb_define_module("Errno"); rb_define_global_function("warn", rb_warn_m, 1); @@ -805,14 +812,7 @@ rb_check_frozen(obj) } -static void -init_syserr() +void +Init_syserr() { - syserr_tbl = st_init_numtable(); - rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError); - rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1); - rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0); - rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1); - - rb_mErrno = rb_define_module("Errno"); #ifdef EPERM set_syserr(EPERM, "EPERM"); Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.155 diff -u -2 -p -r1.155 file.c --- file.c 30 Jul 2003 00:32:03 -0000 1.155 +++ file.c 13 Aug 2003 19:05:25 -0000 @@ -162,5 +162,9 @@ rb_stat_ino(self) VALUE self; { +#ifdef HUGE_ST_INO + return ULL2NUM(get_stat(self)->st_ino); +#else return ULONG2NUM(get_stat(self)->st_ino); +#endif } @@ -172,5 +176,5 @@ rb_stat_mode(self) return UINT2NUM((unsigned short)(get_stat(self)->st_mode)); #else - return UINT2NUM(get_stat(self)->st_mode); + return UINT2NUM(get_stat(self)->st_mode); #endif } Index: inits.c =================================================================== RCS file: /cvs/ruby/src/ruby/inits.c,v retrieving revision 1.7 diff -u -2 -p -r1.7 inits.c --- inits.c 16 Jan 2003 07:34:01 -0000 1.7 +++ inits.c 13 Aug 2003 19:07:05 -0000 @@ -19,4 +19,5 @@ void Init_Dir _((void)); void Init_Enumerable _((void)); void Init_Exception _((void)); +void Init_syserr _((void)); void Init_eval _((void)); void Init_load _((void)); @@ -60,4 +61,5 @@ rb_call_inits() Init_Numeric(); Init_Bignum(); + Init_syserr(); Init_Array(); Init_Hash();
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦