* 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
Родитель 87c1a07d6a
Коммит 30995c6594
2 изменённых файлов: 25 добавлений и 8 удалений

Просмотреть файл

@ -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>
* vm_method.c (rb_method_entry_eq): deals with optimized method

Просмотреть файл

@ -49,15 +49,22 @@ void rb_enc_init(void);
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 @@ check_encoding(rb_encoding *enc)
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 @@ rb_enc_find(const char *name)
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 @@ rb_enc_get_index(VALUE obj)
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 @@ rb_enc_get_index(VALUE obj)
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 {