<?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>156953</bug_id>
          
          <creation_ts>2016-04-23 07:13:37 -0700</creation_ts>
          <short_desc>[JSC] Optimize JSON.parse string fast path</short_desc>
          <delta_ts>2016-04-24 10:07:04 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1186611</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2016-04-23 07:13:37 -0700</bug_when>
    <thetext>[JSC] Optimize JSON.parse string fast path</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186612</commentid>
    <comment_count>1</comment_count>
      <attachid>277149</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2016-04-23 07:31:33 -0700</bug_when>
    <thetext>Created attachment 277149
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186613</commentid>
    <comment_count>2</comment_count>
      <attachid>277149</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2016-04-23 07:34:37 -0700</bug_when>
    <thetext>Comment on attachment 277149
Patch

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

Add comments.

&gt; Source/JavaScriptCore/runtime/LiteralParser.h:74
&gt; +

Convert LiteralParserToken to noncopyable class.

&gt; Source/JavaScriptCore/runtime/LiteralParser.h:156
&gt; +        StringBuilder m_builder;

Now, token&apos;s string&apos;s ownership is maintained by this builder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186620</commentid>
    <comment_count>3</comment_count>
      <attachid>277149</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-04-23 09:29:04 -0700</bug_when>
    <thetext>Comment on attachment 277149
Patch

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

r=me with suggestion.  Nice work on improving kraken.

&gt; Source/JavaScriptCore/runtime/LiteralParser.cpp:717
&gt; -                        LiteralParserToken&lt;CharType&gt; stringToken = m_lexer.currentToken();
&gt; -                        m_lexer.next();
&gt; +                        const LiteralParserToken&lt;CharType&gt;&amp; stringToken = m_lexer.currentToken();
&gt;                          if (stringToken.stringIs8Bit)
&gt;                              lastValue = jsString(m_exec, makeIdentifier(stringToken.stringToken8, stringToken.stringLength).string());
&gt;                          else
&gt;                              lastValue = jsString(m_exec, makeIdentifier(stringToken.stringToken16, stringToken.stringLength).string());
&gt; +                        m_lexer.next();

I understand that the reading of the token values needs be done before the call to m_lexer.next() because the lexer could alter the contents of the underlying StringBuilder that backs the token string in next().

My concern is: from reading this code (without digging deeper into the implementation of the lexer), it is not obvious that the validity of the current token is dependent on the internal state of the lexer.  It would be nice if there&apos;s some way to assert that the token string we&apos;re consuming is the one from the current token.  The only idea I can come up with for doing that assert is to assign some sort of a token ID to the token.  For example:

    template&lt;CharType&gt;
    class LiteralParserTokenPtr {
        LiteralParserTokenPtr(Lexer&lt;CharType&gt;&amp; lexer)
            : m_lexer(lexer)
#if !ASSERTS_DISABLED
            , m_tokenID(lexer.currentTokenID)
#endif
        { }

        ALWAYS_INLINE const LiteralParserToken&lt;CharType&gt;* operator-&gt;() const
        {
            ASSERT(m_tokenID == m_lexer.currentTokenID);
            return &amp;m_lexer.m_currentToken;
        }

    private:
        Lexer&lt;CharType&gt;&amp; m_lexer;
#if !ASSERTS_DISABLED
        unsigned m_tokenID;
#endif
    }

    // In Lexer:
    friend class LiteralParserTokenPtr&lt;CharType&gt;;

    LiteralParserTokenPtr&lt;CharType&gt;&amp; currentToken()
    {
        return LiteralParserTokenPtr&lt;CharType&gt;(*this);
    }
    ...
#if !ASSERTS_DISABLED
    unsigned m_currentTokenID { 0 };
#endif

    // In Lexer::next()
    if (!ASSERTS_DISABLED)
        m_currentTokenID++;
    ...

    // When parsing:
    LiteralParserTokenPtr&lt;CharType&gt; token = m_lexer.currentToken();
    lastValue = ... token-&gt;stringToken8 ...


This way, we will know if anyone ever tries to use the token after calling lexer.next().  What do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186746</commentid>
    <comment_count>4</comment_count>
      <attachid>277149</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2016-04-24 09:48:05 -0700</bug_when>
    <thetext>Comment on attachment 277149
Patch

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

