* 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:
parent
87c1a07d6a
commit
30995c6594
@ -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
|
||||||
|
26
encoding.c
26
encoding.c
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user