[ruby-dev:31833] Re: trunk で現状セルフビルドができません

From: Nobuyoshi Nakada <nobu@...>
Date: 2007-09-24 01:21:57 UTC
List: ruby-dev #31833
なかだです。

At Mon, 24 Sep 2007 01:54:54 +0900,
きむらこういち wrote in [ruby-dev:31831]:
> 直接の原因は erb.rb の 412行目で渡しているのがStringオブジェクトではなく
> StrincScannerのオブジェクトで、そのために上記の修正で行われているチェック
> から漏れてしまうためです。

erb自体はStringを渡しているものの、StringScanner#initializeの中
で、渡されたStringのencodingをStringScanner自身にコピーしておこ
うとするところで弾かれているようです。

この場合は保存されているstrのencodingを使えばいいのではないかと
思います。

> StringScannerはStringの子孫でもないのでこのチェックではじかれるわけですが
> どのようにすべきなのでしょうか?

どうしたもんでしょうねぇ。任意のクラスがencodingを持てる必要があ
るかどうか、がよくわからないんですが。


Index: ext/strscan/strscan.c
===================================================================
--- ext/strscan/strscan.c	(revision 13494)
+++ ext/strscan/strscan.c	(working copy)
@@ -191,5 +191,4 @@ strscan_initialize(int argc, VALUE *argv
     StringValue(str);
     p->str = str;
-    rb_enc_associate(self, rb_enc_get(str));
 
     return self;
@@ -655,5 +654,4 @@ strscan_getch(VALUE self)
     struct strscanner *p;
     long len;
-    rb_encoding *enc = rb_enc_get(self);
 
     GET_SCANNER(self, p);
@@ -662,5 +660,5 @@ strscan_getch(VALUE self)
         return Qnil;
 
-    len = rb_enc_mbclen(CURPTR(p), S_PEND(p), enc);
+    len = rb_enc_mbclen(CURPTR(p), S_PEND(p), rb_enc_get(p->str));
     if (p->curr + len > S_LEN(p)) {
         len = S_LEN(p) - p->curr;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread