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

ruby-changes:9161

From: yugui <ko1@a...>
Date: Sat, 13 Dec 2008 10:03:55 +0900 (JST)
Subject: [ruby-changes:9161] Ruby:r20698 (ruby_1_9_1): merges r20625, r20633, r20656 and r20665 from trunk into ruby_1_9_1.

yugui	2008-12-13 10:02:43 +0900 (Sat, 13 Dec 2008)

  New Revision: 20698

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

  Log:
    merges r20625, r20633, r20656 and r20665 from trunk into ruby_1_9_1.
    --
    * encoding.c (enc_set_default_encoding): allowed to set default
      encoding.
    --
    * encoding.c (rb_enc_aliases_enc_i): skips default internal.
    --
    * encoding.c (enc_get_default_encoding): removed.
      Generalizing rb_default_{external,internal}_encoding seems to be
      difficult.
      default_external cannot be NULL even before detected. [ruby-dev:37390]
    * encoding.c (rb_default_external_encoding): has its own
      implementation again.
    
    * encoding.c (rb_default_internal_encoding): ditto.
    
    * gem_prelude.rb: added notice.
    
    * ruby.c (rubylib_mangled_path, rubylib_mangled_path2): uses locale
      encoding but not ASCII-8BIT.
    
    * ruby.c (process_options): refers less to default_external.
    --
    * encoding.c (rb_enc_set_default_external): default_internal can be
      nil, but default_external cannot.
    
    * encoding.c (rb_set_default_internal): adds rdoc.
    
    * encoding.c (enc_find): ditto.

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/encoding.c
    branches/ruby_1_9_1/gem_prelude.rb
    branches/ruby_1_9_1/ruby.c

Index: ruby_1_9_1/encoding.c
===================================================================
--- ruby_1_9_1/encoding.c	(revision 20697)
+++ ruby_1_9_1/encoding.c	(revision 20698)
@@ -905,6 +905,9 @@
  *   Encoding.find("US-ASCII")  => #<Encoding:US-ASCII>
  *   Encoding.find(:Shift_JIS)  => #<Encoding:Shift_JIS>
  *
+ * An ArgumentError is raised when no encoding with <i>name</i>.
+ * Only +Encoding.find("internal")+ however returns nil when no encoding named "internal",
+ * in other words, when Ruby has no default internal encoding.
  */
 static VALUE
 enc_find(VALUE klass, VALUE enc)
@@ -1032,16 +1035,51 @@
     return enc;
 }
 
-static int default_external_index;
-static rb_encoding *default_external;
+struct default_encoding {
+    int index;			/* -2 => not yet set, -1 => nil */
+    rb_encoding *enc;
+};
 
