<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-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-GB link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span 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 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 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 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 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 style='color:#1F497D'>Pete<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 lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US 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><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span lang=EN-US 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 lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US 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 lang=EN-US style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

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

<p class=MsoNormal><span lang=EN-US 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 lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US 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><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span 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 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 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 style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span 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 style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span 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 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 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 style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span 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 style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

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

<p class=MsoNormal><span style='color:#1F497D'><br>
Pete<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'><o:p>&nbsp;</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 lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US 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><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText><span lang=EN-US>tfpt review /shelveset:MutableString5;REDMOND\tomat<o:p></o:p></span></p>

<p class=MsoPlainText><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

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

<p class=MsoNormal><span lang=EN-US>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></span></p>

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

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

<p class=MsoNormal><span lang=EN-US>Basic architecture:<o:p></o:p></span></p>

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

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

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span lang=EN-US><span
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-US>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></span></p>

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span lang=EN-US><span
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-US>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></span></p>

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

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

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

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

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

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

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

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

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

<p class=MsoListParagraph style='margin-left:.75in;text-indent:-.25in;
mso-list:l0 level1 lfo4'><![if !supportLists]><span lang=EN-US><span
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><![endif]><span lang=EN-US>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></span></p>

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

<p class=MsoNormal><span lang=EN-US>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></span></p>

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

<p class=MsoNormal><span lang=EN-US>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></span></p>

<p class=MsoPlainText><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoPlainText><span lang=EN-US>Tomas<o:p></o:p></span></p>

</div>

</body>

</html>