<?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>115410</bug_id>
          
          <creation_ts>2013-04-30 04:31:58 -0700</creation_ts>
          <short_desc>Change HashTraits&lt;RefPtr&lt;P&gt; &gt;::PassOutType to PassRefPtr for better performance</short_desc>
          <delta_ts>2013-05-06 09:41:13 -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>528+ (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="Mikhail Pozdnyakov">mikhail.pozdnyakov</reporter>
          <assigned_to name="Mikhail Pozdnyakov">mikhail.pozdnyakov</assigned_to>
          <cc>andersca</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>kling</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>883015</commentid>
    <comment_count>0</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-04-30 04:31:58 -0700</bug_when>
    <thetext>SSIA.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883018</commentid>
    <comment_count>1</comment_count>
      <attachid>200099</attachid>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-04-30 04:56:05 -0700</bug_when>
    <thetext>Created attachment 200099
WIP

Do we want to take after HashTraits&lt;OwnPtr&lt;P&gt; &gt; and use std::nullptr_t for EmptyValueType?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883020</commentid>
    <comment_count>2</comment_count>
      <attachid>200099</attachid>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-04-30 05:11:52 -0700</bug_when>
    <thetext>Comment on attachment 200099
WIP

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

&gt; Source/WTF/wtf/HashTraits.h:145
&gt; +        static PassRefPtr&lt;P&gt; passOut(const RefPtr&lt;P&gt;&amp; value) { return value; }

that would be better to call release here, but that would break constness.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883093</commentid>
    <comment_count>3</comment_count>
      <attachid>200099</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-04-30 08:59:07 -0700</bug_when>
    <thetext>Comment on attachment 200099
WIP

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

&gt;&gt; Source/WTF/wtf/HashTraits.h:145
&gt;&gt; +        static PassRefPtr&lt;P&gt; passOut(const RefPtr&lt;P&gt;&amp; value) { return value; }
&gt; 
&gt; that would be better to call release here, but that would break constness.

The release() is where the performance benefit comes from. So this is not useful to do without the release(). This should instead be:

    typedef PassRefPtr&lt;P&gt; PassOutType;
    static PassRefPtr&lt;P&gt; passOut(RefPtr&lt;P&gt;&amp; value) { return value.release(); }

Could you test to see if that compiles on various platforms and what it does?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883094</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-04-30 09:00:09 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; Do we want to take after HashTraits&lt;OwnPtr&lt;P&gt; &gt; and use std::nullptr_t for EmptyValueType?

Yes, I think we will need to do that so that the take function compiles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883228</commentid>
    <comment_count>5</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-04-30 14:21:35 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 200099 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=200099&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WTF/wtf/HashTraits.h:145
&gt; &gt;&gt; +        static PassRefPtr&lt;P&gt; passOut(const RefPtr&lt;P&gt;&amp; value) { return value; }
&gt; &gt; 
&gt; &gt; that would be better to call release here, but that would break constness.
&gt; 
&gt; The release() is where the performance benefit comes from. So this is not useful to do without the release(). 
This should instead be:
&gt; 
&gt;     typedef PassRefPtr&lt;P&gt; PassOutType;
&gt;     static PassRefPtr&lt;P&gt; passOut(RefPtr&lt;P&gt;&amp; value) { return value.release(); }
&gt; 
&gt; Could you test to see if that compiles on various platforms and what it does?

in order to make it compile-able we will need to use std::nullptr_t as empty type, provide corresponding constructors to RefPtr/PassRefPtr and probably also add one more equal() method to hash translator.. but I can do it :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883738</commentid>
    <comment_count>6</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-02 01:51:55 -0700</bug_when>
    <thetext>&gt; &gt; The release() is where the performance benefit comes from. So this is not useful to do without the release(). 
&gt; This should instead be:
&gt; &gt; 
&gt; &gt;     typedef PassRefPtr&lt;P&gt; PassOutType;
&gt; &gt;     static PassRefPtr&lt;P&gt; passOut(RefPtr&lt;P&gt;&amp; value) { return value.release(); }
&gt; &gt; 
&gt; &gt; Could you test to see if that compiles on various platforms and what it does?
&gt; 
&gt; in order to make it compile-able we will need to use std::nullptr_t as empty type, provide corresponding constructors to RefPtr/PassRefPtr and probably also add one more equal() method to hash translator.. but I can do it :)

