Bug #8602
closedREXML::Element#add_text and REXML::Text#<<
Description
以下のコードは "foo bar" が出力されることが期待されますが実際には "foo" が出力されます。
require 'rexml/document'
doc = REXML::Document.new("")
doc.root.add_text("foo")
doc.to_s
doc.root.add_text(" bar")
p doc.root.to_s
doc.to_s の部分をコメントアウトすると挙動が変わり "foo bar" が出力されます。
REXML::Element#add_text が呼び出している REXML::Text#<< が内部状態(@string)を変化させているにもかかわらず
キャッシュ(@normalized, @unnormalized)をクリアしていないのが原因だと思われます。
添付したパッチで修正されると思います。
Files
Updated by kou (Kouhei Sutou) over 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r41819.
Ippei, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- lib/rexml/text.rb (REXML::Text#<<): Support appending in not
"raw" mode. [Bug #8602] [ruby-dev:47482]
Reported by Ippei Obayashi. Thanks!!! - test/rexml/test_text.rb (TextTester#test_shift_operator_cache):
Add a test for the above case.
Updated by kou (Kouhei Sutou) over 11 years ago
- Assignee set to kou (Kouhei Sutou)
Text#<<のドキュメントを読むと、rawモードのときだけサポートしているようにみえました。
rawモードだと@normalize/@unnormalizeを使わないので、ここでこれらをクリアーしていないのは意図的だったのだろうと思います。
ただ、キャッシュをクリアーすることによりrawモードでもrawモードでなくても動くようになるので、キャッシュをクリアーすることにしました!
報告ありがとうございました!