diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-15 08:04:10 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-15 08:04:10 +0000 |
commit | 26adfc185fac192ba0d0f3f75e40159a972a9fe5 (patch) | |
tree | 06d41d47ccfae664671557ae83098d7a72ecf81d /encoding.c | |
parent | 1b56bcce22a069eba6afb7e36f654783e5b4fbbc (diff) |
* encoding.c (rb_enc_associate_index, rb_enc_get_index): check if
object is encoding capable. [ruby-dev:31780]
* string.c (rb_str_subpat_set): check for if the argument is a String.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13447 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'encoding.c')
-rw-r--r-- | encoding.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/encoding.c b/encoding.c index 8b674d13ea..b1c8ba9349 100644 --- a/encoding.c +++ b/encoding.c @@ -79,9 +79,49 @@ rb_enc_find(const char *name) return ONIG_ENCODING_ASCII; } +static int +enc_capable(VALUE obj) +{ + if (IMMEDIATE_P(obj)) return Qfalse; + switch (BUILTIN_TYPE(obj)) { + case T_STRING: + case T_REGEXP: + case T_FILE: + return Qtrue; + default: + return Qfalse; + } +} + +static void +enc_check_capable(VALUE x) +{ + if (!enc_capable(x)) { + const char *etype; + + if (NIL_P(x)) { + etype = "nil"; + } + else if (FIXNUM_P(x)) { + etype = "Fixnum"; + } + else if (SYMBOL_P(x)) { + etype = "Symbol"; + } + else if (rb_special_const_p(x)) { + etype = RSTRING_PTR(rb_obj_as_string(x)); + } + else { + etype = rb_obj_classname(x); + } + rb_raise(rb_eTypeError, "wrong argument type %s (not encode capable)", etype); + } +} + void rb_enc_associate_index(VALUE obj, int idx) { + enc_check_capable(obj); if (idx < ENCODING_INLINE_MAX) { ENCODING_SET(obj, idx); return; @@ -117,8 +157,10 @@ rb_enc_associate(VALUE obj, rb_encoding *enc) int rb_enc_get_index(VALUE obj) { - int i = ENCODING_GET(obj); + int i; + enc_check_capable(obj); + i = ENCODING_GET(obj); if (i == ENCODING_INLINE_MAX) { VALUE iv; |