<?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>158452</bug_id>
          
          <creation_ts>2016-06-06 17:20:31 -0700</creation_ts>
          <short_desc>equal(StringView, StringView) for strings should have a fast path for pointer equality</short_desc>
          <delta_ts>2016-06-07 14:12:43 -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>Web Template Framework</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="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>andersca</cc>
    
    <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>keith_miller</cc>
    
    <cc>kling</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>rniwa</cc>
    
    <cc>sam</cc>
    
    <cc>sukolsak</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1199793</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 17:20:31 -0700</bug_when>
    <thetext>JSBench does a lot of StringView::operator== that would succeed much faster if just did pointer equality
on the string buffer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199808</commentid>
    <comment_count>1</comment_count>
      <attachid>280655</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 17:57:48 -0700</bug_when>
    <thetext>Created attachment 280655
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199810</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-06 17:58:51 -0700</bug_when>
    <thetext>Attachment 280655 did not pass style-queue:


ERROR: Source/WTF/wtf/text/StringView.h:138:  The parameter name &quot;a&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/text/StringView.h:138:  The parameter name &quot;b&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/text/StringImpl.h:142:  The parameter name &quot;a&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WTF/wtf/text/StringImpl.h:142:  The parameter name &quot;b&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 4 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199811</commentid>
    <comment_count>3</comment_count>
      <attachid>280655</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2016-06-06 17:59:10 -0700</bug_when>
    <thetext>Comment on attachment 280655
patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199815</commentid>
    <comment_count>4</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 18:04:23 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Attachment 280655 [details] did not pass style-queue:
&gt; 
&gt; 
&gt; ERROR: Source/WTF/wtf/text/StringView.h:138:  The parameter name &quot;a&quot; adds no
&gt; information, so it should be removed.  [readability/parameter_name] [5]
&gt; ERROR: Source/WTF/wtf/text/StringView.h:138:  The parameter name &quot;b&quot; adds no
&gt; information, so it should be removed.  [readability/parameter_name] [5]
&gt; ERROR: Source/WTF/wtf/text/StringImpl.h:142:  The parameter name &quot;a&quot; adds no
&gt; information, so it should be removed.  [readability/parameter_name] [5]
&gt; ERROR: Source/WTF/wtf/text/StringImpl.h:142:  The parameter name &quot;b&quot; adds no
&gt; information, so it should be removed.  [readability/parameter_name] [5]
&gt; Total errors found: 4 in 4 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against
&gt; check-webkit-style.

I&apos;ll fix before landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199818</commentid>
    <comment_count>5</comment_count>
      <attachid>280655</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-06-06 18:11:57 -0700</bug_when>
    <thetext>Comment on attachment 280655
patch

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

&gt; Source/WTF/ChangeLog:11
&gt; +        JSBench does a lot of StringView::operator== on StringViews that have
&gt; +        the same underlying data pointer. We can make these types of use cases
&gt; +        much faster by doing an early return in equalCommon when the underlying
&gt; +        StringType&apos;s have equal data pointers.

Can you help me understand more how this == on two StringViews with the same data pointer happens? I didn’t realize we were even using StringView all that much.

For StringImpl, this is likely not a good optimization, because it’s highly likely that the StringImpl* itself is == the other, and much less likely that we have two distinct ones with the same length pointing at the same data.

So I would probably put the optimization in StringView, not in equalCommon.

&gt; Source/WTF/wtf/text/StringImpl.h:339
&gt; +    const void* data() const { return m_data8; }

If we keep this, this function needs a way longer name. It’s super unsafe to use this for anything except equalCommon. Maybe dataFor8BitEquality?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199822</commentid>
    <comment_count>6</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2016-06-06 18:22:45 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 280655 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=280655&amp;action=review
&gt; 
&gt; &gt; Source/WTF/ChangeLog:11
&gt; &gt; +        JSBench does a lot of StringView::operator== on StringViews that have
&gt; &gt; +        the same underlying data pointer. We can make these types of use cases
&gt; &gt; +        much faster by doing an early return in equalCommon when the underlying
&gt; &gt; +        StringType&apos;s have equal data pointers.
&gt; 
&gt; Can you help me understand more how this == on two StringViews with the same
&gt; data pointer happens? I didn’t realize we were even using StringView all
&gt; that much.

