カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
ふと思い立って影舞の CVS HEAD を 1.9.0 で動作するようにコード修正しています。
現在の進捗は testall.rb が 167 tests, 251 assertions, 17 failures, 17 errors
$stdout.binmode すると erb のコードを eval したときに transcoding not supported (from EUC-JP to ASCII-8BIT) と言われる罠に長らくはまってました。他にも影舞はメール周りで日本語処理しているので、m17n の影響が大きいですね。
167 tests, 313 assertions, 30 failures, 0 errors
まで進みました。残りは fold とメール周りですね。
以下で再現しました。この挙動が正しいのかそうでないのかは不明。。。
$ ruby19 -v -e 'p "".force_encoding("euc-jp")'
ruby 1.9.0 (2007-12-25 revision 0) [i686-linux]
""
$ ruby19 -v -e 'STDOUT.binmode; p "".force_encoding("euc-jp")'
ruby 1.9.0 (2007-12-25 revision 0) [i686-linux]
-e:1:in `encode': transcoding not supported (from EUC-JP to ASCII-8BIT) (ArgumentError)
from -e:1:in `write'
from -e:1:in `p'
from -e:1:in `'
影舞の XMLMessageScanner が parse 後になぜか落ちるので辿っていったところ、XMLMessageScanner が継承している XMLScanner の PrivateArray が inspect メソッドを private にしていたからと判明。これは処理系の問題ですね。
$ ruby18 -v -e 'class A; private :inspect; end; A.new.inspect'
ruby 1.8.6 (2007-12-03 patchlevel 113) [i686-linux]
-e:1: private method `inspect' called for #<A:0xb7c92cc0> (NoMethodError)
$ ruby19 -v -e 'class A; private :inspect; end; A.new.inspect'
ruby 1.9.0 (2007-12-25 revision 0) [i686-linux]
-e:1:in `<main>'<dummy toplevel>:17: [BUG] unsupported: vm_call0(NODE_ZSUPER)
ruby 1.9.0 (2007-12-25 revision 0) [i686-linux]
-- control frame ----------
c:0004 p:---- s:0008 b:0008 l:000007 d:000007 CFUNC :to_str
c:0003 p:---- s:0006 b:0006 l:000005 d:000005 CFUNC :to_s
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 CFUNC :message
c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP <dummy toplevel>:17
---------------------------
DBG> : ":0:in `to_s'"
DBG> : ":0:in `message'"
-- backtrace of native function call (Use addr2line) --
0xb7f6163d
-------------------------------------------------------
アボートしました
これも xmlscan で発症。説明が難しいのですが、親クラスから継承したメソッドを private にし、さらに alias をして、かつ再定義をすると alias した新しい名前で呼べなくなります。コードだと以下の通り。
class Parent
def foo
puts 'parent foo'
end
end
class Child < Parent
private :foo
alias orig_foo foo
def bar
orig_foo
end
def foo
puts 'child foo'
end
end
Child.new.bar
実行結果。
$ ruby18 -v 1.rb
ruby 1.8.6 (2007-12-03 patchlevel 113) [i686-linux]
parent foo
$ ruby19 -v 1.rb
ruby 1.9.0 (2007-12-25 revision 0) [i686-linux]
1.rb:11:in `bar': undefined local variable or method `orig_foo' for #<Child:0xb7ae0800> (NameError)
from 1.rb:18:in `<main>'
あんまり private とか public とかを気にしないので、自分のコードだったら発見できなかったですねえ。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).