+static int
+enc_set_default_encoding(struct default_encoding *def, VALUE encoding,
+			 const char *name, int defindex)
+{
+    int overridden = Qfalse;
+    if (def->index != -2)
+	/* Already set */
+	overridden = Qtrue;
+
+    if (NIL_P(encoding)) {
+	def->index = -1;
+	def->enc = 0;
+	st_insert(enc_table.names, (st_data_t)strdup(name),
+		  (st_data_t)UNSPECIFIED_ENCODING);
+    }
+    else {
+	def->index = rb_enc_to_index(rb_to_encoding(encoding));
+	if (def->index == ENCINDEX_US_ASCII)
+	    def->index = defindex;
+	def->enc = 0;
+	enc_alias_internal(name, def->index);
+    }
+
+    return overridden;
+}
+
+static struct default_encoding default_external = {-2};
+
 rb_encoding *
 rb_default_external_encoding(void)
 {
-    if (!default_external) {
-	default_external = rb_enc_from_index(default_external_index);
+    if (default_external.enc) return default_external.enc;
+
+    if (default_external.index >= 0) {
+        default_external.enc = rb_enc_from_index(default_external.index);
+        return default_external.enc;
     }
-    return default_external;
+    else {
+        return rb_locale_encoding();
+    }
 }
 
 VALUE
@@ -1056,8 +1094,7 @@
  *
  * Returns default external encoding.
  *
- * It is initialized by the locale or -E option,
- * and can't be modified after that.
+ * It is initialized by the locale or -E option.
  */
 static VALUE
 get_default_external(VALUE klass)
@@ -1068,22 +1105,36 @@
 void
 rb_enc_set_default_external(VALUE encoding)
 {
-    default_external_index = rb_enc_to_index(rb_to_encoding(encoding));
-    default_external = 0;
-    enc_alias_internal("external", default_external_index);
+    if (NIL_P(encoding)) {
+        rb_raise(rb_eArgError, "default external can not be nil");
+    }
+    enc_set_default_encoding(&default_external, encoding,
+			     "external", ENCINDEX_US_ASCII);
 }
 
-/* -2 => not yet set, -1 => nil */
-static int default_internal_index = -2;
-static rb_encoding *default_internal;
+/*
+ * call-seq:
+ *   Encoding.default_external = enc
+ *
+ * Sets default external encoding.
+ */
+static VALUE
+set_default_external(VALUE klass, VALUE encoding)
+{
+    rb_warning("setting Encoding.default_external");
+    rb_enc_set_default_external(encoding);
+    return encoding;
+}
 
+static struct default_encoding default_internal = {-2};
+
 rb_encoding *
 rb_default_internal_encoding(void)
 {
-    if (!default_internal && default_internal_index >= 0) {
-	default_internal = rb_enc_from_index(default_internal_index);
+    if (!default_internal.enc && default_internal.index >= 0) {
+        default_internal.enc = rb_enc_from_index(default_internal.index);
     }
-    return default_internal;
+    return default_internal.enc; /* can be NULL */
 }
 
 VALUE
@@ -1099,8 +1150,7 @@
  *
  * Returns default internal encoding.
  *
- * It is initialized by the source internal_encoding or -E option,
- * and can't be modified after that.
+ * It is initialized by the source internal_encoding or -E option.
  */
 static VALUE
 get_default_internal(VALUE klass)
@@ -1111,23 +1161,23 @@
 void
 rb_enc_set_default_internal(VALUE encoding)
 {
-    if (default_internal_index != -2)
-	/* Already set */
-	return;
-    if (NIL_P(encoding)) {
-	default_internal_index = -1;
-	default_internal = 0;
-	st_insert(enc_table.names, (st_data_t)strdup("internal"),
-		  (st_data_t)UNSPECIFIED_ENCODING);
-	return;
-    }
+    enc_set_default_encoding(&default_internal, encoding,
+			     "internal", ENCINDEX_UTF_8);
+}
 
-    default_internal_index = rb_enc_to_index(rb_to_encoding(encoding));
-    /* Convert US-ASCII => UTF-8 */
-    if (default_internal_index == rb_usascii_encindex())
-	default_internal_index = rb_utf8_encindex();
-    default_internal = 0;
-    enc_alias_internal("internal", default_internal_index);
+/*
+ * call-seq:
+ *   Encoding.default_internal = enc or nil
+ *
+ * Sets default internal encoding.
+ * Or removes default internal encoding when passed nil.
+ */
+static VALUE
+set_default_internal(VALUE klass, VALUE encoding)
+{
+    rb_warning("setting Encoding.default_internal");
+    rb_enc_set_default_internal(encoding);
+    return encoding;
 }
 
 /*
@@ -1256,6 +1306,7 @@
     if (NIL_P(str)) {
 	rb_encoding *enc = rb_enc_from_index(idx);
 
+	if (!enc) return ST_CONTINUE;
 	if (STRCASECMP((char*)name, rb_enc_name(enc)) == 0) {
 	    return ST_CONTINUE;
 	}
@@ -1316,7 +1367,9 @@
     rb_define_singleton_method(rb_cEncoding, "_load", enc_load, 1);
 
     rb_define_singleton_method(rb_cEncoding, "default_external", get_default_external, 0);
+    rb_define_singleton_method(rb_cEncoding, "default_external=", set_default_external, 1);
     rb_define_singleton_method(rb_cEncoding, "default_internal", get_default_internal, 0);
+    rb_define_singleton_method(rb_cEncoding, "default_internal=", set_default_internal, 1);
     rb_define_singleton_method(rb_cEncoding, "locale_charmap", rb_locale_charmap, 0);
 
     list = rb_ary_new2(enc_table.count);
Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 20697)
+++ ruby_1_9_1/ChangeLog	(revision 20698)
@@ -1,8 +1,40 @@
-Thu Dec 11 13:17:04 2008  Nobuyoshi Nakada  <nobu@r...>
+Fri Dec 12 19:29:07 2008  Yuki Sonoda (Yugui)  <yugui@y...>
 
-	* encoding.c (rb_enc_set_default_internal): defines internal
-	  encoding as nil.
+	* encoding.c (rb_enc_set_default_external): default_internal can be
+	  nil, but default_external cannot.
 
+	* encoding.c (rb_set_default_internal): adds rdoc.
+
+	* encoding.c (enc_find): ditto.
+
+Fri Dec 12 14:09:55 2008  Yuki Sonoda (Yugui)  <yugui@y...>
+
+	* encoding.c (enc_get_default_encoding): removed.
+	  Generalizing rb_default_{external,internal}_encoding seems to be
+	  difficult. 
+	  default_external cannot be NULL even before detected. [ruby-dev:37390]
+
+	* encoding.c (rb_default_external_encoding): has its own
+	  implementation again.
+
+	* encoding.c (rb_default_internal_encoding): ditto.
+
+	* gem_prelude.rb: added notice.
+
+	* ruby.c (rubylib_mangled_path, rubylib_mangled_path2): uses locale
+	  encoding but not ASCII-8BIT.
+
+	* ruby.c (process_options): refers less to default_external.
+
+Thu Dec 11 20:05:17 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* encoding.c (rb_enc_aliases_enc_i): skips default internal.
+
+Thu Dec 11 13:36:18 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* encoding.c (enc_set_default_encoding): allowed to set default
+	  encoding.
+
 	* encoding.c (rb_locale_encoding): removed Encoding::LOCALE.
 
 	* encoding.c (rb_enc_set_default_external): ditto.
Index: ruby_1_9_1/gem_prelude.rb
===================================================================
--- ruby_1_9_1/gem_prelude.rb	(revision 20697)
+++ ruby_1_9_1/gem_prelude.rb	(revision 20698)
@@ -2,6 +2,10 @@
 # vim: filetype=ruby
 # THIS FILE WAS AUTOGENERATED, DO NOT EDIT
 
+# NOTICE: Ruby is during initialization here. 
+#   * Encoding.default_external does not reflects -E.
+#   * Should not expect Encoding.default_internal.
+#   * Locale encoding is available.
 if defined?(Gem) then
 
   module Kernel
Index: ruby_1_9_1/ruby.c
===================================================================
--- ruby_1_9_1/ruby.c	(revision 20697)
+++ ruby_1_9_1/ruby.c	(revision 20698)
@@ -210,9 +210,9 @@
 	}
     }
     if (!newp || l < oldl || STRNCASECMP(oldp, s, oldl) != 0) {
-	return rb_str_new(s, l);
+	return rb_locale_str_new(s, l);
     }
-    ret = rb_str_new(0, l + newl - oldl);
+    ret = rb_locale_str_new(0, l + newl - oldl);
     ptr = RSTRING_PTR(ret);
     memcpy(ptr, newp, newl);
     memcpy(ptr + newl, s + oldl, l - oldl);
@@ -226,8 +226,8 @@
     return rubylib_mangled_path(s, strlen(s));
 }
 #else
-#define rubylib_mangled_path rb_str_new
-#define rubylib_mangled_path2 rb_str_new2
+#define rubylib_mangled_path rb_locale_str_new
+#define rubylib_mangled_path2 rb_locale_str_new_cstr
 #endif
 
 static void
@@ -1141,7 +1141,7 @@
 	}
     }
 
-    ruby_script(opt->script);
+    rb_progname = rb_obj_freeze(rb_str_new_cstr(opt->script));
 #if defined DOSISH || defined __CYGWIN__
     translate_char(RSTRING_PTR(rb_progname), '\\', '/');
 #endif
@@ -1641,7 +1641,7 @@
     struct cmdline_options opt;
     NODE *tree;
 
-    ruby_script(argv[0]);	/* for the time being */
+    ruby_script(argv[0]);  /* for the time being */
     rb_argv0 = rb_str_new4(rb_progname);
     rb_gc_register_mark_object(rb_argv0);
     args.argc = argc;

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

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