Some of the JS source providers use a WTF::String internally and then just create a StringView wrapper when asked for their source.

This change was really targeting the SourceCodeKey hash equality function. I was following the discussion about this on IRC and didn&apos;t realize it wasn&apos;t even mentioned here. My bad.

Oh, and fair point about giving data() a much scarier name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199824</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 18:27:21 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 280655 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=280655&amp;action=review
&gt; 
&gt; &gt; Source/WTF/ChangeLog:11
&gt; &gt; +        JSBench does a lot of StringView::operator== on StringViews that have
&gt; &gt; +        the same underlying data pointer. We can make these types of use cases
&gt; &gt; +        much faster by doing an early return in equalCommon when the underlying
&gt; &gt; +        StringType&apos;s have equal data pointers.
&gt; 
&gt; Can you help me understand more how this == on two StringViews with the same
&gt; data pointer happens? I didn’t realize we were even using StringView all
&gt; that much.
We use it for SourceCodeKey inside JSC, which will use a StringView from SourceCode
to check for text equality amongst JS programs (and eval programs, etc). We will use this
in our unlinked code cache. Unlinked code cache can be used to cache unlinked byte code
(i.e, bytecode that isn&apos;t tied to a scope, and in the case of a program, a global object).
JSBench will stress this unlinked code cache heavily. In JSBench, we will often do comparisons
on StringViews in which this optimization is profitable. Specifically, it will save us
from doing an expensive string compare on long strings that are equal.

&gt; For StringImpl, this is likely not a good optimization, because it’s highly
&gt; likely that the StringImpl* itself is == the other, and much less likely
&gt; that we have two distinct ones with the same length pointing at the same
&gt; data.
&gt; 
&gt; So I would probably put the optimization in StringView, not in equalCommon.
&gt; 
Right. I was debating whether to have this one level up or inside equalCommon.
Maybe it&apos;s worth taking some data on how much this optimization will help us with StringImpl?
Or should I just skip that and put the inside StringView?

&gt; &gt; Source/WTF/wtf/text/StringImpl.h:339
&gt; &gt; +    const void* data() const { return m_data8; }
&gt; 
&gt; If we keep this, this function needs a way longer name. It’s super unsafe to
&gt; use this for anything except equalCommon. Maybe dataFor8BitEquality?
Sure. If we keep it, I think we should just call it dataForBufferEquality.
The buffer doesn&apos;t need to be 8 bit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199825</commentid>
    <comment_count>8</comment_count>
      <attachid>280655</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 18:29:29 -0700</bug_when>
    <thetext>Comment on attachment 280655
patch

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

&gt;&gt;&gt;&gt; Source/WTF/ChangeLog:11
&gt;&gt;&gt;&gt; +        StringType&apos;s have equal data pointers.
&gt;&gt;&gt; 
&gt;&gt;&gt; Can you help me understand more how this == on two StringViews with the same data pointer happens? I didn’t realize we were even using StringView all that much.
&gt;&gt;&gt; 
&gt;&gt;&gt; For StringImpl, this is likely not a good optimization, because it’s highly likely that the StringImpl* itself is == the other, and much less likely that we have two distinct ones with the same length pointing at the same data.
&gt;&gt;&gt; 
&gt;&gt;&gt; So I would probably put the optimization in StringView, not in equalCommon.
&gt;&gt; 
&gt;&gt; Some of the JS source providers use a WTF::String internally and then just create a StringView wrapper when asked for their source.
&gt;&gt; 
&gt;&gt; This change was really targeting the SourceCodeKey hash equality function. I was following the discussion about this on IRC and didn&apos;t realize it wasn&apos;t even mentioned here. My bad.
&gt;&gt; 
&gt;&gt; Oh, and fair point about giving data() a much scarier name.
&gt; 
&gt; We use it for SourceCodeKey inside JSC, which will use a StringView from SourceCode
&gt; to check for text equality amongst JS programs (and eval programs, etc). We will use this
&gt; in our unlinked code cache. Unlinked code cache can be used to cache unlinked byte code
&gt; (i.e, bytecode that isn&apos;t tied to a scope, and in the case of a program, a global object).
&gt; JSBench will stress this unlinked code cache heavily. In JSBench, we will often do comparisons
&gt; on StringViews in which this optimization is profitable. Specifically, it will save us
&gt; from doing an expensive string compare on long strings that are equal.

