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/