[前][次][番号順一覧][スレッド一覧]

ruby-changes:1956

From: ko1@a...
Date: 15 Sep 2007 17:04:22 +0900
Subject: [ruby-changes:1956] nobu - Ruby:r13447 (trunk): * encoding.c (rb_enc_associate_index, rb_enc_get_index): check if

nobu	2007-09-15 17:04:10 +0900 (Sat, 15 Sep 2007)

  New Revision: 13447

  Modified files:
    trunk/ChangeLog
    trunk/encoding.c
    trunk/string.c

  Log:
    * 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.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=13447&r2=13446
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13447&r2=13446
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/encoding.c?r1=13447&r2=13446

Index: encoding.c
===================================================================
--- encoding.c	(revision 13446)
+++ encoding.c	(revision 13447)
@@ -79,9 +79,49 @@
     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 @@
 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;
 
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 13446)
+++ ChangeLog	(revision 13447)
@@ -1,3 +1,10 @@
+Sat Sep 15 17:04:08 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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.
+
 Sat Sep 15 13:31:21 2007  Kouhei Sutou  <kou@c...>
 
 	* lib/rss.rb, lib/rss/, test/rss/:
Index: string.c
===================================================================
--- string.c	(revision 13446)
+++ string.c	(revision 13447)
@@ -1996,6 +1996,7 @@
     }
     end = RMATCH(match)->END(nth);
     len = end - start;
+    StringValue(val);
     rb_enc_check(str, val);
     rb_str_splice_0(str, start, len, val);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]