<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle24
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
 /* List Definitions */
 @list l0
        {mso-list-id:35008771;
        mso-list-type:hybrid;
        mso-list-template-ids:1977645808 -665004770 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:.75in;
        text-indent:-.25in;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1
        {mso-list-id:883256888;
        mso-list-type:hybrid;
        mso-list-template-ids:656583422 67698705 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='color:#1F497D'>I thought about that, but given
that there are like 15 overloads for Append it might be an unnecessary code
duplication to add them for constructors as well.<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>You can do it on a single line
too:<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='font-size:8.0pt;font-family:"Courier New";
color:#2B91AF'>MutableString</span><span lang=EN-GB style='font-size:8.0pt;
font-family:"Courier New"'> str = <span style='color:#2B91AF'>MutableString</span>.CreateBinary(received).Append(buffer,
0, received);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='font-size:8.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Append returns the MutableString
instance back and you can also specify estimated capacity to CreateBinary if
you know it.<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Let&#8217;s use this for now and
if the patter is very often let&#8217;s consider adding more overloads.<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Tomas<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> ironruby-core-bounces@rubyforge.org
[mailto:ironruby-core-bounces@rubyforge.org] <b>On Behalf Of </b>Peter Bacon
Darwin<br>
<b>Sent:</b> Sunday, May 11, 2008 5:23 AM<br>
<b>To:</b> ironruby-core@rubyforge.org<br>
<b>Subject:</b> Re: [Ironruby-core] Code Review: MutableString5<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>One thing that
MutableString could do with is <o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-GB
style='font-size:8.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style='color:blue'>public</span> <span style='color:blue'>static</span> <span
style='color:#2B91AF'>MutableString</span><span style='color:green'>/*!*/</span>
CreateBinary(<span style='color:blue'>byte</span>[]<span style='color:green'>/*!*/</span>
bytes, <span style='color:blue'>int</span> start, <span style='color:blue'>int</span>
length) {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>At the moment you
have to do something like:<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-GB
style='font-size:8.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;<span style='color:#2B91AF'>MutableString</span> str = <span
style='color:#2B91AF'>MutableString</span>.CreateBinary();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-GB
style='font-size:8.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
str.Append(buffer, 0, received);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>Pete<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ironruby-core-bounces@rubyforge.org
[mailto:ironruby-core-bounces@rubyforge.org] <b>On Behalf Of </b>Tomas Matousek<br>
<b>Sent:</b> Saturday,10 May 10, 2008 22:42<br>
<b>To:</b> ironruby-core@rubyforge.org<br>
<b>Subject:</b> Re: [Ironruby-core] Code Review: MutableString5<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><span lang=EN-GB><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>$KCODE is orthogonal to the
encoding in MutableString. $KCODE seems to be just a value that is used by some
library methods that perform binary operations on textual data.
MutableString.Encoding is encoding of the representation. If a MutableString
instance is created from .NET string an encoding that is associated with it is
used whenever the string is consumed by a binary data operation. We could
represent all strings as byte[], but then you&#8217;d need to convert .NET
strings to byte[] at the construction time. MutableString allows you to be lazy
and perhaps not perform the conversion at all if not needed.<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Could you give some code sample
that you think could be broken? <o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Tomas<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ironruby-core-bounces@rubyforge.org
[mailto:ironruby-core-bounces@rubyforge.org] <b>On Behalf Of </b>Peter Bacon
Darwin<br>
<b>Sent:</b> Saturday, May 10, 2008 2:27 AM<br>
<b>To:</b> ironruby-core@rubyforge.org<br>
<b>Subject:</b> Re: [Ironruby-core] Code Review: MutableString5<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>This is a big old
diff to search through.&nbsp; I couldn&#8217;t work out a way of easily
patching it onto my source at home due to the folder differences.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>I really like this
hybrid idea and it looks like it will work well.&nbsp; I have one question with
regards to encodings and KCODE.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>I appreciate that
String is changing between Ruby 1.8 and 1.9.&nbsp; It appears that this
MutableString implementation is leaning more toward the 1.9 implementation
(i.e. holding on to an Encoding within the String itself).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>1.8 does hold the
encoding and as I understand it the implicit encoding of the bytes held in a
String is driven off KCODE.&nbsp; Is that correct?&nbsp; If so you have a
number of scenarios which I think could cause problems with MutableString
holding on to its own Encoding, which stem from times when KCODE is changed at
runtime.&nbsp; I&#8217;ll try to describe a concrete example and you can tell
me where I am going wrong...<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>Assume that KCODE is
set to UTF8.&nbsp; If you create a String from an array of bytes in Ruby, the
bytes are just stored as-is.&nbsp; You can do stuff which is encoding dependent
and UTF8 is assumed.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>If you now change
KCODE to say EUC, then the bytes in the String are unchanged but now encoding
dependent operations will possibly produce different results on the same string
since they interpret the bytes differently.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>The worry I have with
MutableString, is that if you create a string from bytes but then do an
operation that requires it to be converted to a CLR string internally.&nbsp;
What happens when you change KCODE?&nbsp; You can&#8217;t simply change the
Encoding value of the MutableString, since if you then access the bytes you
will not get the same bytes back as were originally put in.&nbsp; I suppose, on
changing KCODE, you could go through all the strings in memory, which have been
converted from binary to CLR strings, and convert them (i.e. back to bytes via
the old encoding and then to CLR strings via the new encoding).&nbsp; What
would be the optimal solution in this case?<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>Again, I am not
talking from a position of deep knowledge here so I may be missing something
really obvious.&nbsp; But I thought it was worth asking the question.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'>Regards,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><br>
Pete<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-GB style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ironruby-core-bounces@rubyforge.org
[mailto:ironruby-core-bounces@rubyforge.org] <b>On Behalf Of </b>Tomas Matousek<br>
<b>Sent:</b> Friday,09 May 09, 2008 19:08<br>
<b>To:</b> IronRuby External Code Reviewers<br>
<b>Cc:</b> ironruby-core@rubyforge.org<br>
<b>Subject:</b> [Ironruby-core] Code Review: MutableString5<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><span lang=EN-GB><o:p>&nbsp;</o:p></span></p>

<p class=MsoPlainText>tfpt review /shelveset:MutableString5;REDMOND\tomat<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>A new implementation for Ruby MutableString and Ruby regular
expression wrappers.<o:p></o:p></p>

<p class=MsoNormal>This is just the first pass, w/o optimizations and w/o
encodings (Default system encoding is used for all strings). <o:p></o:p></p>

<p class=MsoNormal>Many improvements and adjustments will come in future, some
hacks will be removed.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Basic architecture:<o:p></o:p></p>

<p class=MsoNormal>MutableString holds on Content and Encoding. Content is an
abstract class that has three subclasses:<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l1 level1 lfo2'><![if !supportLists]><span
style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>StringContent<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>Holds on an instance of System.String &#8211; an
immutable .NET string. This is the default representation for strings coming
from CLR methods and for Ruby string literals. <o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>A textual write operation on the mutable string that
has this content representation will cause implicit conversion of the
representation to StringBuilderContent. <o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>A binary read/write operation triggers a transition to
BinaryContent using the Encoding stored on the owning MutableString.<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in'><o:p>&nbsp;</o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l1 level1 lfo2'><![if !supportLists]><span
style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>StringBuilderContent<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>Holds on an instance of System.Text.StringBuilder
&#8211; a mutable Unicode string. <o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>A binary read/write operation transforms the content to
BinaryContent representation.<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>StringBuilder is not optimal for some operations
(requires unnecessary copying), we may consider to replace it with resizable
char[].<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l1 level1 lfo2'><![if !supportLists]><span
style='mso-list:Ignore'>3)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>BinaryContent<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>A textual read/write operation transforms the content
to StringBuilderContent representation.<o:p></o:p></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span style='mso-list:Ignore'>-<span
style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>List&lt;byte&gt; is currently used, but it
doesn&#8217;t fit many operations very well. We should replace it by resizable
byte[].<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>The content representation is changed based upon operations
that are performed on the mutable string. There is currently no limit on number
of content type switches, so if one alternates binary and textual operations
the conversion will take place for each one of them. Although this
shouldn&#8217;t be a common case we may consider to add some counters and keep
the representation binary/textual based upon their values. <o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>The design assumes that the nature of operations implemented
by library methods is of two kinds: textual and binary. And that data that are
once treated as text are not usually treated as raw binary data later. Any text
in the IronRuby runtime is represented as a sequence of 16bit Unicode
characters (standard .NET representation). Each binary data treated as text is
converted to this representation, regardless of the encoding used for storage
representation in the file. The encoding is remembered in the MutableString
instance and the original representation could be always recreated. Not all
Unicode characters fit into 16 bits, therefore some exotic ones are represented
by multiple characters (surrogates). If there is such a character in the
string, some operations (e.g. indexing) might not be precise anymore &#8211;
the n-th item in the char[] isn&#8217;t the n-th Unicode character in the
string (there might be escape characters). We believe this impreciseness is not
a real world issue and is worth performance gain and implementation simplicity.
<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>Tomas<o:p></o:p></p>

</div>

</body>

</html>