From: Hajimu UMEMOTO Date: 2006-01-22T03:40:21+09:00 Subject: [ruby-dev:28262] Re: FUNCTION_CALL_MAY_RETURN_TWICE 梅本です。 >>> Sun, 22 Jan 2006 00:43:12 +0900 の刻に「ume」、すなわち >>> Hajimu UMEMOTO 氏曰く ume> その後、AMD64 や Intel で、 ume> rbconfig.db updated ume> ./mkconfig.rb:156: undefined method `touch' for FileUtils:Module (NoMethodError) ume> *** Error code 1 ume> となって build できないという報告が多数で、さてどうしましょうって感じ。orz ume> 手元の環境では再現しないんですよね。 どんどん問題報告が来るので、とりあえず、以下のパッチを入れて、sparc と ia64 以外の時は以前のように FUNCTION_CALL_MAY_RETURN_TWICE を getcontext() の前で一度だけ呼ぶように戻しました。理不尽ではありますが、 少なくともそれで以前は動いていたということで。 Index: eval.c diff -u -p eval.c.orig eval.c --- eval.c.orig Sun Jan 22 02:38:43 2006 +++ eval.c Sun Jan 22 02:50:12 2006 @@ -167,25 +167,31 @@ rb_jump_context(env, val) "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", \ "%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%i7"); }) #endif -#elif defined(__ia64) +#else static jmp_buf function_call_may_return_twice_jmp_buf; int function_call_may_return_twice_false = 0; #define FUNCTION_CALL_MAY_RETURN_TWICE \ (function_call_may_return_twice_false ? \ setjmp(function_call_may_return_twice_jmp_buf) : \ 0) -#else -#define FUNCTION_CALL_MAY_RETURN_TWICE 0 #endif #else #define FUNCTION_CALL_MAY_RETURN_TWICE 0 #endif #define ruby_longjmp(env, val) rb_jump_context(env, val) +#if GCC_VERSION_BEFORE(4,0,3) && \ + (defined(sparc) || defined(__sparc__) || defined(__ia64)) #define ruby_setjmp(j) ((j)->status = 0, \ FUNCTION_CALL_MAY_RETURN_TWICE, \ getcontext(&(j)->context), \ FUNCTION_CALL_MAY_RETURN_TWICE, \ (j)->status) +#else +#define ruby_setjmp(j) ((j)->status = 0, \ + FUNCTION_CALL_MAY_RETURN_TWICE, \ + getcontext(&(j)->context), \ + (j)->status) +#endif #else typedef jmp_buf rb_jmpbuf_t; #if !defined(setjmp) && defined(HAVE__SETJMP) -- 梅本 肇 @ インターネット互助会横浜 http://www.imasy.org/~ume/ ume@mahoroba.org ume@{,jp.}FreeBSD.org プログラムは書いた人の意図ではなく書かれた通り動く I hate Modula-3 :-)