This is actually much more complex to support std::nullptr_t as empty type:
1) there is necessity to add &quot;==&quot; operators accepting nullptr into a lot of places.
2) having both constructors accepting raw pointer to &apos;T&apos; and std::nullptr_t inside RefPtr/PassRefPtr brings ambiguousness to some calls.

So I would choose another way of solving the initial compiling issue:
having following method inside HashTraits&lt;RefPtr&lt;P&gt; &gt;

       static RefPtr&lt;P&gt;&amp; emptyValue()
        {
            static RefPtr&lt;P&gt;&amp; null = *(new RefPtr&lt;P&gt;);
            return null;
        }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883740</commentid>
    <comment_count>7</comment_count>
      <attachid>200304</attachid>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-02 01:53:43 -0700</bug_when>
    <thetext>Created attachment 200304
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883813</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-02 09:22:55 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; So I would choose another way of solving the initial compiling issue:
&gt; having following method inside HashTraits&lt;RefPtr&lt;P&gt; &gt;
&gt; 
&gt;        static RefPtr&lt;P&gt;&amp; emptyValue()
&gt;         {
&gt;             static RefPtr&lt;P&gt;&amp; null = *(new RefPtr&lt;P&gt;);
&gt;             return null;
&gt;         }

This won’t be good for performance. Null needs to be more efficient than this. Please don’t do this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>883814</commentid>
    <comment_count>9</comment_count>
      <attachid>200304</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-02 09:25:43 -0700</bug_when>
    <thetext>Comment on attachment 200304
patch

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

If we are having trouble making nullptr work, maybe we can make a zero work? I’m sure there is some way to do this. I think you are learning now why I landed this with a FIXME rather than doing this task originally.

&gt; Source/WTF/wtf/HashTraits.h:145
&gt; +        static RefPtr&lt;P&gt;&amp; emptyValue()
&gt; +        {
&gt; +            static RefPtr&lt;P&gt;&amp; null = *(new RefPtr&lt;P&gt;);
&gt; +            return null;
&gt; +        }

I understand this is easier to get right than the alternative, but it’s not going to be efficient to fetch a global variable all the time. Since the whole point of this is to get better performance, we must not make this change!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>884130</commentid>
    <comment_count>10</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-03 04:07:53 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 200304 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=200304&amp;action=review
&gt; 
&gt; If we are having trouble making nullptr work, maybe we can make a zero work? 
think it&apos;s gonna work with &apos;0&apos;.

I’m sure there is some way to do this. I think you are learning now why I landed this with a FIXME rather than doing this task originally.
yeah I got it :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>884131</commentid>
    <comment_count>11</comment_count>
      <attachid>200406</attachid>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-03 04:13:28 -0700</bug_when>
    <thetext>Created attachment 200406
patch v2

Use &apos;0&apos; as empty value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>884146</commentid>
    <comment_count>12</comment_count>
      <attachid>200406</attachid>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-03 05:27:08 -0700</bug_when>
    <thetext>Comment on attachment 200406
patch v2

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

&gt; Source/WTF/wtf/HashTraits.h:141
&gt; +        static P* emptyValue() { return 0; }

it&apos;s probably worth adding &quot;static const bool emptyValueIsZero = true;&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>884147</commentid>
    <comment_count>13</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-03 05:33:20 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Created an attachment (id=200406) [details]
&gt; patch v2
&gt; 
&gt; Use &apos;0&apos; as empty value.

An alternate solution could be the following:

template&lt;typename P&gt; struct HashTraits&lt;RefPtr&lt;P&gt; &gt; : SimpleClassHashTraits&lt;RefPtr&lt;P&gt; &gt; {
        ..........
        typedef PassRefPtr&lt;P&gt; PassOutType;
        static PassRefPtr&lt;P&gt; passOut(RefPtr&lt;P&gt;&amp; value) { return value.release(); }
        static PassRefPtr&lt;P&gt; passOut(const RefPtr&lt;P&gt;&amp; value) // Overload for temporary, must be used for empty value only.
        {
            ASSERT(!value);
            return 0;
        }
    };

what do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>885041</commentid>
    <comment_count>14</comment_count>
      <attachid>200406</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-05-06 09:07:46 -0700</bug_when>
    <thetext>Comment on attachment 200406
patch v2

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

&gt; Source/WTF/wtf/HashTable.h:304
&gt;          template&lt;typename T&gt; static bool equal(const T&amp; a, const T&amp; b) { return HashFunctions::equal(a, b); }
&gt; +        template&lt;typename T, typename U&gt; static bool equal(const T&amp; a, const U&amp; b) { return HashFunctions::equal(a, b); }