I&apos;ll add some more clarification in the ChangeLog about where this is used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199837</commentid>
    <comment_count>9</comment_count>
      <attachid>280655</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-06-06 18:47:23 -0700</bug_when>
    <thetext>Comment on attachment 280655
patch

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

&gt;&gt;&gt;&gt;&gt; Source/WTF/ChangeLog:11
&gt;&gt;&gt;&gt;&gt; +        StringType&apos;s have equal data pointers.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Can you help me understand more how this == on two StringViews with the same data pointer happens? I didn’t realize we were even using StringView all that much.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; For StringImpl, this is likely not a good optimization, because it’s highly likely that the StringImpl* itself is == the other, and much less likely that we have two distinct ones with the same length pointing at the same data.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; So I would probably put the optimization in StringView, not in equalCommon.
&gt;&gt;&gt; 
&gt;&gt;&gt; Some of the JS source providers use a WTF::String internally and then just create a StringView wrapper when asked for their source.
&gt;&gt;&gt; 
&gt;&gt;&gt; This change was really targeting the SourceCodeKey hash equality function. I was following the discussion about this on IRC and didn&apos;t realize it wasn&apos;t even mentioned here. My bad.
&gt;&gt;&gt; 
&gt;&gt;&gt; Oh, and fair point about giving data() a much scarier name.
&gt;&gt; 
&gt;&gt; We use it for SourceCodeKey inside JSC, which will use a StringView from SourceCode
&gt;&gt; to check for text equality amongst JS programs (and eval programs, etc). We will use this
&gt;&gt; in our unlinked code cache. Unlinked code cache can be used to cache unlinked byte code
&gt;&gt; (i.e, bytecode that isn&apos;t tied to a scope, and in the case of a program, a global object).
&gt;&gt; JSBench will stress this unlinked code cache heavily. In JSBench, we will often do comparisons
&gt;&gt; on StringViews in which this optimization is profitable. Specifically, it will save us
&gt;&gt; from doing an expensive string compare on long strings that are equal.
&gt; 
&gt; I&apos;ll add some more clarification in the ChangeLog about where this is used.

I think you should do it only for StringView, and then you could do it for StringImpl if you get data that it is helpful there (seems highly unlikely unless the StringImpl functions are already missing a fast path for when the implementation pointers are equal). I can see the == function for StringView checking the pointer equality first before checking the length. Could still use equalCommon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199844</commentid>
    <comment_count>10</comment_count>
      <attachid>280660</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-06 19:03:47 -0700</bug_when>
    <thetext>Created attachment 280660
patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199870</commentid>
    <comment_count>11</comment_count>
      <attachid>280660</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-06 20:23:28 -0700</bug_when>
    <thetext>Comment on attachment 280660
patch for landing

Clearing flags on attachment: 280660

Committed r201738: &lt;http://trac.webkit.org/changeset/201738&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199871</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-06 20:23:36 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1199973</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2016-06-07 01:53:48 -0700</bug_when>
    <thetext>This was 2-5% progression on JSBench on iOS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1200086</commentid>
    <comment_count>14</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-06-07 09:53:15 -0700</bug_when>
    <thetext>In the case of this speedup, our StringViews point to StringImpls that point to the same data but are not themselves pointer equal.

The way this happens is that two documents create equivalent substrings by parsing the same cached resource.

I believe this condition -- a substring StringImpl that is not pointer equal to another StringImpl but does point to the same data -- will happen any time we parse a resource from the cache (JS, HTML, or CSS), since we do not go to the trouble of uniqueing substrings. 

