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/