&gt;&gt; Source/JavaScriptCore/runtime/LiteralParser.cpp:717
&gt;&gt; +                        m_lexer.next();
&gt; 
&gt; I understand that the reading of the token values needs be done before the call to m_lexer.next() because the lexer could alter the contents of the underlying StringBuilder that backs the token string in next().
&gt; 
&gt; My concern is: from reading this code (without digging deeper into the implementation of the lexer), it is not obvious that the validity of the current token is dependent on the internal state of the lexer.  It would be nice if there&apos;s some way to assert that the token string we&apos;re consuming is the one from the current token.  The only idea I can come up with for doing that assert is to assign some sort of a token ID to the token.  For example:
&gt; 
&gt;     template&lt;CharType&gt;
&gt;     class LiteralParserTokenPtr {
&gt;         LiteralParserTokenPtr(Lexer&lt;CharType&gt;&amp; lexer)
&gt;             : m_lexer(lexer)
&gt; #if !ASSERTS_DISABLED
&gt;             , m_tokenID(lexer.currentTokenID)
&gt; #endif
&gt;         { }
&gt; 
&gt;         ALWAYS_INLINE const LiteralParserToken&lt;CharType&gt;* operator-&gt;() const
&gt;         {
&gt;             ASSERT(m_tokenID == m_lexer.currentTokenID);
&gt;             return &amp;m_lexer.m_currentToken;
&gt;         }
&gt; 
&gt;     private:
&gt;         Lexer&lt;CharType&gt;&amp; m_lexer;
&gt; #if !ASSERTS_DISABLED
&gt;         unsigned m_tokenID;
&gt; #endif
&gt;     }
&gt; 
&gt;     // In Lexer:
&gt;     friend class LiteralParserTokenPtr&lt;CharType&gt;;
&gt; 
&gt;     LiteralParserTokenPtr&lt;CharType&gt;&amp; currentToken()
&gt;     {
&gt;         return LiteralParserTokenPtr&lt;CharType&gt;(*this);
&gt;     }
&gt;     ...
&gt; #if !ASSERTS_DISABLED
&gt;     unsigned m_currentTokenID { 0 };
&gt; #endif
&gt; 
&gt;     // In Lexer::next()
&gt;     if (!ASSERTS_DISABLED)
&gt;         m_currentTokenID++;
&gt;     ...
&gt; 
&gt;     // When parsing:
&gt;     LiteralParserTokenPtr&lt;CharType&gt; token = m_lexer.currentToken();
&gt;     lastValue = ... token-&gt;stringToken8 ...
&gt; 
&gt; 
&gt; This way, we will know if anyone ever tries to use the token after calling lexer.next().  What do you think?

Your suggestion looks nice.

I think switching this with the raw pointer is preferable.

Under debug mode, we use the above adapter. And under the release mode, we use the raw pointer (LiteralParserToken&lt;CharType&gt;*).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1186755</commentid>
    <comment_count>5</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2016-04-24 10:07:04 -0700</bug_when>
    <thetext>Committed r199968: &lt;http://trac.webkit.org/changeset/199968&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>277149</attachid>
            <date>2016-04-23 07:31:33 -0700</date>
            <delta_ts>2016-04-23 09:29:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-156953-20160423233156.patch</filename>
            <type>text/plain</type>
            <size>12596</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTk5OTQ3CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAy
