From: nobu.nakada@... Date: 2002-01-28T20:47:19+09:00 Subject: [ruby-dev:15787] Re: definition of StringValue なかだです。 At Mon, 28 Jan 2002 20:19:09 +0900, UENO Katsuhiro wrote: > ruby.h を眺めてて思ったのですが、StringValue は > > Index: ruby.h > =================================================================== > RCS file: /src/ruby/ruby.h,v > retrieving revision 1.57 > diff -u -r1.57 ruby.h > --- ruby.h 2001/12/21 07:20:23 1.57 > +++ ruby.h 2002/01/28 11:11:55 > @@ -201,7 +201,7 @@ > VALUE rb_str_to_str _((VALUE)); > VALUE rb_string_value _((volatile VALUE*)); > > -#define StringValue(v) if (TYPE(v) != T_STRING) rb_string_value(&(v)) > +#define StringValue(v) ((TYPE(v) != T_STRING) ? (v) : rb_string_value(&(v))) > void rb_check_safe_str _((VALUE)); > #define SafeStringValue(v) do {\ > StringValue(v);\ > > こうしたほうが良くないですか? 賛成ですが、条件が逆です。 もうひとつ、定数を使う場合はこのほうが最適化されやすいようです。 #define BUILTIN_TYPE_P(obj, t) (\ ((t) == T_FIXNUM) ? FIXNUM_P(obj) : \ ((t) == T_NIL) ? NIL_P(obj) : \ ((t) == T_FALSE) ? ((VALUE)(obj) == Qfalse) : \ ((t) == T_TRUE) ? ((VALUE)(obj) == Qtrue) : \ ((t) == T_UNDEF) ? ((VALUE)(obj) == Qundef) : \ ((t) == T_SYMBOL) ? SYMBOL_P(obj) : \ (!SPECIAL_CONST_P(obj) && BUILTIN_TYPE(obj) == t)) #define StringValue(v) (BUILTIN_TYPE_P(v, T_STRING) ? (v) : rb_string_value(&(v))) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