I&apos;m not sure how commonly two such substrings will compare against each other, since you need some boundary-crossing interface in order for them to meet up. The boundary-crossing interface in this example is the JS source cache.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1200190</commentid>
    <comment_count>15</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-06-07 13:59:57 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; In the case of this speedup, our StringViews point to StringImpls that point
&gt; to the same data but are not themselves pointer equal.

Are you sure?

&gt; The way this happens is that two documents create equivalent substrings by
&gt; parsing the same cached resource.

Using which StringImpl constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1200192</commentid>
    <comment_count>16</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2016-06-07 14:12:43 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; In the case of this speedup, our StringViews point to StringImpls that point
&gt; &gt; to the same data but are not themselves pointer equal.
&gt; 
&gt; Are you sure?
&gt; 
&gt; &gt; The way this happens is that two documents create equivalent substrings by
&gt; &gt; parsing the same cached resource.
&gt; 
&gt; Using which StringImpl constructor?

Hmmm... Actually, in the case of JSBench, it looks like the strings point to the same characters because they originate as Identifiers in the JavaScript parser.

When navigating webpages, a &lt;script&gt; inside an HTML document would call SourceProvider::getRange:

        virtual StringView source() const = 0;
        StringView getRange(int start, int end) const
        {
            return source().substring(start, end - start);
        }</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>280655</attachid>
            <date>2016-06-06 17:57:48 -0700</date>
            <delta_ts>2016-06-06 19:03:47 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>2961</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAyMDE3MzQpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDE2LTA2LTA2ICBTYWFtIEJhcmF0aSAgPHNiYXJh
