<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>72317</bug_id>
          
          <creation_ts>2011-11-14 15:16:11 -0800</creation_ts>
          <short_desc>Towards 8 bit strings - Add 8 bit handling to JSString Ropes</short_desc>
          <delta_ts>2011-11-15 18:22:15 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>71337</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Michael Saboff">msaboff</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>502368</commentid>
    <comment_count>0</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-11-14 15:16:11 -0800</bug_when>
    <thetext>The current JSString rope implementation only handles 16 bit strings.  It will up convert 8 bit string to 16 bit when the rope is resolved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502374</commentid>
    <comment_count>1</comment_count>
      <attachid>115042</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-11-14 15:21:23 -0800</bug_when>
    <thetext>Created attachment 115042
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502385</commentid>
    <comment_count>2</comment_count>
      <attachid>115042</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-11-14 15:32:40 -0800</bug_when>
    <thetext>Comment on attachment 115042
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=115042&amp;action=review

&gt; Source/JavaScriptCore/runtime/JSString.cpp:118
&gt; -// Overview: this methods converts a JSString from holding a string in rope form
&gt; +// Overview: These methods converts a JSString from holding a string in rope form

Should say “These functions convert” rather than “These methods converts”.

&gt; Source/JavaScriptCore/runtime/JSString.h:130
&gt; +            m_is8Bit = m_value.impl()-&gt;is8Bit() ? 1 : 0;

Should not need the ? 1 : 0 here.

&gt; Source/JavaScriptCore/runtime/JSString.h:138
&gt; +            m_is8Bit = m_value.impl()-&gt;is8Bit() ? 1 : 0;

Should not need the ? 1 : 0 here.

&gt; Source/JavaScriptCore/runtime/JSString.h:146
&gt; +            m_is8Bit = (s1-&gt;is8Bit() &amp;&amp; s2-&gt;is8Bit()) ? 1 : 0;

Should not need the ? 1 : 0 here.

&gt; Source/JavaScriptCore/runtime/JSString.h:155
&gt; +            m_is8Bit = (s1-&gt;is8Bit() &amp;&amp; s2-&gt;is8Bit() &amp;&amp;  s3-&gt;is8Bit()) ? 1 : 0;

Should not need the ? 1 : 0 here.

&gt; Source/JavaScriptCore/runtime/JSString.h:252
&gt; -        void resolveRopeSlowCase(ExecState*, UChar*) const;
&gt; +        void resolveRopeSlowCase8(ExecState*, LChar*) const;
&gt; +        void resolveRopeSlowCase16(ExecState*, UChar*) const;

I suggest we just use take advantage of overloading here rather than putting 8/16 in the function names.

&gt; Source/JavaScriptCore/runtime/JSString.h:264
&gt; +        unsigned m_is8Bit : 1;

This should be bool rather than unsigned. We can’t use signed types for bit fields because of compiler differences, but we can and should use bool.

&gt; Source/JavaScriptCore/runtime/JSString.h:270
&gt; +        ALWAYS_INLINE bool is8Bit() const { return m_is8Bit; }

I don’t think we really need ALWAYS_INLINE here. Did you find this wasn’t getting inlined?