When we add the two-type equal function template, we should remove the old single-type function template. No need to keep both.

&gt;&gt; Source/WTF/wtf/HashTraits.h:141
&gt;&gt; +        static P* emptyValue() { return 0; }
&gt; 
&gt; it&apos;s probably worth adding &quot;static const bool emptyValueIsZero = true;&quot;

Doesn’t need to be added. SimpleClassHashTraits provides that.

&gt; Source/WTF/wtf/HashTraits.h:149
&gt; +        static PassRefPtr&lt;P&gt; passOut(P* value) { return value; }
&gt;          // FIXME: We should consider changing PeekType to a raw pointer for better performance,

I suggest a blank line here so that PassOutType and PeekType are in separate paragraphs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>885067</commentid>
    <comment_count>15</comment_count>
    <who name="Mikhail Pozdnyakov">mikhail.pozdnyakov</who>
    <bug_when>2013-05-06 09:41:13 -0700</bug_when>
    <thetext>Committed r149602: &lt;http://trac.webkit.org/changeset/149602&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>200099</attachid>
            <date>2013-04-30 04:56:05 -0700</date>
            <delta_ts>2013-05-02 01:53:43 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>bug115410</filename>
            <type>text/plain</type>
            <size>1650</size>
            <attacher name="Mikhail Pozdnyakov">mikhail.pozdnyakov</attacher>
            
              <data encoding="base64">Y29tbWl0IDkwYzIyZWM3OWViZmQ2YjBkY2YxMzQyNDM1ODVhNzJiYWRmYjA0NDYKQXV0aG9yOiBN
aWtoYWlsIFBvemRueWFrb3YgPG1pa2hhaWwucG96ZG55YWtvdkBpbnRlbC5jb20+CkRhdGU6ICAg
VHVlIEFwciAzMCAxNDo1MDo0MyAyMDEzICswMzAwCgogICAgYnVnMTE1NDEwCgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCAxM2Vi
MTVmLi4zZmUxYzFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEzLTA0LTMwICBNaWtoYWlsIFBv
emRueWFrb3YgIDxtaWtoYWlsLnBvemRueWFrb3ZAaW50ZWwuY29tPgorCisgICAgICAgIENoYW5n
ZSBIYXNoVHJhaXRzPFJlZlB0cjxQPiA+OjpQYXNzT3V0VHlwZSB0byBQYXNzUmVmUHRyIGZvciBi
ZXR0ZXIgcGVyZm9ybWFuY2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTExNTQxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFRoZSB0eXBlIEhhc2hUcmFpdHM8UmVmUHRyPFA+ID46OlBhc3NPdXRUeXBlIGlz
IFBhc3NSZWZQdHIgbm93IHRvCisgICAgICAgIGF2b2lkIGV4dHJhIHJlZi91bnJlZmluZyBvbiBy
ZXR1cm4gZnJvbSBIYXNoTWFwIG1ldGhvZHMgdGhhdCB0cmFuc2ZlcgorICAgICAgICBvd25lcnNo
aXAsIHN1Y2ggYXMgdGFrZS4KKworICAgICAgICAqIHd0Zi9IYXNoVHJhaXRzLmg6CisKIDIwMTMt
MDQtMjkgIENvc21pbiBUcnV0YSAgPGN0cnV0YUBibGFja2JlcnJ5LmNvbT4KIAogICAgICAgICBb
QVJNXSBFeHBhbmQgdGhlIHVzZSBvZiBpbnRlZ2VyIGRpdmlzaW9uCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV1RGL3d0Zi9IYXNoVHJhaXRzLmggYi9Tb3VyY2UvV1RGL3d0Zi9IYXNoVHJhaXRzLmgKaW5k
ZXggYjA2ZTc4NS4uM2NlYmE1NCAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvSGFzaFRyYWl0
cy5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL0hhc2hUcmFpdHMuaApAQCAtMTQxLDcgKzE0MSw4IEBA
IG5hbWVzcGFjZSBXVEYgewogICAgICAgICB0eXBlZGVmIFBhc3NSZWZQdHI8UD4gUGFzc0luVHlw
ZTsKICAgICAgICAgc3RhdGljIHZvaWQgc3RvcmUoUGFzc1JlZlB0cjxQPiB2YWx1ZSwgUmVmUHRy
PFA+JiBzdG9yYWdlKSB7IHN0b3JhZ2UgPSB2YWx1ZTsgfQogCi0gICAgICAgIC8vIEZJWE1FOiBX
ZSBzaG91bGQgY2hhbmdlIFBhc3NPdXRUeXBlIHRvIFBhc3NSZWZQdHIgZm9yIGJldHRlciBwZXJm
b3JtYW5jZS4KKyAgICAgICAgdHlwZWRlZiBQYXNzUmVmUHRyPFA+IFBhc3NPdXRUeXBlOworICAg
ICAgICBzdGF0aWMgUGFzc1JlZlB0cjxQPiBwYXNzT3V0KGNvbnN0IFJlZlB0cjxQPiYgdmFsdWUp
IHsgcmV0dXJuIHZhbHVlOyB9CiAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY29uc2lkZXIg
Y2hhbmdpbmcgUGVla1R5cGUgdG8gYSByYXcgcG9pbnRlciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNl
LAogICAgICAgICAvLyBidXQgdGhlbiBjYWxsZXJzIHdvbid0IG5lZWQgdG8gY2FsbCBnZXQ7IGRv
aW5nIHNvIHdpbGwgcmVxdWlyZSB1cGRhdGluZyBtYW55IGNhbGwgc2l0ZXMuCiAgICAgfTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>200304</attachid>
            <date>2013-05-02 01:53:43 -0700</date>
            <delta_ts>2013-05-03 04:13:28 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug115410</filename>
            <type>text/plain</type>
            <size>1906</size>
            <attacher name="Mikhail Pozdnyakov">mikhail.pozdnyakov</attacher>
            
              <data encoding="base64">Y29tbWl0IDI1ODVlMGI2Y2I4YjlhMzQwZWQ1ZjBhZDYwNzI0ZjQ1OWEzNmZlZWQKQXV0aG9yOiBN