dGlAYXBwbGUuY29tPgorCisgICAgICAgIGVxdWFsQ29tbW9uIGZvciBzdHJpbmdzIHNob3VsZCBo
YXZlIGEgZmFzdCBwYXRoIGZvciBwb2ludGVyIGVxdWFsaXR5CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTg0NTIKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBKU0JlbmNoIGRvZXMgYSBsb3Qgb2YgU3RyaW5n
Vmlldzo6b3BlcmF0b3I9PSBvbiBTdHJpbmdWaWV3cyB0aGF0IGhhdmUKKyAgICAgICAgdGhlIHNh
bWUgdW5kZXJseWluZyBkYXRhIHBvaW50ZXIuIFdlIGNhbiBtYWtlIHRoZXNlIHR5cGVzIG9mIHVz
ZSBjYXNlcworICAgICAgICBtdWNoIGZhc3RlciBieSBkb2luZyBhbiBlYXJseSByZXR1cm4gaW4g
ZXF1YWxDb21tb24gd2hlbiB0aGUgdW5kZXJseWluZworICAgICAgICBTdHJpbmdUeXBlJ3MgaGF2
ZSBlcXVhbCBkYXRhIHBvaW50ZXJzLgorCisgICAgICAgICogd3RmL3RleHQvU3RyaW5nQ29tbW9u
Lmg6CisgICAgICAgIChXVEY6OmVxdWFsQ29tbW9uKToKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJp
bmdJbXBsLmg6CisgICAgICAgIChXVEY6OlN0cmluZ0ltcGw6OlN0cmluZ0ltcGwpOgorICAgICAg
ICAoV1RGOjpTdHJpbmdJbXBsOjpkYXRhKToKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdWaWV3
Lmg6CisgICAgICAgIChXVEY6OlN0cmluZ1ZpZXc6OmRhdGEpOgorCiAyMDE2LTA2LTA0ICBBbmRl
cnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgR2V0IHJpZCBvZiBX
b3JrSXRlbVdpbgpJbmRleDogU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdDb21tb24uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbW1vbi5oCShyZXZpc2lvbiAy
MDE3MzMpCisrKyBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbW1vbi5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMDAsNiArMzAwLDExIEBAIEFMV0FZU19JTkxJTkUgYm9vbCBlcXVhbENvbW1vbihj
b25zdCBTdHIKICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKCkpCiAgICAgICAgIHJldHVybiBm
YWxzZTsKIAorICAgIGlmIChhLmRhdGEoKSA9PSBiLmRhdGEoKSkgeworICAgICAgICBBU1NFUlQo
YS5pczhCaXQoKSA9PSBiLmlzOEJpdCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CiAgICAgaWYgKGEuaXM4Qml0KCkpIHsKICAgICAgICAgaWYgKGIuaXM4Qml0KCkpCiAgICAgICAg
ICAgICByZXR1cm4gZXF1YWwoYS5jaGFyYWN0ZXJzOCgpLCBiLmNoYXJhY3RlcnM4KCksIGxlbmd0
aCk7CkluZGV4OiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAkocmV2aXNpb24gMjAxNzMzKQorKysg
U291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzOSw2
ICsxMzksNyBAQCBjbGFzcyBTdHJpbmdJbXBsIHsKICAgICBmcmllbmQgc3RydWN0IFdURjo6VUNo
YXJCdWZmZXJUcmFuc2xhdG9yOwogICAgIGZyaWVuZCBjbGFzcyBKU0M6OkxMSW50OjpEYXRhOwog
ICAgIGZyaWVuZCBjbGFzcyBKU0M6OkxMSW50T2Zmc2V0c0V4dHJhY3RvcjsKKyAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBTdHJpbmdDbGFzc0EsIHR5cGVuYW1lIFN0cmluZ0NsYXNzQj4gZnJpZW5kIGJv
b2wgZXF1YWxDb21tb24oY29uc3QgU3RyaW5nQ2xhc3NBJiBhLCBjb25zdCBTdHJpbmdDbGFzc0Im
IGIpOwogICAgIAogcHJpdmF0ZToKICAgICBlbnVtIEJ1ZmZlck93bmVyc2hpcCB7CkBAIC0zMzUs
NiArMzM2LDggQEAgcHJpdmF0ZToKICAgICAgICAgU1RSSU5HX1NUQVRTX0FERF8xNkJJVF9TVFJJ
TkcyKG1fbGVuZ3RoLCB0cnVlKTsKICAgICB9CiAKKyAgICBjb25zdCB2b2lkKiBkYXRhKCkgY29u
c3QgeyByZXR1cm4gbV9kYXRhODsgfQorCiBwdWJsaWM6CiAgICAgV1RGX0VYUE9SVF9TVFJJTkdf
QVBJIHN0YXRpYyB2b2lkIGRlc3Ryb3koU3RyaW5nSW1wbCopOwogCkluZGV4OiBTb3VyY2UvV1RG
L3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0
L1N0cmluZ1ZpZXcuaAkocmV2aXNpb24gMjAxNzMzKQorKysgU291cmNlL1dURi93dGYvdGV4dC9T
dHJpbmdWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNSw2ICsxMzUsMTAgQEAgcHVibGljOgog
ICAgIHN0cnVjdCBVbmRlcmx5aW5nU3RyaW5nOwogCiBwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFN0cmluZ0NsYXNzQSwgdHlwZW5hbWUgU3RyaW5nQ2xhc3NCPiBmcmllbmQgYm9vbCBl
cXVhbENvbW1vbihjb25zdCBTdHJpbmdDbGFzc0EmIGEsIGNvbnN0IFN0cmluZ0NsYXNzQiYgYik7
CisKKyAgICBjb25zdCB2b2lkKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9jaGFyYWN0ZXJzOyB9
CisKICAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgTENoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwog
ICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7CiAK
</data>
<flag name="review"
          id="304553"
          type_id="1"
          status="+"
          setter="kling"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>280660</attachid>
            <date>2016-06-06 19:03:47 -0700</date>
            <delta_ts>2016-06-06 20:23:28 -0700</delta_ts>
            <desc>patch for landing</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>2070</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAyMDE3MzQpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDE2LTA2LTA2ICBTYWFtIEJhcmF0aSAgPHNiYXJh
