Issue #6936 has been updated by naruse (Yui NARUSE).


ko1 (Koichi Sasada) wrote:
> (2012/08/27 22:35), NARUSE, Yui wrote:
>  > (2012/08/27 17:46), KOSAKI Motohiro wrote:
>  >>>> å¾??????®å?·ä????????æ³???¯ã??????¤ã??????????¨æ???????¾ã??????????³å?¤ã?¯æ??????????? frozen ??«ã????¦ã??????¨ã????????????????ªã?¨æ????£ã?¦ã????¾ã?????
>  >>>
>  >>> ???Numeric ??? freeze ?????¡ã?????ï¼???¨ã???????®ã????¨ã?????????§ã???????????ï¼?
>  >>
>  >> ??¼ã???¯ã??????????¨ã?????????????°ã?¨ã?????æ¦?念ã?¯ä??????????¯ã????¾ã??????????????????????£ã????®ã????????????????????¨ã?????ä¸??????§ã?????
>  > 
>  > ????????§ã????­ã????????????????¨çµ±ä¸?????????ºã?????????????ªã???????ªã????¨æ????£ã?¦ã????¾ã?????
>  
>  ?????¨ã???????????å½±é?¿ã??å°???ªã???????ªï??Float ?????? frozen ??«ã????¡ã???????®ã?¯ã?©ã????§ã?????
>  ??????ï¼?

以ä????®ã???????ªæ???????§ã????????

diff --git a/class.c b/class.c
index 1d871fb..1df38e4 100644
--- a/class.c
+++ b/class.c
@@ -1324,6 +1324,10 @@ singleton_class_of(VALUE obj)
            rb_bug("unknown immediate %p", (void *)obj);
        return klass;
     }
+    else {
+       if (BUILTIN_TYPE(obj) == T_FLOAT)
+           rb_raise(rb_eTypeError, "can't define singleton");
+    }
 
     if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON) &&
        rb_ivar_get(RBASIC(obj)->klass, id_attached) == obj) {
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index a674de8..53de6a8 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -1129,7 +1129,7 @@ struct RBignum {
                         (FL_TAINT | FL_UNTRUSTED); \
 } while (0)
 
-#define OBJ_FROZEN(x) (!!FL_TEST((x), FL_FREEZE))
+#define OBJ_FROZEN(x) (!!(FL_ABLE(x)?(RBASIC(x)->flags&(FL_FREEZE)):FLONUM_P(x)))
 #define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
 
 #if SIZEOF_INT < SIZEOF_LONG
diff --git a/numeric.c b/numeric.c
index 58ac7ad..6a72fba 100644
--- a/numeric.c
+++ b/numeric.c
@@ -621,6 +621,7 @@ rb_float_new_in_heap(double d)
     OBJSETUP(flt, rb_cFloat, T_FLOAT);
 
     flt->float_value = d;
+    OBJ_FREEZE(flt);
     return (VALUE)flt;
 }

----------------------------------------
Feature #6936: Forbid singleton class and instance variabls for float
https://bugs.ruby-lang.org/issues/6936#change-29181

Author: naruse (Yui NARUSE)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: 2.0.0


[Feature #6763] ??ªã?©ã?§è­°è«?????????¦ã????? flonum ??? r36798 ??§ã????¥ã?£ã?????????§ã????????

1. Float ??®ã?ªã????¸ã?§ã?¯ã??ID ??®ä??æ§????å¤????
2. flonum ??? float ??«ç?¹ç?°ã?¡ã?½ã????????追å??ä¸???
3. flonum ??? float ??«ç?¹ç?°ã?¯ã?©ã?¹ã??ä½????ä¸???
4. flonum ??? float ??¯å???????¤å??士ã?§ã?¤ã?³ã?¹ã?¿ã?³ã?¹å????°ã????±æ???????????

??¨ã????£ã?????äº???????å­???¨ã????¾ã?????
?????£ã?¨ã?????1. ??¯é??常æ??????????¯ã????®ã?ªã????¨ã???????§ã????????2. ??¯å????????ç¦?æ­¢ã???????¦ã????¾ã?????
æ°???«ã?ªã????®ã?? 3. ??? 4. ??§ã??????????? 1.9.3 ??¨æ??????????°ã?ªã??????????§ã?ªã????
32bit ??°å????§ã?? 2.0 ??????64bit??°å????? flonum ??§ã?ªã?? float ??ªã????¸ã?§ã?¯ã????¨ã?????????????°ã?ªã????¾ã?????

å®?????????¨ã????¦å??害ã?¯ã?ªã??????????ªæ??????????¾ã?????????????®ã???????ªé????????極ã????¦å??è£?ä¸???®å????§ã??
Ruby ä¸???????è¦??????ªã????¨ã???????«å????¨ã???????®ã?¯æ???????¡æ?ªã?????????¾ã?????

?????£ã?¦ã??以ä????®ã???????«ã???????¨ã???????®ã?§ã?¯ã?ªã????§ã??????????????
* flonum ??§ã?ªã?? float ??§ã????¹ç?°ã?¯ã?©ã?¹ã?®ä????????ç¦?æ­?
* float ??¸ã?®ã?¤ã?³ã?¹ã?¿ã?³ã?¹å????°ä????????ç¦?æ­?

å¾??????®å?·ä????????æ³???¯ã??????¤ã??????????¨æ???????¾ã??????????³å?¤ã?¯æ??????????? frozen ??«ã????¦ã??????¨ã????????????????ªã?¨æ????£ã?¦ã????¾ã?????

話ã????ºæ?£ã??????????¨ã???????®è©±??? true, false, nil, Fixnum, Symbol ??®ã???????ªå?³å?¤ã????????
Bignum ??????Time ??®ã???????? immutable ??£ã?½ã????ªã????¸ã?§ã?¯ã????«ã??å½???¦ã?¯ã?¾ã??æ°?????????¦ã????¾ã?????


-- 
http://bugs.ruby-lang.org/