aWtoYWlsIFBvemRueWFrb3YgPG1pa2hhaWwucG96ZG55YWtvdkBpbnRlbC5jb20+CkRhdGU6ICAg
VHVlIEFwciAzMCAxNDo1MDo0MyAyMDEzICswMzAwCgogICAgYnVnMTE1NDEwCgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCAxM2Vi
MTVmLi4zZmUxYzFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEzLTA0LTMwICBNaWtoYWlsIFBv
emRueWFrb3YgIDxtaWtoYWlsLnBvemRueWFrb3ZAaW50ZWwuY29tPgorCisgICAgICAgIENoYW5n
ZSBIYXNoVHJhaXRzPFJlZlB0cjxQPiA+OjpQYXNzT3V0VHlwZSB0byBQYXNzUmVmUHRyIGZvciBi
ZXR0ZXIgcGVyZm9ybWFuY2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTExNTQxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFRoZSB0eXBlIEhhc2hUcmFpdHM8UmVmUHRyPFA+ID46OlBhc3NPdXRUeXBlIGlz
IFBhc3NSZWZQdHIgbm93IHRvCisgICAgICAgIGF2b2lkIGV4dHJhIHJlZi91bnJlZmluZyBvbiBy
ZXR1cm4gZnJvbSBIYXNoTWFwIG1ldGhvZHMgdGhhdCB0cmFuc2ZlcgorICAgICAgICBvd25lcnNo
aXAsIHN1Y2ggYXMgdGFrZS4KKworICAgICAgICAqIHd0Zi9IYXNoVHJhaXRzLmg6CisKIDIwMTMt
MDQtMjkgIENvc21pbiBUcnV0YSAgPGN0cnV0YUBibGFja2JlcnJ5LmNvbT4KIAogICAgICAgICBb
QVJNXSBFeHBhbmQgdGhlIHVzZSBvZiBpbnRlZ2VyIGRpdmlzaW9uCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV1RGL3d0Zi9IYXNoVHJhaXRzLmggYi9Tb3VyY2UvV1RGL3d0Zi9IYXNoVHJhaXRzLmgKaW5k
ZXggYjA2ZTc4NS4uNjlkZjhiNyAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvSGFzaFRyYWl0
cy5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL0hhc2hUcmFpdHMuaApAQCAtMTM4LDEwICsxMzgsMTcg
QEAgbmFtZXNwYWNlIFdURiB7CiAgICAgfTsKIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+IHN0
cnVjdCBIYXNoVHJhaXRzPFJlZlB0cjxQPiA+IDogU2ltcGxlQ2xhc3NIYXNoVHJhaXRzPFJlZlB0
cjxQPiA+IHsKKyAgICAgICAgc3RhdGljIFJlZlB0cjxQPiYgZW1wdHlWYWx1ZSgpCisgICAgICAg
IHsKKyAgICAgICAgICAgIHN0YXRpYyBSZWZQdHI8UD4mIG51bGwgPSAqKG5ldyBSZWZQdHI8UD4p
OworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKwogICAgICAgICB0eXBlZGVm
IFBhc3NSZWZQdHI8UD4gUGFzc0luVHlwZTsKICAgICAgICAgc3RhdGljIHZvaWQgc3RvcmUoUGFz
c1JlZlB0cjxQPiB2YWx1ZSwgUmVmUHRyPFA+JiBzdG9yYWdlKSB7IHN0b3JhZ2UgPSB2YWx1ZTsg
fQogCi0gICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hhbmdlIFBhc3NPdXRUeXBlIHRvIFBh
c3NSZWZQdHIgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgdHlwZWRlZiBQYXNzUmVm
UHRyPFA+IFBhc3NPdXRUeXBlOworICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxQPiBwYXNzT3V0
KFJlZlB0cjxQPiYgdmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlbGVhc2UoKTsgfQogICAgICAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkIGNvbnNpZGVyIGNoYW5naW5nIFBlZWtUeXBlIHRvIGEgcmF3IHBv
aW50ZXIgZm9yIGJldHRlciBwZXJmb3JtYW5jZSwKICAgICAgICAgLy8gYnV0IHRoZW4gY2FsbGVy
cyB3b24ndCBuZWVkIHRvIGNhbGwgZ2V0OyBkb2luZyBzbyB3aWxsIHJlcXVpcmUgdXBkYXRpbmcg
bWFueSBjYWxsIHNpdGVzLgogICAgIH07Cg==
</data>
<flag name="review"
          id="221769"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>200406</attachid>
            <date>2013-05-03 04:13:28 -0700</date>
            <delta_ts>2013-05-06 09:07:46 -0700</delta_ts>
            <desc>patch v2</desc>
            <filename>bug115410_v2</filename>
            <type>text/plain</type>
            <size>2625</size>
            <attacher name="Mikhail Pozdnyakov">mikhail.pozdnyakov</attacher>
            
              <data encoding="base64">Y29tbWl0IDFkZjBlOTJkMmJmNGMwOWZkNTRkNWUxNzY5MmIxOGM2OGRmNjc3NjAKQXV0aG9yOiBN