&gt; Source/JavaScriptCore/runtime/JSString.h:377
&gt; +        ASSERT(offset &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; +        ASSERT(length &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; +        ASSERT(offset + length &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; +        if (!length)
&gt; +            return globalData-&gt;smallStrings.emptyString(globalData);
&gt; +        if (length == 1) {
&gt; +            UChar c = s[offset];
&gt; +            if (c &lt;= maxSingleCharacterString)
&gt; +                return globalData-&gt;smallStrings.singleCharacterString(globalData, c);
&gt; +        }

None of this code is 8/16 bit specific. Is there some easy way to share this part instead of having it copied and pasted twice?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502404</commentid>
    <comment_count>3</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-11-14 15:49:07 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 115042 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=115042&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.cpp:118
&gt; &gt; -// Overview: this methods converts a JSString from holding a string in rope form
&gt; &gt; +// Overview: These methods converts a JSString from holding a string in rope form
&gt; 
&gt; Should say “These functions convert” rather than “These methods converts”.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:130
&gt; &gt; +            m_is8Bit = m_value.impl()-&gt;is8Bit() ? 1 : 0;
&gt; 
&gt; Should not need the ? 1 : 0 here.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:138
&gt; &gt; +            m_is8Bit = m_value.impl()-&gt;is8Bit() ? 1 : 0;
&gt; 
&gt; Should not need the ? 1 : 0 here.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:146
&gt; &gt; +            m_is8Bit = (s1-&gt;is8Bit() &amp;&amp; s2-&gt;is8Bit()) ? 1 : 0;
&gt; 
&gt; Should not need the ? 1 : 0 here.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:155
&gt; &gt; +            m_is8Bit = (s1-&gt;is8Bit() &amp;&amp; s2-&gt;is8Bit() &amp;&amp;  s3-&gt;is8Bit()) ? 1 : 0;
&gt; 
&gt; Should not need the ? 1 : 0 here.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:252
&gt; &gt; -        void resolveRopeSlowCase(ExecState*, UChar*) const;
&gt; &gt; +        void resolveRopeSlowCase8(ExecState*, LChar*) const;
&gt; &gt; +        void resolveRopeSlowCase16(ExecState*, UChar*) const;
&gt; 
&gt; I suggest we just use take advantage of overloading here rather than putting 8/16 in the function names.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:264
&gt; &gt; +        unsigned m_is8Bit : 1;
&gt; 
&gt; This should be bool rather than unsigned. We can’t use signed types for bit fields because of compiler differences, but we can and should use bool.
&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:270
&gt; &gt; +        ALWAYS_INLINE bool is8Bit() const { return m_is8Bit; }
&gt; 
&gt; I don’t think we really need ALWAYS_INLINE here. Did you find this wasn’t getting inlined?

Made changes as suggested to the above suggestions.

&gt; &gt; Source/JavaScriptCore/runtime/JSString.h:377
&gt; &gt; +        ASSERT(offset &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; &gt; +        ASSERT(length &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; &gt; +        ASSERT(offset + length &lt;= static_cast&lt;unsigned&gt;(s.length()));
&gt; &gt; +        if (!length)
&gt; &gt; +            return globalData-&gt;smallStrings.emptyString(globalData);
&gt; &gt; +        if (length == 1) {
&gt; &gt; +            UChar c = s[offset];
&gt; &gt; +            if (c &lt;= maxSingleCharacterString)
&gt; &gt; +                return globalData-&gt;smallStrings.singleCharacterString(globalData, c);
&gt; &gt; +        }
&gt; 
&gt; None of this code is 8/16 bit specific. Is there some easy way to share this part instead of having it copied and pasted twice?

Removed this change from this patch.  Will address it in an upcoming patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>502407</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2011-11-14 15:51:24 -0800</bug_when>
    <thetext>Committed r100202: &lt;http://trac.webkit.org/changeset/100202&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>115042</attachid>
            <date>2011-11-14 15:21:23 -0800</date>
            <delta_ts>2011-11-14 15:32:40 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>72317.patch</filename>
            <type>text/plain</type>
            <size>11042</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTAwMjAwKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBA
CisyMDExLTExLTE0ICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIFRvd2FyZHMgOCBiaXQgc3RyaW5ncyAtIEFkZCA4IGJpdCBoYW5kbGluZyB0byBKU1N0cmlu
ZyBSb3BlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzIzMTcKKworICAgICAgICBBZGRlZCBiaXQgdG8gdHJhY2sgdGhhdCBhIHJvcGUgaXMgbWFkZSB1
cCBvZiBhbGwgOCBiaXQgZmliZXJzLgorICAgICAgICBDcmVhdGVkIGFuIDggYml0IHBhdGggKGZh
c3QgYW5kIHNsb3cgY2FzZXMpIHRvIGhhbmRsZSA4IGJpdCAKKyAgICAgICAgb25seSByb3Blcy4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHJ1bnRp
bWUvSlNTdHJpbmcuY3BwOgorICAgICAgICAoSlNDOjpKU1N0cmluZzo6cmVzb2x2ZVJvcGUpOgor
ICAgICAgICAoSlNDOjpKU1N0cmluZzo6cmVzb2x2ZVJvcGVTbG93Q2FzZTgpOgorICAgICAgICAo
SlNDOjpKU1N0cmluZzo6cmVzb2x2ZVJvcGVTbG93Q2FzZTE2KToKKyAgICAgICAgKiBydW50aW1l
L0pTU3RyaW5nLmg6CisgICAgICAgIChKU0M6OlJvcGVCdWlsZGVyOjpmaW5pc2hDcmVhdGlvbik6
CisgICAgICAgIChKU0M6OlJvcGVCdWlsZGVyOjppczhCaXQpOgorICAgICAgICAoSlNDOjpqc1N1
YnN0cmluZzgpOgorCiAyMDExLTExLTE0ICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5j
b20+CiAKICAgICAgICAgQSBsaXR0bGUgYml0IG9mIGZ1bmN0aW9uIGNhbGwgY2xlYW51cApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmNwcAkocmV2aXNpb24g
MTAwMTk0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC02Miw2ICs2MiwzNCBAQCB2b2lkIEpTU3RyaW5nOjpyZXNvbHZlUm9w
ZShFeGVjU3RhdGUqIGV4CiB7CiAgICAgQVNTRVJUKGlzUm9wZSgpKTsKIAorICAgIGlmIChpczhC
aXQoKSkgeworICAgICAgICBMQ2hhciogYnVmZmVyOworICAgICAgICBpZiAoUGFzc1JlZlB0cjxT
dHJpbmdJbXBsPiBuZXdJbXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZCht
X2xlbmd0aCwgYnVmZmVyKSkKKyAgICAgICAgICAgIG1fdmFsdWUgPSBuZXdJbXBsOworICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgIG91dE9mTWVtb3J5KGV4ZWMpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX21heElu
dGVybmFsUm9wZUxlbmd0aCAmJiBtX2ZpYmVyc1tpXTsgKytpKSB7CisgICAgICAgICAgICBpZiAo
bV9maWJlcnNbaV0tPmlzUm9wZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUm9w
ZVNsb3dDYXNlOChleGVjLCBidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgTENoYXIqIHBv
c2l0aW9uID0gYnVmZmVyOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNfbWF4SW50
ZXJuYWxSb3BlTGVuZ3RoICYmIG1fZmliZXJzW2ldOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmlu
Z0ltcGwqIHN0cmluZyA9IG1fZmliZXJzW2ldLT5tX3ZhbHVlLmltcGwoKTsKKyAgICAgICAgICAg
IHVuc2lnbmVkIGxlbmd0aCA9IHN0cmluZy0+bGVuZ3RoKCk7CisgICAgICAgICAgICBTdHJpbmdJ
bXBsOjpjb3B5Q2hhcnMocG9zaXRpb24sIHN0cmluZy0+Y2hhcmFjdGVyczgoKSwgbGVuZ3RoKTsK
KyAgICAgICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKKyAgICAgICAgICAgIG1fZmliZXJzW2ld
LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUKChidWZmZXIgKyBtX2xlbmd0aCkg
PT0gcG9zaXRpb24pOworICAgICAgICBBU1NFUlQoIWlzUm9wZSgpKTsKKworICAgICAgICByZXR1
cm47CisgICAgfQorCiAgICAgVUNoYXIqIGJ1ZmZlcjsKICAgICBpZiAoUGFzc1JlZlB0cjxTdHJp
bmdJbXBsPiBuZXdJbXBsID0gU3RyaW5nSW1wbDo6dHJ5Q3JlYXRlVW5pbml0aWFsaXplZChtX2xl
bmd0aCwgYnVmZmVyKSkKICAgICAgICAgbV92YWx1ZSA9IG5ld0ltcGw7CkBAIC03MiwxNCArMTAw
LDE0IEBAIHZvaWQgSlNTdHJpbmc6OnJlc29sdmVSb3BlKEV4ZWNTdGF0ZSogZXgKIAogICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgc19tYXhJbnRlcm5hbFJvcGVMZW5ndGggJiYgbV9maWJlcnNb
aV07ICsraSkgewogICAgICAgICBpZiAobV9maWJlcnNbaV0tPmlzUm9wZSgpKQotICAgICAgICAg
ICAgcmV0dXJuIHJlc29sdmVSb3BlU2xvd0Nhc2UoZXhlYywgYnVmZmVyKTsKKyAgICAgICAgICAg
IHJldHVybiByZXNvbHZlUm9wZVNsb3dDYXNlMTYoZXhlYywgYnVmZmVyKTsKICAgICB9CiAKICAg
ICBVQ2hhciogcG9zaXRpb24gPSBidWZmZXI7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
X21heEludGVybmFsUm9wZUxlbmd0aCAmJiBtX2ZpYmVyc1tpXTsgKytpKSB7CiAgICAgICAgIFN0
cmluZ0ltcGwqIHN0cmluZyA9IG1fZmliZXJzW2ldLT5tX3ZhbHVlLmltcGwoKTsKICAgICAgICAg
dW5zaWduZWQgbGVuZ3RoID0gc3RyaW5nLT5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nSW1wbDo6
Y29weUNoYXJzKHBvc2l0aW9uLCBzdHJpbmctPmNoYXJhY3RlcnMxNigpLCBsZW5ndGgpOworICAg
ICAgICBTdHJpbmdJbXBsOjpjb3B5Q2hhcnMocG9zaXRpb24sIHN0cmluZy0+Y2hhcmFjdGVycygp
LCBsZW5ndGgpOwogICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CiAgICAgICAgIG1fZmliZXJz
W2ldLmNsZWFyKCk7CiAgICAgfQpAQCAtODcsNyArMTE1LDcgQEAgdm9pZCBKU1N0cmluZzo6cmVz
b2x2ZVJvcGUoRXhlY1N0YXRlKiBleAogICAgIEFTU0VSVCghaXNSb3BlKCkpOwogfQogCi0vLyBP
dmVydmlldzogdGhpcyBtZXRob2RzIGNvbnZlcnRzIGEgSlNTdHJpbmcgZnJvbSBob2xkaW5nIGEg
c3RyaW5nIGluIHJvcGUgZm9ybQorLy8gT3ZlcnZpZXc6IFRoZXNlIG1ldGhvZHMgY29udmVydHMg
YSBKU1N0cmluZyBmcm9tIGhvbGRpbmcgYSBzdHJpbmcgaW4gcm9wZSBmb3JtCiAvLyBkb3duIHRv
IGEgc2ltcGxlIFVTdHJpbmcgcmVwcmVzZW50YXRpb24uICBJdCBkb2VzIHNvIGJ5IGJ1aWxkaW5n
IHVwIHRoZSBzdHJpbmcKIC8vIGJhY2t3YXJkcywgc2luY2Ugd2Ugd2FudCB0byBhdm9pZCByZWN1
cnNpb24sIHdlIGV4cGVjdCB0aGF0IHRoZSB0cmVlIHN0cnVjdHVyZQogLy8gcmVwcmVzZW50aW5n
IHRoZSByb3BlIGlzIGxpa2VseSBpbWJhbGFuY2VkIHdpdGggbW9yZSBub2RlcyBkb3duIHRoZSBs
ZWZ0IHNpZGUKQEAgLTk3LDExICsxMjUsMTEgQEAgdm9pZCBKU1N0cmluZzo6cmVzb2x2ZVJvcGUo
RXhlY1N0YXRlKiBleAogLy8gVmVjdG9yIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBjb25jYXRlbmF0
aW9uLCBidXQgYnkgd29ya2luZyBiYWNrd2FyZHMgd2UgbGlrZWx5CiAvLyBvbmx5IGZpbGwgdGhl
IHF1ZXVlIHdpdGggdGhlIG51bWJlciBvZiBzdWJzdHJpbmdzIGF0IGFueSBnaXZlbiBsZXZlbCBp
biBhCiAvLyByb3BlLW9mLXJvcGVzLikgICAgCi12b2lkIEpTU3RyaW5nOjpyZXNvbHZlUm9wZVNs
b3dDYXNlKEV4ZWNTdGF0ZSogZXhlYywgVUNoYXIqIGJ1ZmZlcikgY29uc3QKK3ZvaWQgSlNTdHJp
bmc6OnJlc29sdmVSb3BlU2xvd0Nhc2U4KEV4ZWNTdGF0ZSogZXhlYywgTENoYXIqIGJ1ZmZlcikg
Y29uc3QKIHsKICAgICBVTlVTRURfUEFSQU0oZXhlYyk7CiAKLSAgICBVQ2hhciogcG9zaXRpb24g
PSBidWZmZXIgKyBtX2xlbmd0aDsgLy8gV2Ugd2lsbCBiZSB3b3JraW5nIGJhY2t3YXJkcyBvdmVy
IHRoZSByb3BlLgorICAgIExDaGFyKiBwb3NpdGlvbiA9IGJ1ZmZlciArIG1fbGVuZ3RoOyAvLyBX
ZSB3aWxsIGJlIHdvcmtpbmcgYmFja3dhcmRzIG92ZXIgdGhlIHJvcGUuCiAgICAgVmVjdG9yPEpT
U3RyaW5nKiwgMzI+IHdvcmtRdWV1ZTsgLy8gUHV0dGluZyBzdHJpbmdzIGludG8gYSBWZWN0b3Ig
aXMgb25seSBPSyBiZWNhdXNlIHRoZXJlIGFyZSBubyBHQyBwb2ludHMgaW4gdGhpcyBtZXRob2Qu
CiAgICAgCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX21heEludGVybmFsUm9wZUxlbmd0
aCAmJiBtX2ZpYmVyc1tpXTsgKytpKSB7CkBAIC0xMjMsNyArMTUxLDM3IEBAIHZvaWQgSlNTdHJp
bmc6OnJlc29sdmVSb3BlU2xvd0Nhc2UoRXhlY1MKICAgICAgICAgU3RyaW5nSW1wbCogc3RyaW5n
ID0gc3RhdGljX2Nhc3Q8U3RyaW5nSW1wbCo+KGN1cnJlbnRGaWJlci0+bV92YWx1ZS5pbXBsKCkp
OwogICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJpbmctPmxlbmd0aCgpOwogICAgICAgICBw
b3NpdGlvbiAtPSBsZW5ndGg7Ci0gICAgICAgIFN0cmluZ0ltcGw6OmNvcHlDaGFycyhwb3NpdGlv
biwgc3RyaW5nLT5jaGFyYWN0ZXJzMTYoKSwgbGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nSW1wbDo6
Y29weUNoYXJzKHBvc2l0aW9uLCBzdHJpbmctPmNoYXJhY3RlcnM4KCksIGxlbmd0aCk7CisgICAg
fQorCisgICAgQVNTRVJUKGJ1ZmZlciA9PSBwb3NpdGlvbik7CisgICAgQVNTRVJUKCFpc1JvcGUo
KSk7Cit9CisKK3ZvaWQgSlNTdHJpbmc6OnJlc29sdmVSb3BlU2xvd0Nhc2UxNihFeGVjU3RhdGUq
IGV4ZWMsIFVDaGFyKiBidWZmZXIpIGNvbnN0Cit7CisgICAgVU5VU0VEX1BBUkFNKGV4ZWMpOwor
CisgICAgVUNoYXIqIHBvc2l0aW9uID0gYnVmZmVyICsgbV9sZW5ndGg7IC8vIFdlIHdpbGwgYmUg
d29ya2luZyBiYWNrd2FyZHMgb3ZlciB0aGUgcm9wZS4KKyAgICBWZWN0b3I8SlNTdHJpbmcqLCAz
Mj4gd29ya1F1ZXVlOyAvLyBUaGVzZSBzdHJpbmdzIGFyZSBrZXB0IGFsaXZlIGJ5IHRoZSBwYXJl
bnQgcm9wZSwgc28gdXNpbmcgYSBWZWN0b3IgaXMgT0suCisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoICYmIG1fZmliZXJzW2ldOyArK2kpCisgICAg
ICAgIHdvcmtRdWV1ZS5hcHBlbmQobV9maWJlcnNbaV0uZ2V0KCkpOworCisgICAgd2hpbGUgKCF3
b3JrUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIEpTU3RyaW5nKiBjdXJyZW50RmliZXIgPSB3
b3JrUXVldWUubGFzdCgpOworICAgICAgICB3b3JrUXVldWUucmVtb3ZlTGFzdCgpOworCisgICAg
ICAgIGlmIChjdXJyZW50RmliZXItPmlzUm9wZSgpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNfbWF4SW50ZXJuYWxSb3BlTGVuZ3RoICYmIGN1cnJlbnRGaWJlci0+bV9m
aWJlcnNbaV07ICsraSkKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUuYXBwZW5kKGN1cnJlbnRG
aWJlci0+bV9maWJlcnNbaV0uZ2V0KCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKworICAgICAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2FzdDxTdHJpbmdJbXBs
Kj4oY3VycmVudEZpYmVyLT5tX3ZhbHVlLmltcGwoKSk7CisgICAgICAgIHVuc2lnbmVkIGxlbmd0
aCA9IHN0cmluZy0+bGVuZ3RoKCk7CisgICAgICAgIHBvc2l0aW9uIC09IGxlbmd0aDsKKyAgICAg
ICAgU3RyaW5nSW1wbDo6Y29weUNoYXJzKHBvc2l0aW9uLCBzdHJpbmctPmNoYXJhY3RlcnMoKSwg
bGVuZ3RoKTsKICAgICB9CiAKICAgICBBU1NFUlQoYnVmZmVyID09IHBvc2l0aW9uKTsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTU3RyaW5nLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuaAkocmV2aXNpb24gMTAwMTk0
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNTdHJpbmcuaAkod29ya2luZyBj
b3B5KQpAQCAtMjIsNyArMjIsNiBAQAogCiAjaWZuZGVmIEpTU3RyaW5nX2gKICNkZWZpbmUgSlNT
dHJpbmdfaAotCiAjaW5jbHVkZSAiQ2FsbEZyYW1lLmgiCiAjaW5jbHVkZSAiQ29tbW9uSWRlbnRp
ZmllcnMuaCIKICNpbmNsdWRlICJJZGVudGlmaWVyLmgiCkBAIC04NSw2ICs4NCw3IEBAIG5hbWVz
cGFjZSBKU0MgewogICAgICAgICAgICAgICAgICAgICBleHBhbmQoKTsKICAgICAgICAgICAgICAg
ICBtX2pzU3RyaW5nLT5tX2ZpYmVyc1ttX2luZGV4KytdLnNldChtX2dsb2JhbERhdGEsIG1fanNT
dHJpbmcsIGpzU3RyaW5nKTsKICAgICAgICAgICAgICAgICBtX2pzU3RyaW5nLT5tX2xlbmd0aCAr
PSBqc1N0cmluZy0+bV9sZW5ndGg7CisgICAgICAgICAgICAgICAgbV9qc1N0cmluZy0+bV9pczhC
aXQgJj0ganNTdHJpbmctPm1faXM4Qml0OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBK
U1N0cmluZyogcmVsZWFzZSgpCkBAIC0xMjcsNiArMTI3LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAg
ICAgICAgICAgICBBU1NFUlQoIW1fdmFsdWUuaXNOdWxsKCkpOwogICAgICAgICAgICAgQmFzZTo6
ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7CiAgICAgICAgICAgICBtX2xlbmd0aCA9IGxlbmd0
aDsKKyAgICAgICAgICAgIG1faXM4Qml0ID0gbV92YWx1ZS5pbXBsKCktPmlzOEJpdCgpID8gMSA6
IDA7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIGZpbmlzaENyZWF0aW9uKEpTR2xvYmFsRGF0
YSYgZ2xvYmFsRGF0YSwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IGNvc3QpCkBAIC0xMzQsNiArMTM1
LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgICAgICBBU1NFUlQoIW1fdmFsdWUuaXNOdWxs
KCkpOwogICAgICAgICAgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7CiAgICAg
ICAgICAgICBtX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgIG1faXM4Qml0ID0gbV92YWx1
ZS5pbXBsKCktPmlzOEJpdCgpID8gMSA6IDA7CiAgICAgICAgICAgICBIZWFwOjpoZWFwKHRoaXMp
LT5yZXBvcnRFeHRyYU1lbW9yeUNvc3QoY29zdCk7CiAgICAgICAgIH0KIApAQCAtMTQxLDYgKzE0
Myw3IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB7CiAgICAgICAgICAgICBCYXNlOjpmaW5p
c2hDcmVhdGlvbihnbG9iYWxEYXRhKTsKICAgICAgICAgICAgIG1fbGVuZ3RoID0gczEtPmxlbmd0
aCgpICsgczItPmxlbmd0aCgpOworICAgICAgICAgICAgbV9pczhCaXQgPSAoczEtPmlzOEJpdCgp
ICYmIHMyLT5pczhCaXQoKSkgPyAxIDogMDsKICAgICAgICAgICAgIG1fZmliZXJzWzBdLnNldChn
bG9iYWxEYXRhLCB0aGlzLCBzMSk7CiAgICAgICAgICAgICBtX2ZpYmVyc1sxXS5zZXQoZ2xvYmFs
RGF0YSwgdGhpcywgczIpOwogICAgICAgICB9CkBAIC0xNDksNiArMTUyLDcgQEAgbmFtZXNwYWNl
IEpTQyB7CiAgICAgICAgIHsKICAgICAgICAgICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKGdsb2Jh
bERhdGEpOwogICAgICAgICAgICAgbV9sZW5ndGggPSBzMS0+bGVuZ3RoKCkgKyBzMi0+bGVuZ3Ro
KCkgKyBzMy0+bGVuZ3RoKCk7CisgICAgICAgICAgICBtX2lzOEJpdCA9IChzMS0+aXM4Qml0KCkg
JiYgczItPmlzOEJpdCgpICYmICBzMy0+aXM4Qml0KCkpID8gMSA6IDA7CiAgICAgICAgICAgICBt
X2ZpYmVyc1swXS5zZXQoZ2xvYmFsRGF0YSwgdGhpcywgczEpOwogICAgICAgICAgICAgbV9maWJl
cnNbMV0uc2V0KGdsb2JhbERhdGEsIHRoaXMsIHMyKTsKICAgICAgICAgICAgIG1fZmliZXJzWzJd
LnNldChnbG9iYWxEYXRhLCB0aGlzLCBzMyk7CkBAIC0yNDQsNyArMjQ4LDggQEAgbmFtZXNwYWNl
IEpTQyB7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHJlc29sdmVSb3BlKEV4ZWNTdGF0ZSop
IGNvbnN0OwotICAgICAgICB2b2lkIHJlc29sdmVSb3BlU2xvd0Nhc2UoRXhlY1N0YXRlKiwgVUNo
YXIqKSBjb25zdDsKKyAgICAgICAgdm9pZCByZXNvbHZlUm9wZVNsb3dDYXNlOChFeGVjU3RhdGUq
LCBMQ2hhciopIGNvbnN0OworICAgICAgICB2b2lkIHJlc29sdmVSb3BlU2xvd0Nhc2UxNihFeGVj
U3RhdGUqLCBVQ2hhciopIGNvbnN0OwogICAgICAgICB2b2lkIG91dE9mTWVtb3J5KEV4ZWNTdGF0
ZSopIGNvbnN0OwogCiAgICAgICAgIHN0YXRpYyBKU09iamVjdCogdG9UaGlzT2JqZWN0KEpTQ2Vs
bCosIEV4ZWNTdGF0ZSopOwpAQCAtMjU2LDExICsyNjEsMTMgQEAgbmFtZXNwYWNlIEpTQyB7CiAg
ICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX21heEludGVybmFsUm9wZUxlbmd0aCA9IDM7
CiAKICAgICAgICAgLy8gQSBzdHJpbmcgaXMgcmVwcmVzZW50ZWQgZWl0aGVyIGJ5IGEgVVN0cmlu
ZyBvciBhIHJvcGUgb2YgZmliZXJzLgorICAgICAgICB1bnNpZ25lZCBtX2lzOEJpdCA6IDE7CiAg
ICAgICAgIHVuc2lnbmVkIG1fbGVuZ3RoOwogICAgICAgICBtdXRhYmxlIFVTdHJpbmcgbV92YWx1
ZTsKICAgICAgICAgbXV0YWJsZSBGaXhlZEFycmF5PFdyaXRlQmFycmllcjxKU1N0cmluZz4sIHNf
bWF4SW50ZXJuYWxSb3BlTGVuZ3RoPiBtX2ZpYmVyczsKIAogICAgICAgICBib29sIGlzUm9wZSgp
IGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUuaXNOdWxsKCk7IH0KKyAgICAgICAgQUxXQVlTX0lOTElO
RSBib29sIGlzOEJpdCgpIGNvbnN0IHsgcmV0dXJuIG1faXM4Qml0OyB9CiAgICAgICAgIFVTdHJp
bmcmIHN0cmluZygpIHsgQVNTRVJUKCFpc1JvcGUoKSk7IHJldHVybiBtX3ZhbHVlOyB9CiAKICAg
ICAgICAgZnJpZW5kIEpTVmFsdWUganNTdHJpbmcoRXhlY1N0YXRlKiwgSlNTdHJpbmcqLCBKU1N0
cmluZyopOwpAQCAtMzU2LDYgKzM2MywyMSBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgcmV0
dXJuIGpzU3Vic3RyaW5nKGdsb2JhbERhdGEsIHMtPnZhbHVlKGV4ZWMpLCBvZmZzZXQsIGxlbmd0
aCk7CiAgICAgfQogCisgICAgaW5saW5lIEpTU3RyaW5nKiBqc1N1YnN0cmluZzgoSlNHbG9iYWxE
YXRhKiBnbG9iYWxEYXRhLCBjb25zdCBVU3RyaW5nJiBzLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2ln
bmVkIGxlbmd0aCkKKyAgICB7CisgICAgICAgIEFTU0VSVChvZmZzZXQgPD0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KHMubGVuZ3RoKCkpKTsKKyAgICAgICAgQVNTRVJUKGxlbmd0aCA8PSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4ocy5sZW5ndGgoKSkpOworICAgICAgICBBU1NFUlQob2Zmc2V0ICsgbGVu
Z3RoIDw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLmxlbmd0aCgpKSk7CisgICAgICAgIGlmICgh
bGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGdsb2JhbERhdGEtPnNtYWxsU3RyaW5ncy5lbXB0
eVN0cmluZyhnbG9iYWxEYXRhKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAxKSB7CisgICAgICAg
ICAgICBVQ2hhciBjID0gc1tvZmZzZXRdOworICAgICAgICAgICAgaWYgKGMgPD0gbWF4U2luZ2xl
Q2hhcmFjdGVyU3RyaW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxEYXRhLT5zbWFs
bFN0cmluZ3Muc2luZ2xlQ2hhcmFjdGVyU3RyaW5nKGdsb2JhbERhdGEsIGMpOworICAgICAgICB9
CisgICAgICAgIHJldHVybiBmaXh1cFZQdHIoZ2xvYmFsRGF0YSwgSlNTdHJpbmc6OmNyZWF0ZUhh
c090aGVyT3duZXIoKmdsb2JhbERhdGEsIFN0cmluZ0ltcGw6OmNyZWF0ZTgocy5pbXBsKCksIG9m
ZnNldCwgbGVuZ3RoKSkpOworICAgIH0KKwogICAgIGlubGluZSBKU1N0cmluZyoganNTdWJzdHJp
bmcoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhLCBjb25zdCBVU3RyaW5nJiBzLCB1bnNpZ25lZCBv
ZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkKICAgICB7CiAgICAgICAgIEFTU0VSVChvZmZzZXQgPD0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHMubGVuZ3RoKCkpKTsKQEAgLTM5Miw2ICs0MTQsNyBAQCBu
YW1lc3BhY2UgSlNDIHsKICAgICBpbmxpbmUgSlNTdHJpbmcqIGpzRW1wdHlTdHJpbmcoRXhlY1N0
YXRlKiBleGVjKSB7IHJldHVybiBqc0VtcHR5U3RyaW5nKCZleGVjLT5nbG9iYWxEYXRhKCkpOyB9
CiAgICAgaW5saW5lIEpTU3RyaW5nKiBqc1N0cmluZyhFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IFVT
dHJpbmcmIHMpIHsgcmV0dXJuIGpzU3RyaW5nKCZleGVjLT5nbG9iYWxEYXRhKCksIHMpOyB9CiAg
ICAgaW5saW5lIEpTU3RyaW5nKiBqc1NpbmdsZUNoYXJhY3RlclN0cmluZyhFeGVjU3RhdGUqIGV4
ZWMsIFVDaGFyIGMpIHsgcmV0dXJuIGpzU2luZ2xlQ2hhcmFjdGVyU3RyaW5nKCZleGVjLT5nbG9i
YWxEYXRhKCksIGMpOyB9CisgICAgaW5saW5lIEpTU3RyaW5nKiBqc1N1YnN0cmluZzgoRXhlY1N0
YXRlKiBleGVjLCBjb25zdCBVU3RyaW5nJiBzLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxl
bmd0aCkgeyByZXR1cm4ganNTdWJzdHJpbmc4KCZleGVjLT5nbG9iYWxEYXRhKCksIHMsIG9mZnNl
dCwgbGVuZ3RoKTsgfQogICAgIGlubGluZSBKU1N0cmluZyoganNTdWJzdHJpbmcoRXhlY1N0YXRl
KiBleGVjLCBjb25zdCBVU3RyaW5nJiBzLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0
aCkgeyByZXR1cm4ganNTdWJzdHJpbmcoJmV4ZWMtPmdsb2JhbERhdGEoKSwgcywgb2Zmc2V0LCBs
ZW5ndGgpOyB9CiAgICAgaW5saW5lIEpTU3RyaW5nKiBqc05vbnRyaXZpYWxTdHJpbmcoRXhlY1N0
YXRlKiBleGVjLCBjb25zdCBVU3RyaW5nJiBzKSB7IHJldHVybiBqc05vbnRyaXZpYWxTdHJpbmco
JmV4ZWMtPmdsb2JhbERhdGEoKSwgcyk7IH0KICAgICBpbmxpbmUgSlNTdHJpbmcqIGpzTm9udHJp
dmlhbFN0cmluZyhFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IGNoYXIqIHMpIHsgcmV0dXJuIGpzTm9u
dHJpdmlhbFN0cmluZygmZXhlYy0+Z2xvYmFsRGF0YSgpLCBzKTsgfQo=
</data>
<flag name="review"
          id="113844"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>