aboutsummaryrefslogtreecommitdiffstats
path: root/encoding.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-15 08:04:10 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-15 08:04:10 +0000
commit26adfc185fac192ba0d0f3f75e40159a972a9fe5 (patch)
tree06d41d47ccfae664671557ae83098d7a72ecf81d /encoding.c
parent1b56bcce22a069eba6afb7e36f654783e5b4fbbc (diff)
downloadruby-26adfc185fac192ba0d0f3f75e40159a972a9fe5.tar.gz
* 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.c44
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;