aWtoYWlsIFBvemRueWFrb3YgPG1pa2hhaWwucG96ZG55YWtvdkBpbnRlbC5jb20+CkRhdGU6ICAg
VHVlIEFwciAzMCAxNDo1MDo0MyAyMDEzICswMzAwCgogICAgYnVnMTE1NDEwCgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dURi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV1RGL0NoYW5nZUxvZwppbmRleCA3OWI1
MDY4Li5lMDYyNGU4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZworKysgYi9Tb3Vy
Y2UvV1RGL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDEzLTA1LTAzICBNaWtoYWlsIFBv
emRueWFrb3YgIDxtaWtoYWlsLnBvemRueWFrb3ZAaW50ZWwuY29tPgorCisgICAgICAgIENoYW5n
ZSBIYXNoVHJhaXRzPFJlZlB0cjxQPiA+OjpQYXNzT3V0VHlwZSB0byBQYXNzUmVmUHRyIGZvciBi
ZXR0ZXIgcGVyZm9ybWFuY2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTExNTQxMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFRoZSB0eXBlIEhhc2hUcmFpdHM8UmVmUHRyPFA+ID46OlBhc3NPdXRUeXBlIGlz
IFBhc3NSZWZQdHIgbm93IHRvCisgICAgICAgIGF2b2lkIGV4dHJhIHJlZi91bnJlZmluZyBvbiBy
ZXR1cm4gZnJvbSBIYXNoTWFwIG1ldGhvZHMgdGhhdCB0cmFuc2ZlcgorICAgICAgICBvd25lcnNo
aXAsIHN1Y2ggYXMgdGFrZS4KKworICAgICAgICAqIHd0Zi9IYXNoVGFibGUuaDoKKyAgICAgICAg
KFdURjo6SWRlbnRpdHlIYXNoVHJhbnNsYXRvcjo6ZXF1YWwpOgorICAgICAgICAqIHd0Zi9IYXNo
VHJhaXRzLmg6CisKIDIwMTMtMDUtMDIgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUB3ZWJraXQu
b3JnPgogCiAgICAgICAgIFtXaW5DYWlyb10gVW5yZXZpZXdlZCBidWlsZCBmaXguCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV1RGL3d0Zi9IYXNoVGFibGUuaCBiL1NvdXJjZS9XVEYvd3RmL0hhc2hUYWJs
ZS5oCmluZGV4IGJiNzhjNjYuLjU2OWI1MGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL0hh
c2hUYWJsZS5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL0hhc2hUYWJsZS5oCkBAIC0zMDEsNiArMzAx
LDcgQEAgbmFtZXNwYWNlIFdURiB7CiAgICAgcHVibGljOgogICAgICAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBUPiBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUJiBrZXkpIHsgcmV0dXJuIEhhc2hG
dW5jdGlvbnM6Omhhc2goa2V5KTsgfQogICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0
aWMgYm9vbCBlcXVhbChjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7IHJldHVybiBIYXNoRnVuY3Rp
b25zOjplcXVhbChhLCBiKTsgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFt
ZSBVPiBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUJiBhLCBjb25zdCBVJiBiKSB7IHJldHVybiBI
YXNoRnVuY3Rpb25zOjplcXVhbChhLCBiKTsgfQogICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
LCB0eXBlbmFtZSBVPiBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoVCYgbG9jYXRpb24sIGNvbnN0IFUm
LCBjb25zdCBUJiB2YWx1ZSkgeyBsb2NhdGlvbiA9IHZhbHVlOyB9CiAgICAgfTsKIApkaWZmIC0t
Z2l0IGEvU291cmNlL1dURi93dGYvSGFzaFRyYWl0cy5oIGIvU291cmNlL1dURi93dGYvSGFzaFRy
YWl0cy5oCmluZGV4IGIwNmU3ODUuLmFlNGY4MGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3Rm
L0hhc2hUcmFpdHMuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi9IYXNoVHJhaXRzLmgKQEAgLTEzOCwx
MCArMTM4LDE0IEBAIG5hbWVzcGFjZSBXVEYgewogICAgIH07CiAKICAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBQPiBzdHJ1Y3QgSGFzaFRyYWl0czxSZWZQdHI8UD4gPiA6IFNpbXBsZUNsYXNzSGFzaFRy
YWl0czxSZWZQdHI8UD4gPiB7CisgICAgICAgIHN0YXRpYyBQKiBlbXB0eVZhbHVlKCkgeyByZXR1
cm4gMDsgfQorCiAgICAgICAgIHR5cGVkZWYgUGFzc1JlZlB0cjxQPiBQYXNzSW5UeXBlOwogICAg
ICAgICBzdGF0aWMgdm9pZCBzdG9yZShQYXNzUmVmUHRyPFA+IHZhbHVlLCBSZWZQdHI8UD4mIHN0
b3JhZ2UpIHsgc3RvcmFnZSA9IHZhbHVlOyB9CiAKLSAgICAgICAgLy8gRklYTUU6IFdlIHNob3Vs
ZCBjaGFuZ2UgUGFzc091dFR5cGUgdG8gUGFzc1JlZlB0ciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNl
LgorICAgICAgICB0eXBlZGVmIFBhc3NSZWZQdHI8UD4gUGFzc091dFR5cGU7CisgICAgICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFA+IHBhc3NPdXQoUmVmUHRyPFA+JiB2YWx1ZSkgeyByZXR1cm4gdmFs
dWUucmVsZWFzZSgpOyB9CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFA+IHBhc3NPdXQoUCog
dmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9CiAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY29u
c2lkZXIgY2hhbmdpbmcgUGVla1R5cGUgdG8gYSByYXcgcG9pbnRlciBmb3IgYmV0dGVyIHBlcmZv
cm1hbmNlLAogICAgICAgICAvLyBidXQgdGhlbiBjYWxsZXJzIHdvbid0IG5lZWQgdG8gY2FsbCBn
ZXQ7IGRvaW5nIHNvIHdpbGwgcmVxdWlyZSB1cGRhdGluZyBtYW55IGNhbGwgc2l0ZXMuCiAgICAg
fTsK
</data>
<flag name="review"
          id="221854"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>