dGlAYXBwbGUuY29tPgorCisgICAgICAgIGVxdWFsKFN0cmluZ1ZpZXcsIFN0cmluZ1ZpZXcpIGZv
ciBzdHJpbmdzIHNob3VsZCBoYXZlIGEgZmFzdCBwYXRoIGZvciBwb2ludGVyIGVxdWFsaXR5Cisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTg0NTIKKwor
ICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgorCisgICAgICAgIEpTQmVuY2ggZG9l
cyBhIGxvdCBvZiBTdHJpbmdWaWV3OjpvcGVyYXRvcj09IG9uIFN0cmluZ1ZpZXdzIHRoYXQgaGF2
ZQorICAgICAgICB0aGUgc2FtZSB1bmRlcmx5aW5nIGNoYXJhY3RlcnMgcG9pbnRlci4gVGhpcyBi
ZWNvbWVzIGhvdCBpbnNpZGUgSlNCZW5jaAorICAgICAgICBiZWNhdXNlIEpTQmVuY2ggaGVhdmls
eSBzdHJlc3NlcyBKU0MncyBVbmxpbmtlZENvZGVDYWNoZSB3aXRoIGEgaGlnaAorICAgICAgICBo
aXQgcmF0ZS4gVGhpcyBtZWFucyB0aGF0IHdoZW4gd2UgZ2V0IGEgaGl0IGluIHRoZSBjYWNoZSwg
d2UgdXNlZCB0bworICAgICAgICBkbyB0aGUgbG9uZyBmb3JtIG9mIHN0cmluZyBjb21wYXJlLiBI
b3dldmVyLCB3ZSB3ZXJlIG9mdGVuIGNvbXBhcmluZworICAgICAgICB0d28gU3RyaW5nVmlld3Mg
dGhhdCBoYWQgdGhlIHNhbWUgdW5kZXJseWluZyBidWZmZXIgYW5kIGxlbmd0aC4KKyAgICAgICAg
VGhpcyBwYXRjaCBzcGVlZHMgdGhpcyBjYXNlIHVwIHRvIHJ1biBpbiBjb25zdGFudCB0aW1lIGlu
c3RlYWQgb2YKKyAgICAgICAgbGluZWFyIHRpbWUuCisKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJp
bmdDb21tb24uaDoKKyAgICAgICAgKFdURjo6ZXF1YWxDb21tb24pOgorICAgICAgICAqIHd0Zi90
ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nSW1wbDo6U3RyaW5nSW1wbCk6
CisgICAgICAgIChXVEY6OlN0cmluZ0ltcGw6OmRhdGEpOgorICAgICAgICAqIHd0Zi90ZXh0L1N0
cmluZ1ZpZXcuaDoKKyAgICAgICAgKFdURjo6U3RyaW5nVmlldzo6ZGF0YSk6CisKIDIwMTYtMDYt
MDQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBHZXQg
cmlkIG9mIFdvcmtJdGVtV2luCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ1ZpZXcuaAkocmV2aXNp
b24gMjAxNzMzKQorKysgU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdWaWV3LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEzNSw2ICsxMzUsOCBAQCBwdWJsaWM6CiAgICAgc3RydWN0IFVuZGVybHlpbmdT
dHJpbmc7CiAKIHByaXZhdGU6CisgICAgZnJpZW5kIGJvb2wgZXF1YWwoU3RyaW5nVmlldywgU3Ry
aW5nVmlldyk7CisKICAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgTENoYXIqLCB1bnNpZ25lZCBs
ZW5ndGgpOwogICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0
aCk7CiAKQEAgLTUyNSw2ICs1MjcsMTEgQEAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyVHlw
ZSwgc2l6ZV90IAogCiBpbmxpbmUgYm9vbCBlcXVhbChTdHJpbmdWaWV3IGEsIFN0cmluZ1ZpZXcg
YikKIHsKKyAgICBpZiAoYS5tX2NoYXJhY3RlcnMgPT0gYi5tX2NoYXJhY3RlcnMpIHsKKyAgICAg
ICAgQVNTRVJUKGEuaXM4Qml0KCkgPT0gYi5pczhCaXQoKSk7CisgICAgICAgIHJldHVybiBhLmxl
bmd0aCgpID09IGIubGVuZ3RoKCk7CisgICAgfQorICAgICAgICAKICAgICByZXR1cm4gZXF1YWxD
b21tb24oYSwgYik7CiB9CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>