[#39222] [Bug #2036] AIX 5L 5.2にて、ruby-1.8.7-p174のビルド時にmake testをするとエラーになった。not ok float 7 -- ./sample/test.rb:1232 — 和弥 寺元 <redmine@...>
Bug #2036: AIX 5L 5.2にて、ruby-1.8.7-p174のビルド時にmake testをするとエラーになった。not ok float 7 -- ./sample/test.rb:1232
チケット #2036 が更新されました。 (by 和弥 寺元)
[#39248] pdeque - Double-Ended Priority Queue — Tanaka Akira <akr@...>
優先順位つきキューとして、このメールにつけてある pdeque.rb
[#39249] [Bug #2060] DLをCからRubyに変換する事を勧めます — Aaron Patterson <redmine@...>
Bug #2060: DLをCからRubyに変換する事を勧めます
なかだです。
2009/9/7 Nobuyoshi Nakada <nobu@ruby-lang.org>:
[#39277] Why doesn't Array#product return Enumerator? — Yusuke ENDOH <mame@...>
遠藤です。
まつもと ゆきひろです
遠藤です。
まつもと ゆきひろです
[#39282] [Bug #2067] bodyが大きいエラーページをopen-uriで取得するとfdがリークしている — takeru sasaki <redmine@...>
チケット #2067 が更新されました。 (by takeru sasaki)
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
In article <E1MliJq-0000yc-4o@x61.netlab.jp>,
言いだしっぺの佐々木です。
まつもと ゆきひろです
佐々木です。
In article <c507366f0909102211s5ae74f72r82afabdf57ae89@mail.gmail.com>,
[#39301] [Feature #2080] Proc#to_source, Method#to_source — Yuki Sonoda <redmine@...>
Feature #2080: Proc#to_source, Method#to_source
[#39322] [Feature #2093] String#stripの対象は\sか[:space:]か — Yui NARUSE <redmine@...>
Feature #2093: String#stripの対象は\sか[:space:]か
[#39325] makeターゲットrdevを抽象化 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp>
きしもとです
なかだです。
[#39352] [ruby19] Thread 切替えが異常に遅い? — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
なかだです。
永井@知能.九工大です.
ささだです.
永井@知能.九工大です.
なかだです。
[#39361] [Bug:1.9] ("00".."00").to_a => ["0"] — Nobuhiro IMAI <nov@...>
いまいです。
[#39367] Almost endless loop of BigMath::atan(x) when x.abs >= 1 — "Masahiro Kanai (CanI)" <cani.m.61st@...>
金井 仁弘と申します。
豊福です。遅い反応ですが。
豊福です。
金井です。
豊福です。
豊福です。
豊福です。
金井です。
[#39372] [Proposal] メンテナ確認大会のお知らせ — Yugui <yugui@...>
Yuguiです。
Yuguiさんメールありがとうございました。こちらに返信します。
[#39385] Removing constant-able macros inside of the loop. — "Masahiro Kanai (CanI)" <cani.m.61st@...>
金井 仁弘と申します。
[#39388] Re: [ruby-cvs:32331] Ruby:r25113 (trunk): String#inspect's encoding should be fixed. — "Martin J. Dürst" <duerst@...>
成瀬さん、こんにちは。
こんにちは、なかむら(う)です。
成瀬です。
中村さん、成瀬さん、こんにちは。
2009年9月29日12:31 "Martin J. Dürst" <duerst@it.aoyama.ac.jp>:
[ruby-dev:39343] [Feature #2102] String#inspect as default_internal encoding
Feature #2102: String#inspect as default_internal encoding
http://redmine.ruby-lang.org/issues/show/2102
起票者: Yui NARUSE
ステータス: Open, 優先度: Normal
カテゴリ: M17N
String#inspect の結果は特定のエンコーディングに揃えるようにしませんか。
現在の inspect は異なるエンコーディングを持つ文字列でも何も考えず結合を試み、
結果 EncodingCompatibilityError が上がったとしても気にしない、
というものになっています。
しかし、inspect は irb や p など、とりあえずオブジェクトの中身を概観したい、
という時に使われるものなのに、異なるエンコーディングがあるくらいで、
例外になってしまうは正直不便です。
添付のパッチでは、
* default_internal が設定されていればそれを、設定されていなければ default_external を用いる。
ただし、そのエンコーディングが ASCII compatible でない場合は US-ASCII を用いる。
(以下 inspect のエンコーディングと呼ぶ)
* String#inspect の結果は、その String のエンコーディングが、
inspect のエンコーディングと同じ場合はこれまでと同様。
* 異なる場合、String 内の非 US-ASCII 文字は \xXX 形式でエスケープする。
* String 以外の inspect はこれまでと同様。
としています。
これにより、inspect 結果のエンコーディングが一定になるので例外が上がることがなくなります。
動作の例を示すと、inspect のエンコーディングが UTF-8 の場合、
"あ".encode("UTF-16BE").inspect
# before => "0B"
# after => "\x30\x42"
"い".encode("UTF-8").inspect
# before => "い"
# after => "い"
"う".encode("EUC-JP").inspect
# before => "" (注: EUC-JP で生の「う」)
# after => "\xA4\xA6"
["あ".encode("UTF-16BE"), "い".encode("UTF-8"), "う".encode("EUC-JP")].inspect
# before=> EncodingCompatibilityError
# after => ["\x30\x42", "い", "\xA4\xA6"]
どうでしょうか?
diff --git a/string.c b/string.c
index aa36c37..b8d862c 100644
--- a/string.c
+++ b/string.c
@@ -1739,6 +1739,12 @@ str_buf_cat(VALUE str, const char *ptr, long len)
return str;
}
+static VALUE
+str_buf_cat2(VALUE str, const char *ptr)
+{
+ return str_buf_cat(str, ptr, strlen(ptr));
+}
+
VALUE
rb_str_buf_cat(VALUE str, const char *ptr, long len)
{
@@ -4237,13 +4243,6 @@ str_cat_char(VALUE str, unsigned int c, rb_encoding *enc)
rb_enc_str_buf_cat(str, s, n, enc);
}
-static void
-prefix_escape(VALUE str, unsigned int c, rb_encoding *enc)
-{
- str_cat_char(str, '\\', enc);
- str_cat_char(str, c, enc);
-}
-
/*
* call-seq:
* str.inspect => string
@@ -4262,10 +4261,13 @@ rb_str_inspect(VALUE str)
rb_encoding *enc = STR_ENC_GET(str);
char *p, *pend;
VALUE result = rb_str_buf_new(0);
+ rb_encoding *resenc = rb_default_internal_encoding();
+
+ if (resenc == NULL) resenc = rb_default_external_encoding();
+ if (!rb_enc_asciicompat(resenc)) resenc = rb_usascii_encoding();
+ rb_enc_associate(result, resenc);
+ str_buf_cat2(result, "\"");
- if (!rb_enc_asciicompat(enc)) enc = rb_usascii_encoding();
- rb_enc_associate(result, enc);
- str_cat_char(result, '"', enc);
p = RSTRING_PTR(str); pend = RSTRING_END(str);
while (p < pend) {
unsigned int c, cc;
@@ -4278,8 +4280,7 @@ rb_str_inspect(VALUE str)
goto escape_codepoint;
}
n = MBCLEN_CHARFOUND_LEN(n);
-
- c = rb_enc_codepoint_len(p, pend, &n, enc);
+ c = rb_enc_mbc_to_codepoint(p, pend, enc);
p += n;
if (c == '"'|| c == '\\' ||
(c == '#' &&
@@ -4287,51 +4288,49 @@ rb_str_inspect(VALUE str)
MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) &&
(cc = rb_enc_codepoint(p,pend,enc),
(cc == '$' || cc == '@' || cc == '{')))) {
- prefix_escape(result, c, enc);
+ str_buf_cat2(result, "\\");
+ str_buf_cat(result, p - n, n);
}
else if (c == '\n') {
- prefix_escape(result, 'n', enc);
+ str_buf_cat2(result, "\\n");
}
else if (c == '\r') {
- prefix_escape(result, 'r', enc);
+ str_buf_cat2(result, "\\r");
}
else if (c == '\t') {
- prefix_escape(result, 't', enc);
+ str_buf_cat2(result, "\\t");
}
else if (c == '\f') {
- prefix_escape(result, 'f', enc);
+ str_buf_cat2(result, "\\f");
}
else if (c == '\013') {
- prefix_escape(result, 'v', enc);
+ str_buf_cat2(result, "\\v");
}
else if (c == '\010') {
- prefix_escape(result, 'b', enc);
+ str_buf_cat2(result, "\\b");
}
else if (c == '\007') {
- prefix_escape(result, 'a', enc);
+ str_buf_cat2(result, "\\a");
}
else if (c == 033) {
- prefix_escape(result, 'e', enc);
+ str_buf_cat2(result, "\\e");
}
- else if (rb_enc_isprint(c, enc)) {
- rb_enc_str_buf_cat(result, p-n, n, enc);
+ else if ((enc == resenc && rb_enc_isprint(c, enc)) || rb_enc_isascii(c, enc)) {
+ str_buf_cat(result, p-n, n);
}
else {
- char buf[5];
- char *s;
char *q;
-
escape_codepoint:
for (q = p-n; q < p; q++) {
- s = buf;
- sprintf(buf, "\\x%02X", *q & 0377);
- while (*s) {
- str_cat_char(result, *s++, enc);
- }
- }
+#define BACKESC_BUFSIZE 5
+ char buf[BACKESC_BUFSIZE];
+ sprintf(buf, "\\x%02X", *q & 0377);
+ str_buf_cat(result, buf, BACKESC_BUFSIZE - 1);
+#undef BACKESC_BUFSIZE
+ }
}
}
- str_cat_char(result, '"', enc);
+ str_buf_cat2(result, "\"");
OBJ_INFECT(result, str);
return result;
----------------------------------------
http://redmine.ruby-lang.org