[前][次][番号順一覧][スレッド一覧]

ruby-changes:12707

From: nobu <ko1@a...>
Date: Thu, 6 Aug 2009 16:25:29 +0900 (JST)
Subject: [ruby-changes:12707] Ruby:r24423 (trunk): * encoding.c (encoding_data_type): typed data.

nobu	2009-08-06 16:25:13 +0900 (Thu, 06 Aug 2009)

  New Revision: 24423

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24423

  Log:
    * encoding.c (encoding_data_type): typed data.
    * encoding.c (enc_capable, rb_enc_get_index): Symbol is encoding
      capable.

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c

Index: encoding.c
===================================================================
--- encoding.c	(revision 24422)
+++ encoding.c	(revision 24423)
@@ -49,15 +49,22 @@
 
 static int load_encoding(const char *name);
 
-static void
-enc_mark(void *ptr)
+static size_t
+enc_memsize(void *p)
 {
+    return 0;
 }
 
+static const rb_data_type_t encoding_data_type = {
+    "encoding", 0, 0, enc_memsize,
+};
+
+#define is_data_encoding(obj) (RTYPEDDATA_P(obj) && RTYPEDDATA_TYPE(obj) != &encoding_data_type)
+
 static VALUE
 enc_new(rb_encoding *encoding)
 {
-    return Data_Wrap_Struct(rb_cEncoding, enc_mark, 0, encoding);
+    return TypedData_Wrap_Struct(rb_cEncoding, &encoding_data_type, encoding);
 }
 
 VALUE
@@ -97,8 +104,7 @@
 static int
 enc_check_encoding(VALUE obj)
 {
-    if (SPECIAL_CONST_P(obj) || BUILTIN_TYPE(obj) != T_DATA ||
-	RDATA(obj)->dmark != enc_mark) {
+    if (SPECIAL_CONST_P(obj) || !rb_typeddata_is_kind_of(obj, &encoding_data_type)) {
 	return -1;
     }
     return check_encoding(RDATA(obj)->data);
@@ -551,14 +557,14 @@
 static inline int
 enc_capable(VALUE obj)
 {
-    if (SPECIAL_CONST_P(obj)) return FALSE;
+    if (SPECIAL_CONST_P(obj)) return SYMBOL_P(obj);
     switch (BUILTIN_TYPE(obj)) {
       case T_STRING:
       case T_REGEXP:
       case T_FILE:
 	return TRUE;
       case T_DATA:
-	if (RDATA(obj)->dmark == enc_mark) return TRUE;
+	if (!is_data_encoding(obj)) return TRUE;
       default:
 	return FALSE;
     }
@@ -577,6 +583,10 @@
     int i = -1;
     VALUE tmp;
 
+    if (SPECIAL_CONST_P(obj)) {
+	if (!SYMBOL_P(obj)) return -1;
+	obj = rb_id2str(SYM2ID(obj));
+    }
     switch (BUILTIN_TYPE(obj)) {
       as_default:
       default:
@@ -596,7 +606,7 @@
 	else obj = tmp;
 	if (NIL_P(obj)) break;
       case T_DATA:
-	if (RDATA(obj)->dmark == enc_mark) {
+	if (is_data_encoding(obj)) {
 	    i = enc_check_encoding(obj);
 	}
 	else {
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24422)
+++ ChangeLog	(revision 24423)
@@ -1,3 +1,10 @@
+Thu Aug  6 16:25:08 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* encoding.c (encoding_data_type): typed data.
+
+	* encoding.c (enc_capable, rb_enc_get_index): Symbol is encoding
+	  capable.
+
 Thu Aug  6 15:44:04 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* vm_method.c (rb_method_entry_eq): deals with optimized method

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]