YmUwNTBiOGE1ZDczZjAzMmIwZjlhYzUwOGU5YjEwOTJkZWI4MmQ2Li4zNDY0NmM0YzkyNjcxMTlk
NTE0MGRlNDkwNmYxZjU4Y2MwMGRmYjY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyOCBAQAorMjAxNi0wNC0yMyAgWXVzdWtlIFN1enVraSAgPHV0YXRhbmUudGVhQGdtYWls
LmNvbT4KKworICAgICAgICBbSlNDXSBPcHRpbWl6ZSBKU09OLnBhcnNlIHN0cmluZyBmYXN0IHBh
dGgKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1Njk1
MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMg
cGF0Y2ggZnVydGhlciBvcHRpbWl6ZXMgdGhlIHN0cmluZyBwYXJzaW5nIGZhc3QgcGF0aC4KKyAg
ICAgICAgUHJldmlvdXNseSwgd2UgZ2VuZXJhdGVkIHRoZSBXVEY6OlN0cmluZyB0byBob2xkIHRo
ZSBvd25lcnNoaXAgb2YgdGhlIHRva2VuJ3Mgc3RyaW5nLgorICAgICAgICBBbmQgYWx3YXlzIGNv
cGllZCB0aGUgdG9rZW4gaW4gTGl0ZXJhbFBhcnNlciBzaWRlLgorICAgICAgICBJbnN0ZWFkLCB3
ZSBob2xkIHRoZSBvd25lcnNoaXAgb2YgdGhlIHRva2VuIFN0cmluZyBieSB0aGUgU3RyaW5nQnVp
bGRlciBpbiBMaXRlcmFsUGFyc2VyOjpMZXhlciwKKyAgICAgICAgYW5kIHJlbW92ZSB0aGUgcHJv
Y2Vzc2luZyBpbiB0aGUgc3RyaW5nIHBhcnNpbmcgZmFzdCBwYXRoLgorICAgICAgICBUaGlzIHBh
dGNoIGdpdmVzIHVzIHN0YWJsZSAxIC0gMi41JSBpbXByb3ZlbWVudCBpbiBLcmFrZW4ganNvbi1w
YXJzZS1maW5hbmNpYWwuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEJhc2VsaW5lICAgICAgICAgICAgICAgICAgTW9kaWZpZWQKKworICAgICAgICBqc29uLXBhcnNl
LWZpbmFuY2lhbCAgICAgICAgNDEuMzgzKy0wLjI0OCAgICAgIF4gICAgICA0MC44OTQrLTAuMTg5
ICAgICAgICAgXiBkZWZpbml0ZWx5IDEuMDEyMHggZmFzdGVyCisKKworICAgICAgICAqIHJ1bnRp
bWUvTGl0ZXJhbFBhcnNlci5jcHA6CisgICAgICAgIChKU0M6OkxpdGVyYWxQYXJzZXI8Q2hhclR5
cGU+OjpMZXhlcjo6bGV4U3RyaW5nU2xvdyk6CisgICAgICAgIChKU0M6OkxpdGVyYWxQYXJzZXI8
Q2hhclR5cGU+OjpwYXJzZSk6CisgICAgICAgIChKU0M6OkxpdGVyYWxQYXJzZXI8Q2hhclR5cGU+
OjpMZXhlcjo6bGV4U3RyaW5nKTogRGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0xpdGVyYWxQ
YXJzZXIuaDoKKwogMjAxNi0wNC0yMiAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgog
CiAgICAgICAgIFNwZWVkIHVwIGJvdW5kIGZ1bmN0aW9ucyBhIGJpdApkaWZmIC0tZ2l0IGEvU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTGl0ZXJhbFBhcnNlci5jcHAgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9MaXRlcmFsUGFyc2VyLmNwcAppbmRleCA0MGVlZjdjMzRlMGFk
NTA4ZDliZWFkMDVlNGZmYmVmOGQ5ZmM2MTMyLi5jMTI2NTYyMzdmMzljZDE3NDNhNjc4MzZlY2Fk
YmExNDhiMDNjYjlkIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9M
aXRlcmFsUGFyc2VyLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9MaXRl
cmFsUGFyc2VyLmNwcApAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgIlN0cm9uZ0lubGluZXMu
aCIKICNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgogI2luY2x1ZGUgPHd0Zi9kdG9hLmg+Ci0j
aW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIApA
QCAtMzU0LDcgKzM1Myw2IEBAIHRlbXBsYXRlIDxQYXJzZXJNb2RlIG1vZGUsIGNoYXIgdGVybWlu
YXRvcj4gQUxXQVlTX0lOTElORSBUb2tlblR5cGUgTGl0ZXJhbFBhcnNlCiAgICAgd2hpbGUgKG1f
cHRyIDwgbV9lbmQgJiYgaXNTYWZlU3RyaW5nQ2hhcmFjdGVyPG1vZGUsIENoYXJUeXBlLCB0ZXJt
aW5hdG9yPigqbV9wdHIpKQogICAgICAgICArK21fcHRyOwogICAgIGlmIChMSUtFTFkobV9wdHIg
PCBtX2VuZCAmJiAqbV9wdHIgPT0gdGVybWluYXRvcikpIHsKLSAgICAgICAgdG9rZW4uc3RyaW5n
QnVmZmVyID0gU3RyaW5nKCk7CiAgICAgICAgIHNldFBhcnNlclRva2VuU3RyaW5nPENoYXJUeXBl
Pih0b2tlbiwgcnVuU3RhcnQpOwogICAgICAgICB0b2tlbi5zdHJpbmdMZW5ndGggPSBtX3B0ciAt
IHJ1blN0YXJ0OwogICAgICAgICB0b2tlbi50eXBlID0gVG9rU3RyaW5nOwpAQCAtMzY3LDE5ICsz
NjUsMTkgQEAgdGVtcGxhdGUgPFBhcnNlck1vZGUgbW9kZSwgY2hhciB0ZXJtaW5hdG9yPiBBTFdB
WVNfSU5MSU5FIFRva2VuVHlwZSBMaXRlcmFsUGFyc2UKIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFy
VHlwZT4KIHRlbXBsYXRlIDxQYXJzZXJNb2RlIG1vZGUsIGNoYXIgdGVybWluYXRvcj4gVG9rZW5U
eXBlIExpdGVyYWxQYXJzZXI8Q2hhclR5cGU+OjpMZXhlcjo6bGV4U3RyaW5nU2xvdyhMaXRlcmFs
UGFyc2VyVG9rZW48Q2hhclR5cGU+JiB0b2tlbiwgY29uc3QgQ2hhclR5cGUqIHJ1blN0YXJ0KQog
ewotICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKKyAgICBtX2J1aWxkZXIuY2xlYXIoKTsKICAg
ICBnb3RvIHNsb3dQYXRoQmVnaW47CiAgICAgZG8gewogICAgICAgICBydW5TdGFydCA9IG1fcHRy
OwogICAgICAgICB3aGlsZSAobV9wdHIgPCBtX2VuZCAmJiBpc1NhZmVTdHJpbmdDaGFyYWN0ZXI8
bW9kZSwgQ2hhclR5cGUsIHRlcm1pbmF0b3I+KCptX3B0cikpCiAgICAgICAgICAgICArK21fcHRy
OwotICAgICAgICBpZiAoIWJ1aWxkZXIuaXNFbXB0eSgpKQotICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQocnVuU3RhcnQsIG1fcHRyIC0gcnVuU3RhcnQpOworICAgICAgICBpZiAoIW1fYnVpbGRl
ci5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2J1aWxkZXIuYXBwZW5kKHJ1blN0YXJ0LCBtX3B0
ciAtIHJ1blN0YXJ0KTsKIAogc2xvd1BhdGhCZWdpbjoKICAgICAgICAgaWYgKChtb2RlICE9IE5v
blN0cmljdEpTT04pICYmIG1fcHRyIDwgbV9lbmQgJiYgKm1fcHRyID09ICdcXCcpIHsKLSAgICAg
ICAgICAgIGlmIChidWlsZGVyLmlzRW1wdHkoKSAmJiBydW5TdGFydCA8IG1fcHRyKQotICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJ1blN0YXJ0LCBtX3B0ciAtIHJ1blN0YXJ0KTsKKyAg
ICAgICAgICAgIGlmIChtX2J1aWxkZXIuaXNFbXB0eSgpICYmIHJ1blN0YXJ0IDwgbV9wdHIpCisg
ICAgICAgICAgICAgICAgbV9idWlsZGVyLmFwcGVuZChydW5TdGFydCwgbV9wdHIgLSBydW5TdGFy
dCk7CiAgICAgICAgICAgICArK21fcHRyOwogICAgICAgICAgICAgaWYgKG1fcHRyID49IG1fZW5k
KSB7CiAgICAgICAgICAgICAgICAgbV9sZXhFcnJvck1lc3NhZ2UgPSBBU0NJSUxpdGVyYWwoIlVu
dGVybWluYXRlZCBzdHJpbmciKTsKQEAgLTM4NywzNSArMzg1LDM1IEBAIHRlbXBsYXRlIDxQYXJz
ZXJNb2RlIG1vZGUsIGNoYXIgdGVybWluYXRvcj4gVG9rZW5UeXBlIExpdGVyYWxQYXJzZXI8Q2hh
clR5cGU+OjpMCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKCptX3B0cikgewog
ICAgICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFw
cGVuZCgnIicpOworICAgICAgICAgICAgICAgICAgICBtX2J1aWxkZXIuYXBwZW5kKCciJyk7CiAg
ICAgICAgICAgICAgICAgICAgIG1fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwog
ICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgIG1fYnVpbGRlci5hcHBlbmQoJ1xcJyk7
CiAgICAgICAgICAgICAgICAgICAgIG1fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OwogICAgICAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVy
LmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgICAgICBtX2J1aWxkZXIuYXBwZW5kKCcvJyk7
CiAgICAgICAgICAgICAgICAgICAgIG1fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OwogICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVy
LmFwcGVuZCgnXGInKTsKKyAgICAgICAgICAgICAgICAgICAgbV9idWlsZGVyLmFwcGVuZCgnXGIn
KTsKICAgICAgICAgICAgICAgICAgICAgbV9wdHIrKzsKICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCdcZicpOworICAgICAgICAgICAgICAgICAgICBtX2J1aWxkZXIuYXBwZW5kKCdc
ZicpOwogICAgICAgICAgICAgICAgICAgICBtX3B0cisrOwogICAgICAgICAgICAgICAgICAgICBi
cmVhazsKICAgICAgICAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgICAgICAgICAgYnVp
bGRlci5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgIG1fYnVpbGRlci5hcHBlbmQo
J1xuJyk7CiAgICAgICAgICAgICAgICAgICAgIG1fcHRyKys7CiAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICBi
dWlsZGVyLmFwcGVuZCgnXHInKTsKKyAgICAgICAgICAgICAgICAgICAgbV9idWlsZGVyLmFwcGVu
ZCgnXHInKTsKICAgICAgICAgICAgICAgICAgICAgbV9wdHIrKzsKICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKCdcdCcpOworICAgICAgICAgICAgICAgICAgICBtX2J1aWxkZXIuYXBw
ZW5kKCdcdCcpOwogICAgICAgICAgICAgICAgICAgICBtX3B0cisrOwogICAgICAgICAgICAgICAg
ICAgICBicmVhazsKIApAQCAtNDMwLDEzICs0MjgsMTMgQEAgdGVtcGxhdGUgPFBhcnNlck1vZGUg
bW9kZSwgY2hhciB0ZXJtaW5hdG9yPiBUb2tlblR5cGUgTGl0ZXJhbFBhcnNlcjxDaGFyVHlwZT46
OkwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rRXJyb3I7CiAgICAgICAg
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoSlNDOjpMZXhlcjxDaGFyVHlwZT46OmNvbnZlcnRVbmljb2Rl
KG1fcHRyWzFdLCBtX3B0clsyXSwgbV9wdHJbM10sIG1fcHRyWzRdKSk7CisgICAgICAgICAgICAg
ICAgICAgIG1fYnVpbGRlci5hcHBlbmQoSlNDOjpMZXhlcjxDaGFyVHlwZT46OmNvbnZlcnRVbmlj
b2RlKG1fcHRyWzFdLCBtX3B0clsyXSwgbV9wdHJbM10sIG1fcHRyWzRdKSk7CiAgICAgICAgICAg
ICAgICAgICAgIG1fcHRyICs9IDU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAg
ICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgaWYgKCptX3B0ciA9PSAn
XCcnICYmIG1vZGUgIT0gU3RyaWN0SlNPTikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVp
bGRlci5hcHBlbmQoJ1wnJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1aWxkZXIuYXBw
ZW5kKCdcJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgbV9wdHIrKzsKICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTEsMjAgKzQ0
OSwxOCBAQCB0ZW1wbGF0ZSA8UGFyc2VyTW9kZSBtb2RlLCBjaGFyIHRlcm1pbmF0b3I+IFRva2Vu
VHlwZSBMaXRlcmFsUGFyc2VyPENoYXJUeXBlPjo6TAogICAgICAgICByZXR1cm4gVG9rRXJyb3I7
CiAgICAgfQogCi0gICAgaWYgKGJ1aWxkZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHRva2VuLnN0
cmluZ0J1ZmZlciA9IFN0cmluZygpOworICAgIGlmIChtX2J1aWxkZXIuaXNFbXB0eSgpKSB7CiAg
ICAgICAgIHNldFBhcnNlclRva2VuU3RyaW5nPENoYXJUeXBlPih0b2tlbiwgcnVuU3RhcnQpOwog
ICAgICAgICB0b2tlbi5zdHJpbmdMZW5ndGggPSBtX3B0ciAtIHJ1blN0YXJ0OwogICAgIH0gZWxz
ZSB7Ci0gICAgICAgIHRva2VuLnN0cmluZ0J1ZmZlciA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAg
ICAgICAgaWYgKHRva2VuLnN0cmluZ0J1ZmZlci5pczhCaXQoKSkgeworICAgICAgICBpZiAobV9i
dWlsZGVyLmlzOEJpdCgpKSB7CiAgICAgICAgICAgICB0b2tlbi5zdHJpbmdJczhCaXQgPSAxOwot
ICAgICAgICAgICAgdG9rZW4uc3RyaW5nVG9rZW44ID0gdG9rZW4uc3RyaW5nQnVmZmVyLmNoYXJh
Y3RlcnM4KCk7CisgICAgICAgICAgICB0b2tlbi5zdHJpbmdUb2tlbjggPSBtX2J1aWxkZXIuY2hh
cmFjdGVyczgoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRva2VuLnN0cmluZ0lz
OEJpdCA9IDA7Ci0gICAgICAgICAgICB0b2tlbi5zdHJpbmdUb2tlbjE2ID0gdG9rZW4uc3RyaW5n
QnVmZmVyLmNoYXJhY3RlcnMxNigpOworICAgICAgICAgICAgdG9rZW4uc3RyaW5nVG9rZW4xNiA9
IG1fYnVpbGRlci5jaGFyYWN0ZXJzMTYoKTsKICAgICAgICAgfQotICAgICAgICB0b2tlbi5zdHJp
bmdMZW5ndGggPSB0b2tlbi5zdHJpbmdCdWZmZXIubGVuZ3RoKCk7CisgICAgICAgIHRva2VuLnN0
cmluZ0xlbmd0aCA9IG1fYnVpbGRlci5sZW5ndGgoKTsKICAgICB9CiAgICAgdG9rZW4udHlwZSA9
IFRva1N0cmluZzsKICAgICB0b2tlbi5lbmQgPSArK21fcHRyOwpAQCAtNjI3LDcgKzYyMywxMSBA
QCBKU1ZhbHVlIExpdGVyYWxQYXJzZXI8Q2hhclR5cGU+OjpwYXJzZShQYXJzZXJTdGF0ZSBpbml0
aWFsU3RhdGUpCiAKICAgICAgICAgICAgICAgICBUb2tlblR5cGUgdHlwZSA9IG1fbGV4ZXIubmV4
dCgpOwogICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRva1N0cmluZyB8fCAobV9tb2RlICE9
IFN0cmljdEpTT04gJiYgdHlwZSA9PSBUb2tJZGVudGlmaWVyKSkgewotICAgICAgICAgICAgICAg
ICAgICBMaXRlcmFsUGFyc2VyVG9rZW48Q2hhclR5cGU+IGlkZW50aWZpZXJUb2tlbiA9IG1fbGV4
ZXIuY3VycmVudFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdGVyYWxQYXJz
ZXJUb2tlbjxDaGFyVHlwZT4mIGlkZW50aWZpZXJUb2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2Vu
KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyVG9rZW4uc3RyaW5nSXM4Qml0
KQorICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllclN0YWNrLmFwcGVuZChtYWtlSWRl
bnRpZmllcihpZGVudGlmaWVyVG9rZW4uc3RyaW5nVG9rZW44LCBpZGVudGlmaWVyVG9rZW4uc3Ry
aW5nTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGlkZW50aWZpZXJTdGFjay5hcHBlbmQobWFrZUlkZW50aWZpZXIoaWRlbnRpZmllclRv
a2VuLnN0cmluZ1Rva2VuMTYsIGlkZW50aWZpZXJUb2tlbi5zdHJpbmdMZW5ndGgpKTsKIAogICAg
ICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgY29sb24KICAgICAgICAgICAgICAgICAgICAg
aWYgKG1fbGV4ZXIubmV4dCgpICE9IFRva0NvbG9uKSB7CkBAIC02MzYsMTAgKzYzNiw2IEBAIEpT
VmFsdWUgTGl0ZXJhbFBhcnNlcjxDaGFyVHlwZT46OnBhcnNlKFBhcnNlclN0YXRlIGluaXRpYWxT
dGF0ZSkKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAKICAgICAg
ICAgICAgICAgICAgICAgbV9sZXhlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChp
ZGVudGlmaWVyVG9rZW4uc3RyaW5nSXM4Qml0KQotICAgICAgICAgICAgICAgICAgICAgICAgaWRl
bnRpZmllclN0YWNrLmFwcGVuZChtYWtlSWRlbnRpZmllcihpZGVudGlmaWVyVG9rZW4uc3RyaW5n
VG9rZW44LCBpZGVudGlmaWVyVG9rZW4uc3RyaW5nTGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJTdGFjay5hcHBlbmQo
bWFrZUlkZW50aWZpZXIoaWRlbnRpZmllclRva2VuLnN0cmluZ1Rva2VuMTYsIGlkZW50aWZpZXJU
b2tlbi5zdHJpbmdMZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdGFjay5hcHBl
bmQoRG9QYXJzZU9iamVjdEVuZEV4cHJlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBnb3Rv
IHN0YXJ0UGFyc2VFeHByZXNzaW9uOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OSw3ICs2NTUs
MTEgQEAgSlNWYWx1ZSBMaXRlcmFsUGFyc2VyPENoYXJUeXBlPjo6cGFyc2UoUGFyc2VyU3RhdGUg
aW5pdGlhbFN0YXRlKQogICAgICAgICAgICAgICAgICAgICBtX3BhcnNlRXJyb3JNZXNzYWdlID0g
QVNDSUlMaXRlcmFsKCJQcm9wZXJ0eSBuYW1lIG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbCIpOwog
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNWYWx1ZSgpOwogICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBMaXRlcmFsUGFyc2VyVG9rZW48Q2hhclR5cGU+IGlkZW50aWZpZXJU
b2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2VuKCk7CisgICAgICAgICAgICAgICAgY29uc3QgTGl0
ZXJhbFBhcnNlclRva2VuPENoYXJUeXBlPiYgaWRlbnRpZmllclRva2VuID0gbV9sZXhlci5jdXJy
ZW50VG9rZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoaWRlbnRpZmllclRva2VuLnN0cmluZ0lz
OEJpdCkKKyAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllclN0YWNrLmFwcGVuZChtYWtlSWRl
bnRpZmllcihpZGVudGlmaWVyVG9rZW4uc3RyaW5nVG9rZW44LCBpZGVudGlmaWVyVG9rZW4uc3Ry
aW5nTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBp
ZGVudGlmaWVyU3RhY2suYXBwZW5kKG1ha2VJZGVudGlmaWVyKGlkZW50aWZpZXJUb2tlbi5zdHJp
bmdUb2tlbjE2LCBpZGVudGlmaWVyVG9rZW4uc3RyaW5nTGVuZ3RoKSk7CiAKICAgICAgICAgICAg
ICAgICAvLyBDaGVjayBmb3IgY29sb24KICAgICAgICAgICAgICAgICBpZiAobV9sZXhlci5uZXh0
KCkgIT0gVG9rQ29sb24pIHsKQEAgLTY2OCwxMCArNjY4LDYgQEAgSlNWYWx1ZSBMaXRlcmFsUGFy
c2VyPENoYXJUeXBlPjo6cGFyc2UoUGFyc2VyU3RhdGUgaW5pdGlhbFN0YXRlKQogICAgICAgICAg
ICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1fbGV4ZXIubmV4dCgpOwotICAgICAgICAgICAg
ICAgIGlmIChpZGVudGlmaWVyVG9rZW4uc3RyaW5nSXM4Qml0KQotICAgICAgICAgICAgICAgICAg
ICBpZGVudGlmaWVyU3RhY2suYXBwZW5kKG1ha2VJZGVudGlmaWVyKGlkZW50aWZpZXJUb2tlbi5z
dHJpbmdUb2tlbjgsIGlkZW50aWZpZXJUb2tlbi5zdHJpbmdMZW5ndGgpKTsKLSAgICAgICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJTdGFjay5hcHBlbmQobWFr
ZUlkZW50aWZpZXIoaWRlbnRpZmllclRva2VuLnN0cmluZ1Rva2VuMTYsIGlkZW50aWZpZXJUb2tl
bi5zdHJpbmdMZW5ndGgpKTsKICAgICAgICAgICAgICAgICBzdGF0ZVN0YWNrLmFwcGVuZChEb1Bh
cnNlT2JqZWN0RW5kRXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgZ290byBzdGFydFBhcnNl
RXhwcmVzc2lvbjsKICAgICAgICAgICAgIH0KQEAgLTcxMywxOCArNzA5LDE4IEBAIEpTVmFsdWUg
TGl0ZXJhbFBhcnNlcjxDaGFyVHlwZT46OnBhcnNlKFBhcnNlclN0YXRlIGluaXRpYWxTdGF0ZSkK
ICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tMQnJhY2U6CiAgICAgICAgICAgICAgICAgICAg
ICAgICBnb3RvIHN0YXJ0UGFyc2VPYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9r
U3RyaW5nOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXRlcmFsUGFyc2VyVG9rZW48Q2hh
clR5cGU+IHN0cmluZ1Rva2VuID0gbV9sZXhlci5jdXJyZW50VG9rZW4oKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIG1fbGV4ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgTGl0ZXJhbFBhcnNlclRva2VuPENoYXJUeXBlPiYgc3RyaW5nVG9rZW4gPSBtX2xleGVyLmN1
cnJlbnRUb2tlbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZ1Rva2VuLnN0
cmluZ0lzOEJpdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBqc1N0
cmluZyhtX2V4ZWMsIG1ha2VJZGVudGlmaWVyKHN0cmluZ1Rva2VuLnN0cmluZ1Rva2VuOCwgc3Ry
aW5nVG9rZW4uc3RyaW5nTGVuZ3RoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAg
ICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0ganNTdHJpbmco
bV9leGVjLCBtYWtlSWRlbnRpZmllcihzdHJpbmdUb2tlbi5zdHJpbmdUb2tlbjE2LCBzdHJpbmdU
b2tlbi5zdHJpbmdMZW5ndGgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
bGV4ZXIubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tOdW1iZXI6IHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIExpdGVyYWxQYXJzZXJUb2tlbjxDaGFyVHlwZT4gbnVtYmVyVG9r
ZW4gPSBtX2xleGVyLmN1cnJlbnRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9s
ZXhlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXRlcmFsUGFyc2Vy
VG9rZW48Q2hhclR5cGU+JiBudW1iZXJUb2tlbiA9IG1fbGV4ZXIuY3VycmVudFRva2VuKCk7CiAg
ICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBqc051bWJlcihudW1iZXJUb2tlbi5u
dW1iZXJUb2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xleGVyLm5leHQoKTsKICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAg
ICAgICAgICAgICAgICAgIGNhc2UgVG9rTnVsbDoKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0xpdGVyYWxQYXJzZXIuaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0xpdGVyYWxQYXJzZXIuaAppbmRleCA5ZTIyZjM4MDM3ODUwMDMwMTMyODBiNGQxYmU1
MzVmNGM1OTEzMjNhLi4yYmIxNTExN2I5YzJiMzRkZGJmODU5NGVkZThiNzJmMDM3Y2ViNzdmIDEw
MDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9MaXRlcmFsUGFyc2VyLmgK
KysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTGl0ZXJhbFBhcnNlci5oCkBAIC0z
MCw2ICszMCw3IEBACiAjaW5jbHVkZSAiSlNDSlNWYWx1ZS5oIgogI2luY2x1ZGUgIkpTR2xvYmFs
T2JqZWN0RnVuY3Rpb25zLmgiCiAjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8d3RmL3RleHQv
U3RyaW5nQnVpbGRlci5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgogCiBuYW1l
c3BhY2UgSlNDIHsKQEAgLTY1LDEwICs2NiwxNSBAQCBzdHJ1Y3QgSlNPTlBEYXRhIHsKIAogdGVt
cGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgogc3RydWN0IExpdGVyYWxQYXJzZXJUb2tlbiB7Citw
cml2YXRlOgorV1RGX01BS0VfTk9OQ09QWUFCTEUoTGl0ZXJhbFBhcnNlclRva2VuPENoYXJUeXBl
Pik7CisKK3B1YmxpYzoKKyAgICBMaXRlcmFsUGFyc2VyVG9rZW4oKSA9IGRlZmF1bHQ7CisKICAg
ICBUb2tlblR5cGUgdHlwZTsKICAgICBjb25zdCBDaGFyVHlwZSogc3RhcnQ7CiAgICAgY29uc3Qg
Q2hhclR5cGUqIGVuZDsKLSAgICBTdHJpbmcgc3RyaW5nQnVmZmVyOwogICAgIHVuaW9uIHsKICAg
ICAgICAgZG91YmxlIG51bWJlclRva2VuOwogICAgICAgICBzdHJ1Y3QgewpAQCAtMTQ3LDYgKzE1
Myw3IEBAIGNsYXNzIExpdGVyYWxQYXJzZXIgewogICAgICAgICBQYXJzZXJNb2RlIG1fbW9kZTsK
ICAgICAgICAgY29uc3QgQ2hhclR5cGUqIG1fcHRyOwogICAgICAgICBjb25zdCBDaGFyVHlwZSog
bV9lbmQ7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbV9idWlsZGVyOwogICAgIH07CiAgICAgCiAg
ICAgY2xhc3MgU3RhY2tHdWFyZDsKQEAgLTE2MSw3ICsxNjgsNyBAQCBjbGFzcyBMaXRlcmFsUGFy
c2VyIHsKICAgICBzdGQ6OmFycmF5PElkZW50aWZpZXIsIE1heGltdW1DYWNoYWJsZUNoYXJhY3Rl
cj4gbV9yZWNlbnRJZGVudGlmaWVyczsKICAgICBBTFdBWVNfSU5MSU5FIGNvbnN0IElkZW50aWZp
ZXIgbWFrZUlkZW50aWZpZXIoY29uc3QgTENoYXIqIGNoYXJhY3RlcnMsIHNpemVfdCBsZW5ndGgp
OwogICAgIEFMV0FZU19JTkxJTkUgY29uc3QgSWRlbnRpZmllciBtYWtlSWRlbnRpZmllcihjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgc2l6ZV90IGxlbmd0aCk7Ci0gICAgfTsKK307CiAKIH0KIAo=
</data>
<flag name="review"
          id="301391"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>