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

ruby-changes:22303

From: nobu <ko1@a...>
Date: Sun, 22 Jan 2012 15:23:57 +0900 (JST)
Subject: [ruby-changes:22303] nobu:r34352 (trunk): * parse.y (rb_intern3, rb_intern_str): check the coderange first.

nobu	2012-01-22 15:23:38 +0900 (Sun, 22 Jan 2012)

  New Revision: 34352

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34352

  Log:
    * parse.y (rb_intern3, rb_intern_str): check the coderange first.

  Modified files:
    trunk/ChangeLog
    trunk/parse.y

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34351)
+++ ChangeLog	(revision 34352)
@@ -1,3 +1,7 @@
+Sun Jan 22 15:23:35 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (rb_intern3, rb_intern_str): check the coderange first.
+
 Sat Jan 21 22:21:07 2012  Nobuyoshi Nakada  <nobu@r...>
 
 	* include/ruby/ruby.h (FIXNUM_P): simple flag should be int.
Index: parse.y
===================================================================
--- parse.y	(revision 34351)
+++ parse.y	(revision 34352)
@@ -10397,6 +10397,16 @@
     return id;
 }
 
+static int
+sym_check_asciionly(VALUE str)
+{
+    int cr = rb_enc_str_coderange(str);
+    if (cr == ENC_CODERANGE_BROKEN) {
+    	rb_raise(rb_eEncodingError, "invalid encoding symbol");
+    }
+    return cr == ENC_CODERANGE_7BIT;
+}
+
 ID
 rb_intern3(const char *name, long len, rb_encoding *enc)
 {
@@ -10418,9 +10428,7 @@
     rb_enc_associate(str, enc);
     OBJ_FREEZE(str);
 
-    if (rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN) {
-    	rb_raise(rb_eEncodingError, "invalid encoding symbol");
-    }
+    if (sym_check_asciionly(str)) enc = rb_usascii_encoding();
 
     if (st_lookup(global_symbols.sym_id, str, &data))
 	return (ID)data;
@@ -10486,32 +10494,17 @@
 	}
 	break;
     }
-    mb = 0;
     if (!rb_enc_isdigit(*m, enc)) {
 	while (m <= name + last && is_identchar(m, e, enc)) {
 	    if (ISASCII(*m)) {
 		m++;
 	    }
 	    else {
-		mb = 1;
 		m += rb_enc_mbclen(m, e, enc);
 	    }
 	}
     }
     if (m - name < len) id = ID_JUNK;
-    if (enc != rb_usascii_encoding()) {
-	/*
-	 * this clause makes sense only when called from other than
-	 * rb_intern_str() taking care of code-range.
-	 */
-	if (!mb) {
-	    for (; m <= name + len; ++m) {
-		if (!ISASCII(*m)) goto mbstr;
-	    }
-	    enc = rb_usascii_encoding();
-	}
-      mbstr:;
-    }
   new_id:
     if (global_symbols.last_id >= ~(ID)0 >> (ID_SCOPE_SHIFT+RUBY_SPECIAL_SHIFT)) {
 	if (len > 20) {
@@ -10547,7 +10540,7 @@
     rb_encoding *enc;
     ID id;
 
-    if (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT) {
+    if (sym_check_asciionly(str)) {
 	enc = rb_usascii_encoding();
     }
     else {
@@ -10734,9 +10727,7 @@
 	*namep = name;
     }
 
-    if (rb_enc_str_coderange(name) == ENC_CODERANGE_BROKEN) {
-	rb_raise(rb_eEncodingError, "invalid encoding symbol");
-    }
+    sym_check_asciionly(name);
 
     if (st_lookup(global_symbols.sym_id, (st_data_t)name, &id))
 	return (ID)id;

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

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