* encoding.c (encoding_data_type): typed data.

* encoding.c (enc_capable, rb_enc_get_index): Symbol is encoding
  capable.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24423 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2009-08-06 07:25:13 +00:00
parent 87c1a07d6a
commit 30995c6594
2 changed files with 25 additions and 8 deletions

View File

@ -1,3 +1,10 @@
Thu Aug 6 16:25:08 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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@ruby-lang.org> Thu Aug 6 15:44:04 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_method.c (rb_method_entry_eq): deals with optimized method * vm_method.c (rb_method_entry_eq): deals with optimized method

View File

@ -49,15 +49,22 @@ void rb_enc_init(void);
static int load_encoding(const char *name); static int load_encoding(const char *name);
static void static size_t
enc_mark(void *ptr) 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 static VALUE
enc_new(rb_encoding *encoding) 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 VALUE
@ -97,8 +104,7 @@ check_encoding(rb_encoding *enc)
static int static int
enc_check_encoding(VALUE obj) enc_check_encoding(VALUE obj)
{ {
if (SPECIAL_CONST_P(obj) || BUILTIN_TYPE(obj) != T_DATA || if (SPECIAL_CONST_P(obj) || !rb_typeddata_is_kind_of(obj, &encoding_data_type)) {
RDATA(obj)->dmark != enc_mark) {
return -1; return -1;
} }
return check_encoding(RDATA(obj)->data); return check_encoding(RDATA(obj)->data);
@ -551,14 +557,14 @@ rb_enc_find(const char *name)
static inline int static inline int
enc_capable(VALUE obj) enc_capable(VALUE obj)
{ {
if (SPECIAL_CONST_P(obj)) return FALSE; if (SPECIAL_CONST_P(obj)) return SYMBOL_P(obj);
switch (BUILTIN_TYPE(obj)) { switch (BUILTIN_TYPE(obj)) {
case T_STRING: case T_STRING:
case T_REGEXP: case T_REGEXP:
case T_FILE: case T_FILE:
return TRUE; return TRUE;
case T_DATA: case T_DATA:
if (RDATA(obj)->dmark == enc_mark) return TRUE; if (!is_data_encoding(obj)) return TRUE;
default: default:
return FALSE; return FALSE;
} }
@ -577,6 +583,10 @@ rb_enc_get_index(VALUE obj)
int i = -1; int i = -1;
VALUE tmp; VALUE tmp;
if (SPECIAL_CONST_P(obj)) {
if (!SYMBOL_P(obj)) return -1;
obj = rb_id2str(SYM2ID(obj));
}
switch (BUILTIN_TYPE(obj)) { switch (BUILTIN_TYPE(obj)) {
as_default: as_default:
default: default:
@ -596,7 +606,7 @@ rb_enc_get_index(VALUE obj)
else obj = tmp; else obj = tmp;
if (NIL_P(obj)) break; if (NIL_P(obj)) break;
case T_DATA: case T_DATA:
if (RDATA(obj)->dmark == enc_mark) { if (is_data_encoding(obj)) {
i = enc_check_encoding(obj); i = enc_check_encoding(obj);
} }
else { else {