<?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>96042</bug_id>
          
          <creation_ts>2012-09-06 17:12:34 -0700</creation_ts>
          <short_desc>Specialize nextBreakablePosition depending on breakNBSP</short_desc>
          <delta_ts>2012-09-10 16:40:02 -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>Layout and Rendering</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="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Benjamin Poulain">benjamin</assigned_to>
          <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>mitz</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>713877</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-06 17:12:34 -0700</bug_when>
    <thetext>This inner loop must be tighter!!!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>713907</commentid>
    <comment_count>1</comment_count>
      <attachid>162630</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-06 17:33:26 -0700</bug_when>
    <thetext>Created attachment 162630
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>713933</commentid>
    <comment_count>2</comment_count>
      <attachid>162630</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-09-06 17:54:17 -0700</bug_when>
    <thetext>Comment on attachment 162630
Patch

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

That&apos;s a surprisingly small gain.  Did you compare the instrument samples to see what the % change of this function is?

&gt; Source/WebCore/rendering/break_lines.cpp:149
&gt; +template&lt;&gt;
&gt; +inline bool needsLineBreakIterator&lt;false&gt;(UChar ch)
&gt;  {
&gt;      return ch &gt; asciiLineBreakTableLastChar &amp;&amp; ch != noBreakSpace;
&gt;  }

Can&apos;t we write this as a single function?  the compiler should optimize out useless branches you should jsut be able to have if (treatNoBreakSpaceAsBreak) in the shared implementation and have the compiler do the right thing?

&gt; Source/WebCore/rendering/break_lines.cpp:194
&gt; +int nextBreakablePositionBreakOnNBSP(LazyLineBreakIterator&amp; lazyBreakIterator, int pos)

By OnNBSP? do you mean IncludingNBSP?  I&apos;m not quite sure what this function name means.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>713952</commentid>
    <comment_count>3</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-06 18:12:08 -0700</bug_when>
    <thetext>&gt; That&apos;s a surprisingly small gain. 

How much do you want? :)
There are not really low hanging fruits left.

&gt; Did you compare the instrument samples to see what the % change of this function is?

On the function itself, Instruments give ~9-10% faster.

I guess could get better numbers with DTrace if you want exact numbers.

&gt; &gt; Source/WebCore/rendering/break_lines.cpp:149
&gt; &gt; +template&lt;&gt;
&gt; &gt; +inline bool needsLineBreakIterator&lt;false&gt;(UChar ch)
&gt; &gt;  {
&gt; &gt;      return ch &gt; asciiLineBreakTableLastChar &amp;&amp; ch != noBreakSpace;
&gt; &gt;  }
&gt; 
&gt; Can&apos;t we write this as a single function?  the compiler should optimize out useless branches you should jsut be able to have if (treatNoBreakSpaceAsBreak) in the shared implementation and have the compiler do the right thing?

It could in one case but I prefer to be explicit.
IMHO we should not rely blindly on compiler optimizations since this is a hotspot.


&gt; &gt; Source/WebCore/rendering/break_lines.cpp:194
&gt; &gt; +int nextBreakablePositionBreakOnNBSP(LazyLineBreakIterator&amp; lazyBreakIterator, int pos)
&gt; 
&gt; By OnNBSP? do you mean IncludingNBSP?  I&apos;m not quite sure what this function name means.

Yep indeed, this name is bad.

nextBreakablePositionBreakIncludingBreakOnNBSP ?
Long but explicit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>714046</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-09-06 20:30:47 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; &gt; That&apos;s a surprisingly small gain. 
&gt; 
&gt; How much do you want? :)
&gt; There are not really low hanging fruits left.
&gt; 
&gt; &gt; Did you compare the instrument samples to see what the % change of this function is?
&gt; 
&gt; On the function itself, Instruments give ~9-10% faster.
&gt; 
&gt; I guess could get better numbers with DTrace if you want exact numbers.

Nah, that&apos;s fine. :)  I remember seeing this function as being about 5% of total time.  With your change I would expect it to be much less than 5% if we&apos;re seeing a 3% overall win.

&gt; &gt; &gt; Source/WebCore/rendering/break_lines.cpp:149
&gt; &gt; &gt; +template&lt;&gt;
&gt; &gt; &gt; +inline bool needsLineBreakIterator&lt;false&gt;(UChar ch)
&gt; &gt; &gt;  {
&gt; &gt; &gt;      return ch &gt; asciiLineBreakTableLastChar &amp;&amp; ch != noBreakSpace;
&gt; &gt; &gt;  }
&gt; &gt; 
&gt; &gt; Can&apos;t we write this as a single function?  the compiler should optimize out useless branches you should jsut be able to have if (treatNoBreakSpaceAsBreak) in the shared implementation and have the compiler do the right thing?
&gt; 
&gt; It could in one case but I prefer to be explicit.
&gt; IMHO we should not rely blindly on compiler optimizations since this is a hotspot.

I guess. :)  It would be an extremely dumb compiler to not remove unreachable code!

&gt; &gt; &gt; Source/WebCore/rendering/break_lines.cpp:194
&gt; &gt; &gt; +int nextBreakablePositionBreakOnNBSP(LazyLineBreakIterator&amp; lazyBreakIterator, int pos)
&gt; &gt; 
&gt; &gt; By OnNBSP? do you mean IncludingNBSP?  I&apos;m not quite sure what this function name means.
&gt; 
&gt; Yep indeed, this name is bad.
&gt; 
&gt; nextBreakablePositionBreakIncludingBreakOnNBSP ?
&gt; Long but explicit.

Thinking about it more, I might just go the other way.  Have the &quot;including NBSP&quot; one just be &quot;nextBreakablePosition&quot; and the non-NBSP one be &quot;nextBreakablePositionIgnoringNBSP&quot;.  Your call.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>715263</commentid>
    <comment_count>5</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-07 22:14:47 -0700</bug_when>
    <thetext>&gt; &gt; It could in one case but I prefer to be explicit.
&gt; &gt; IMHO we should not rely blindly on compiler optimizations since this is a hotspot.
&gt; 
&gt; I guess. :)  It would be an extremely dumb compiler to not remove unreachable code!

Reading back, I realize I totally misunderstood you.

I originally thought you were asking to rewrite this in a way that the compiler know the ch test is useless. I figured, sure, that is gonna be tricky but should be possible. :)

Now that I see what you really asked... sure, I can change to if (treatNoBreakSpaceAsBreak) :-D

&gt; Thinking about it more, I might just go the other way.  Have the &quot;including NBSP&quot; one just be &quot;nextBreakablePosition&quot; and the non-NBSP one be &quot;nextBreakablePositionIgnoringNBSP&quot;.  Your call.

Changing to nextBreakablePositionIgnoringNBSP() is ok with me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>715268</commentid>
    <comment_count>6</comment_count>
      <attachid>162942</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-07 22:38:01 -0700</bug_when>
    <thetext>Created attachment 162942
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>715274</commentid>
    <comment_count>7</comment_count>
      <attachid>162942</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-09-07 23:03:34 -0700</bug_when>
    <thetext>Comment on attachment 162942
Patch

Assuming this is still a similar win, sounds great!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>715388</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-08 17:35:27 -0700</bug_when>
    <thetext>Committed r127974: &lt;http://trac.webkit.org/changeset/127974&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>716674</commentid>
    <comment_count>9</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2012-09-10 16:40:02 -0700</bug_when>
    <thetext>The chrome bots get the expected improvements: http://webkit-perf.appspot.com/graph.html#tests=[[2947022,2001,3001]]&amp;sel=none&amp;displayrange=7&amp;datatype=running

The Mac ones do not: http://webkit-perf.appspot.com/graph.html#tests=[[2947022,2001,32196]]&amp;sel=none&amp;displayrange=7&amp;datatype=running

Locally, on Mac, I get the same results as the Chrome bots.
I have no explanation for the bot results. :(</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>162630</attachid>
            <date>2012-09-06 17:33:26 -0700</date>
            <delta_ts>2012-09-07 22:37:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-96042-20120906173307.patch</filename>
            <type>text/plain</type>
            <size>5981</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI3Njg3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjQ5N2E4MDM1YWNkNGI4
ZjFmNWNlOWUwZDQxNGJjMDdkOTkzZmE3My4uMDIwMWFmODk5MzVhNTVkZjE4YTJkMGFiYzY1MDQ4
NDc5ZGJmYjI4YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM1IEBACisyMDEyLTA5LTA2ICBCZW5q
YW1pbiBQb3VsYWluICA8YnBvdWxhaW5AYXBwbGUuY29tPgorCisgICAgICAgIFNwZWNpYWxpemUg
bmV4dEJyZWFrYWJsZVBvc2l0aW9uIGRlcGVuZGluZyBvbiBicmVha05CU1AKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk2MDQyCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIHNwZWVkIG9mIGlzQnJlYWth
YmxlU3BhY2UoKSBpcyBsaW1pdGVkIGJ5IHRoZSBzcGVlZCBvZiB0aGUgaW5uZXIgbG9vcCBvZiBu
ZXh0QnJlYWthYmxlUG9zaXRpb24oKS4KKyAgICAgICAgVGhlIGJyYW5jaGVzIGRvbmUgdG8gaGFu
ZGxlIG5vQnJlYWtTcGFjZSBjYW4gYmUgc2ltcGxpZmllZCBvdXRzaWRlIHRoZSBsb29wCisgICAg
ICAgIHRvIHJlZHVjZSB0aGUgbnVtYmVycyBvZiB0ZXN0IGluc2lkZSB0aGUgbG9vcC4KKworICAg
ICAgICBUaGlzIHBhdGNoIHNwbGl0IHRoZSBjb2RlIG9mIG5leHRCcmVha2FibGVQb3NpdGlvbigp
IGluIHR3byBmdW5jdGlvbiwgZGVwZW5kaW5nIGlmIGJyZWFrTkJTUCBpcyB0cnVlCisgICAgICAg
IG9yIGZhbHNlLgorCisgICAgICAgIElmIGJyZWFrTkJTUCBpcyB0cnVlLCBpc0JyZWFrYWJsZVNw
YWNlKCkgd291bGQgcmV0dXJuIHRydWUgb24gbm9CcmVha1NwYWNlLgorICAgICAgICAtPlRoZXJl
IGlzIG5vIG5lZWQgdG8gdGVzdCB0aGF0IHZhbHVlIGFnYWluIGZvciBuZWVkc0xpbmVCcmVha0l0
ZXJhdG9yKCkuCisgICAgICAgIC0+VGhlcmUgaXMgbm8gbmVlZCB0byBzcGVjaWFsIGNhc2UgdGhl
IHN3aXRjaCgpIG9mIGlzQnJlYWthYmxlU3BhY2UoKSBmb3Igbm9CcmVha1NwYWNlLgorCisgICAg
ICAgIElmIGJyZWFrTkJTUCBpcyBmYWxzZToKKyAgICAgICAgLT5pc0JyZWFrYWJsZVNwYWNlKCkg
ZG9lcyBub3QgbmVlZCB0byB0ZXN0IGZvciBub0JyZWFrU3BhY2UuCisKKyAgICAgICAgT24geDg2
XzY0LCB0aGlzIGltcHJvdmVzIFBlcmZvcm1hbmNlVGVzdHMvTGF5b3V0L2xpbmUtbGF5b3V0Lmh0
bWwgYnkgMi44JS4KKworICAgICAgICAqIHJlbmRlcmluZy9icmVha19saW5lcy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjppc0JyZWFrYWJsZVNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OmZhbHNl
KToKKyAgICAgICAgKFdlYkNvcmU6OnRydWUpOgorICAgICAgICAoV2ViQ29yZTo6bmV4dEJyZWFr
YWJsZVBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRCcmVha2FibGVQb3NpdGlvbkJy
ZWFrT25OQlNQKToKKyAgICAgICAgKiByZW5kZXJpbmcvYnJlYWtfbGluZXMuaDoKKyAgICAgICAg
KFdlYkNvcmU6OmlzQnJlYWthYmxlKTogUmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBicmVh
a05CU1AsIG5vIGNhbGxlciBpcyB1c2luZyBpdC4KKwogMjAxMi0wOS0wNSAgSmFtZXMgUm9iaW5z
b24gIDxqYW1lc3JAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gUHV0IHdlYmNv
cmVfcGxhdGZvcm1fZmlsZXMgaW4gc2VwYXJhdGUgZ3lwIHRhcmdldCBpbnN0ZWFkIG9mIHJlbHlp
bmcgb24gZXhjbHVzaW9uIHBhdHRlcm5zCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvYnJlYWtfbGluZXMuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2JyZWFrX2xp
bmVzLmNwcAppbmRleCA0YmJhM2NlN2U3OTlhYmVlYzQyMGVjNzdlY2I3MjA3NjkxZjZiZDBmLi42
ZjgwNDI5OTQ5M2FkNWJkN2MzY2U0OWE2ZTJkNzFjNWFlMjFiYzQ3IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9icmVha19saW5lcy5jcHAKQEAgLTM4LDcgKzM4LDggQEAKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNCcmVha2FibGVTcGFjZShVQ2hhciBj
aCwgYm9vbCB0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWspCit0ZW1wbGF0ZTxib29sIHRyZWF0Tm9C
cmVha1NwYWNlQXNCcmVhaz4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0JyZWFrYWJsZVNwYWNlKFVD
aGFyIGNoKQogewogICAgIHN3aXRjaCAoY2gpIHsKICAgICBjYXNlICcgJzoKQEAgLTEzOCwxMiAr
MTM5LDIzIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRCcmVha0FmdGVyKFVDaGFyIGxhc3RD
aCwgVUNoYXIgY2gsIFVDaGFyIG5leHRDaCkKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRp
YyBpbmxpbmUgYm9vbCBuZWVkc0xpbmVCcmVha0l0ZXJhdG9yKFVDaGFyIGNoKQordGVtcGxhdGU8
Ym9vbCB0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWs+CitzdGF0aWMgaW5saW5lIGJvb2wgbmVlZHNM
aW5lQnJlYWtJdGVyYXRvcihVQ2hhcik7CisKK3RlbXBsYXRlPD4KK2lubGluZSBib29sIG5lZWRz
TGluZUJyZWFrSXRlcmF0b3I8ZmFsc2U+KFVDaGFyIGNoKQogewogICAgIHJldHVybiBjaCA+IGFz
Y2lpTGluZUJyZWFrVGFibGVMYXN0Q2hhciAmJiBjaCAhPSBub0JyZWFrU3BhY2U7CiB9CiAKLWlu
dCBuZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJ
dGVyYXRvciwgaW50IHBvcywgYm9vbCB0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWspCit0ZW1wbGF0
ZTw+CitpbmxpbmUgYm9vbCBuZWVkc0xpbmVCcmVha0l0ZXJhdG9yPHRydWU+KFVDaGFyIGNoKQor
eworICAgIHJldHVybiBjaCA+IGFzY2lpTGluZUJyZWFrVGFibGVMYXN0Q2hhcjsKK30KKwordGVt
cGxhdGU8Ym9vbCB0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWs+CitzdGF0aWMgaW5saW5lIGludCBu
ZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJdGVy
YXRvciwgaW50IHBvcykKIHsKICAgICBjb25zdCBVQ2hhciogc3RyID0gbGF6eUJyZWFrSXRlcmF0
b3Iuc3RyaW5nKCk7CiAgICAgaW50IGxlbiA9IGxhenlCcmVha0l0ZXJhdG9yLmxlbmd0aCgpOwpA
QCAtMTU0LDE2ICsxNjYsMTYgQEAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJy
ZWFrSXRlcmF0b3ImIGxhenlCcmVha0l0ZXJhdG9yLCBpbnQgcG9zLCBib28KICAgICBmb3IgKGlu
dCBpID0gcG9zOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgVUNoYXIgY2ggPSBzdHJbaV07CiAK
LSAgICAgICAgaWYgKGlzQnJlYWthYmxlU3BhY2UoY2gsIHRyZWF0Tm9CcmVha1NwYWNlQXNCcmVh
aykgfHwgc2hvdWxkQnJlYWtBZnRlcihsYXN0TGFzdENoLCBsYXN0Q2gsIGNoKSkKKyAgICAgICAg
aWYgKGlzQnJlYWthYmxlU3BhY2U8dHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrPihjaCkgfHwgc2hv
dWxkQnJlYWtBZnRlcihsYXN0TGFzdENoLCBsYXN0Q2gsIGNoKSkKICAgICAgICAgICAgIHJldHVy
biBpOwogCi0gICAgICAgIGlmIChuZWVkc0xpbmVCcmVha0l0ZXJhdG9yKGNoKSB8fCBuZWVkc0xp
bmVCcmVha0l0ZXJhdG9yKGxhc3RDaCkpIHsKKyAgICAgICAgaWYgKG5lZWRzTGluZUJyZWFrSXRl
cmF0b3I8dHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrPihjaCkgfHwgbmVlZHNMaW5lQnJlYWtJdGVy
YXRvcjx0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWs+KGxhc3RDaCkpIHsKICAgICAgICAgICAgIGlm
IChuZXh0QnJlYWsgPCBpICYmIGkpIHsKICAgICAgICAgICAgICAgICBUZXh0QnJlYWtJdGVyYXRv
ciogYnJlYWtJdGVyYXRvciA9IGxhenlCcmVha0l0ZXJhdG9yLmdldCgpOwogICAgICAgICAgICAg
ICAgIGlmIChicmVha0l0ZXJhdG9yKQogICAgICAgICAgICAgICAgICAgICBuZXh0QnJlYWsgPSB0
ZXh0QnJlYWtGb2xsb3dpbmcoYnJlYWtJdGVyYXRvciwgaSAtIDEpOwogICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaWYgKGkgPT0gbmV4dEJyZWFrICYmICFpc0JyZWFrYWJsZVNwYWNlKGxhc3RD
aCwgdHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrKSkKKyAgICAgICAgICAgIGlmIChpID09IG5leHRC
cmVhayAmJiAhaXNCcmVha2FibGVTcGFjZTx0cmVhdE5vQnJlYWtTcGFjZUFzQnJlYWs+KGxhc3RD
aCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KIApAQCAtMTc0LDQgKzE4
NiwxNCBAQCBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYg
bGF6eUJyZWFrSXRlcmF0b3IsIGludCBwb3MsIGJvbwogICAgIHJldHVybiBsZW47CiB9CiAKK2lu
dCBuZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJ
dGVyYXRvciwgaW50IHBvcykKK3sKKyAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBvc2l0aW9uPGZh
bHNlPihsYXp5QnJlYWtJdGVyYXRvciwgcG9zKTsKK30KKworaW50IG5leHRCcmVha2FibGVQb3Np
dGlvbkJyZWFrT25OQlNQKExhenlMaW5lQnJlYWtJdGVyYXRvciYgbGF6eUJyZWFrSXRlcmF0b3Is
IGludCBwb3MpCit7CisgICAgcmV0dXJuIG5leHRCcmVha2FibGVQb3NpdGlvbjx0cnVlPihsYXp5
QnJlYWtJdGVyYXRvciwgcG9zKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2JyZWFrX2xpbmVzLmggYi9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuaAppbmRleCA2NjAwZTUyNGIwYjE2MzhjNTRhZDAx
ODg5ZmY0NWM2MWFlOGE4MmU5Li4zY2U3OGJiMDBkMmYxZmVkODYyNmNlMDExZjQ3N2Q0OTQ2MmQ0
Y2NjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuaApAQCAtMjcsMTIgKzI3
LDE3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgTGF6eUxpbmVCcmVha0l0ZXJhdG9y
OwogCi1pbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYsIGlu
dCBwb3MsIGJvb2wgYnJlYWtOQlNQID0gZmFsc2UpOworaW50IG5leHRCcmVha2FibGVQb3NpdGlv
bihMYXp5TGluZUJyZWFrSXRlcmF0b3ImLCBpbnQgcG9zKTsKK2ludCBuZXh0QnJlYWthYmxlUG9z
aXRpb25CcmVha09uTkJTUChMYXp5TGluZUJyZWFrSXRlcmF0b3ImLCBpbnQgcG9zKTsKIAotaW5s
aW5lIGJvb2wgaXNCcmVha2FibGUoTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJdGVy
YXRvciwgaW50IHBvcywgaW50JiBuZXh0QnJlYWthYmxlLCBib29sIGJyZWFrTkJTUCA9IGZhbHNl
KQoraW5saW5lIGJvb2wgaXNCcmVha2FibGUoTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJl
YWtJdGVyYXRvciwgaW50IHBvcywgaW50JiBuZXh0QnJlYWthYmxlLCBib29sIGJyZWFrTkJTUCkK
IHsKLSAgICBpZiAocG9zID4gbmV4dEJyZWFrYWJsZSkKLSAgICAgICAgbmV4dEJyZWFrYWJsZSA9
IG5leHRCcmVha2FibGVQb3NpdGlvbihsYXp5QnJlYWtJdGVyYXRvciwgcG9zLCBicmVha05CU1Ap
OworICAgIGlmIChwb3MgPiBuZXh0QnJlYWthYmxlKSB7CisgICAgICAgIGlmIChicmVha05CU1Ap
CisgICAgICAgICAgICBuZXh0QnJlYWthYmxlID0gbmV4dEJyZWFrYWJsZVBvc2l0aW9uQnJlYWtP
bk5CU1AobGF6eUJyZWFrSXRlcmF0b3IsIHBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG5leHRCcmVha2FibGUgPSBuZXh0QnJlYWthYmxlUG9zaXRpb24obGF6eUJyZWFrSXRlcmF0b3Is
IHBvcyk7CisgICAgfQogICAgIHJldHVybiBwb3MgPT0gbmV4dEJyZWFrYWJsZTsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>162942</attachid>
            <date>2012-09-07 22:38:01 -0700</date>
            <delta_ts>2012-09-07 23:03:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-96042-20120907223740.patch</filename>
            <type>text/plain</type>
            <size>5763</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI3OTU3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggY2E3ZmYyMzU3MTdlNDQ3
YjM1YTZiMDcwODgyZjA5YjM0OTIxMzVjMy4uZjc1MzRlODYwMzNiM2VlOGRkMDk5NTY1YWQ2ZjY1
YzI2ODljZTM5NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMzIEBACisyMDEyLTA5LTA3ICBCZW5q
YW1pbiBQb3VsYWluICA8YnBvdWxhaW5AYXBwbGUuY29tPgorCisgICAgICAgIFNwZWNpYWxpemUg
bmV4dEJyZWFrYWJsZVBvc2l0aW9uIGRlcGVuZGluZyBvbiBicmVha05CU1AKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTk2MDQyCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIHNwZWVkIG9mIGlzQnJlYWth
YmxlU3BhY2UoKSBpcyBsaW1pdGVkIGJ5IHRoZSBzcGVlZCBvZiB0aGUgaW5uZXIgbG9vcCBvZiBu
ZXh0QnJlYWthYmxlUG9zaXRpb24oKS4KKyAgICAgICAgVGhlIGJyYW5jaGVzIGRvbmUgdG8gaGFu
ZGxlIG5vQnJlYWtTcGFjZSBjYW4gYmUgc2ltcGxpZmllZCBvdXRzaWRlIHRoZSBsb29wCisgICAg
ICAgIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRlc3RzIGluc2lkZSB0aGUgbG9vcC4KKworICAg
ICAgICBUaGlzIHBhdGNoIHNwbGl0IHRoZSBjb2RlIG9mIG5leHRCcmVha2FibGVQb3NpdGlvbigp
IGluIHR3byBmdW5jdGlvbiwgZGVwZW5kaW5nIGlmIGJyZWFrTkJTUCBpcyB0cnVlCisgICAgICAg
IG9yIGZhbHNlLgorCisgICAgICAgIElmIGJyZWFrTkJTUCBpcyB0cnVlLCBpc0JyZWFrYWJsZVNw
YWNlKCkgd291bGQgcmV0dXJuIHRydWUgb24gbm9CcmVha1NwYWNlLgorICAgICAgICAtPlRoZXJl
IGlzIG5vIG5lZWQgdG8gdGVzdCB0aGF0IHZhbHVlIGFnYWluIGZvciBuZWVkc0xpbmVCcmVha0l0
ZXJhdG9yKCkuCisgICAgICAgIC0+VGhlcmUgaXMgbm8gbmVlZCB0byBzcGVjaWFsIGNhc2UgdGhl
IHN3aXRjaCgpIG9mIGlzQnJlYWthYmxlU3BhY2UoKSBmb3Igbm9CcmVha1NwYWNlLgorCisgICAg
ICAgIElmIGJyZWFrTkJTUCBpcyBmYWxzZToKKyAgICAgICAgLT5pc0JyZWFrYWJsZVNwYWNlKCkg
ZG9lcyBub3QgbmVlZCB0byB0ZXN0IGZvciBub0JyZWFrU3BhY2UuCisKKyAgICAgICAgT24geDg2
XzY0LCB0aGlzIGltcHJvdmVzIFBlcmZvcm1hbmNlVGVzdHMvTGF5b3V0L2xpbmUtbGF5b3V0Lmh0
bWwgYnkgMi44JS4KKworICAgICAgICAqIHJlbmRlcmluZy9icmVha19saW5lcy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjppc0JyZWFrYWJsZVNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRC
cmVha2FibGVQb3NpdGlvbklnbm9yaW5nTkJTUCk6CisgICAgICAgIChXZWJDb3JlOjpuZXh0QnJl
YWthYmxlUG9zaXRpb24pOgorICAgICAgICAqIHJlbmRlcmluZy9icmVha19saW5lcy5oOgorICAg
ICAgICAoV2ViQ29yZTo6aXNCcmVha2FibGUpOiBSZW1vdmUgdGhlIGRlZmF1bHQgdmFsdWUgZm9y
IGJyZWFrTkJTUCwgbm8gY2FsbGVyIGlzIHVzaW5nIGl0LgorCiAyMDEyLTA5LTA3ICBTaGVyaWZm
IEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAgICBVbnJldmlld2Vk
LCByb2xsaW5nIG91dCByMTI3OTU1LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL2JyZWFrX2xpbmVzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9icmVha19saW5l
cy5jcHAKaW5kZXggNGJiYTNjZTdlNzk5YWJlZWM0MjBlYzc3ZWNiNzIwNzY5MWY2YmQwZi4uZjFi
NWNhMThmNWI1NjMwODViYTc1YjdjNWVjNmEwZjI4ZTNiYmJlNyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL2JyZWFrX2xpbmVzLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvYnJlYWtfbGluZXMuY3BwCkBAIC0zOCw3ICszOCw4IEBACiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotc3RhdGljIGlubGluZSBib29sIGlzQnJlYWthYmxlU3BhY2UoVUNoYXIgY2gs
IGJvb2wgdHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrKQordGVtcGxhdGU8Ym9vbCB0cmVhdE5vQnJl
YWtTcGFjZUFzQnJlYWs+CitzdGF0aWMgaW5saW5lIGJvb2wgaXNCcmVha2FibGVTcGFjZShVQ2hh
ciBjaCkKIHsKICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgY2FzZSAnICc6CkBAIC0xMzgsMTIgKzEz
OSwxNiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQnJlYWtBZnRlcihVQ2hhciBsYXN0Q2gs
IFVDaGFyIGNoLCBVQ2hhciBuZXh0Q2gpCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMg
aW5saW5lIGJvb2wgbmVlZHNMaW5lQnJlYWtJdGVyYXRvcihVQ2hhciBjaCkKK3RlbXBsYXRlPGJv
b2wgdHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrPgoraW5saW5lIGJvb2wgbmVlZHNMaW5lQnJlYWtJ
dGVyYXRvcihVQ2hhciBjaCkKIHsKKyAgICBpZiAodHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrKQor
ICAgICAgICByZXR1cm4gY2ggPiBhc2NpaUxpbmVCcmVha1RhYmxlTGFzdENoYXI7CiAgICAgcmV0
dXJuIGNoID4gYXNjaWlMaW5lQnJlYWtUYWJsZUxhc3RDaGFyICYmIGNoICE9IG5vQnJlYWtTcGFj
ZTsKIH0KIAotaW50IG5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRlcmF0b3Im
IGxhenlCcmVha0l0ZXJhdG9yLCBpbnQgcG9zLCBib29sIHRyZWF0Tm9CcmVha1NwYWNlQXNCcmVh
aykKK3RlbXBsYXRlPGJvb2wgdHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrPgorc3RhdGljIGlubGlu
ZSBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uKExhenlMaW5lQnJlYWtJdGVyYXRvciYgbGF6eUJy
ZWFrSXRlcmF0b3IsIGludCBwb3MpCiB7CiAgICAgY29uc3QgVUNoYXIqIHN0ciA9IGxhenlCcmVh
a0l0ZXJhdG9yLnN0cmluZygpOwogICAgIGludCBsZW4gPSBsYXp5QnJlYWtJdGVyYXRvci5sZW5n
dGgoKTsKQEAgLTE1NCwxNiArMTU5LDE2IEBAIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6
eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJdGVyYXRvciwgaW50IHBvcywgYm9vCiAgICAg
Zm9yIChpbnQgaSA9IHBvczsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIFVDaGFyIGNoID0gc3Ry
W2ldOwogCi0gICAgICAgIGlmIChpc0JyZWFrYWJsZVNwYWNlKGNoLCB0cmVhdE5vQnJlYWtTcGFj
ZUFzQnJlYWspIHx8IHNob3VsZEJyZWFrQWZ0ZXIobGFzdExhc3RDaCwgbGFzdENoLCBjaCkpCisg
ICAgICAgIGlmIChpc0JyZWFrYWJsZVNwYWNlPHRyZWF0Tm9CcmVha1NwYWNlQXNCcmVhaz4oY2gp
IHx8IHNob3VsZEJyZWFrQWZ0ZXIobGFzdExhc3RDaCwgbGFzdENoLCBjaCkpCiAgICAgICAgICAg
ICByZXR1cm4gaTsKIAotICAgICAgICBpZiAobmVlZHNMaW5lQnJlYWtJdGVyYXRvcihjaCkgfHwg
bmVlZHNMaW5lQnJlYWtJdGVyYXRvcihsYXN0Q2gpKSB7CisgICAgICAgIGlmIChuZWVkc0xpbmVC
cmVha0l0ZXJhdG9yPHRyZWF0Tm9CcmVha1NwYWNlQXNCcmVhaz4oY2gpIHx8IG5lZWRzTGluZUJy
ZWFrSXRlcmF0b3I8dHJlYXROb0JyZWFrU3BhY2VBc0JyZWFrPihsYXN0Q2gpKSB7CiAgICAgICAg
ICAgICBpZiAobmV4dEJyZWFrIDwgaSAmJiBpKSB7CiAgICAgICAgICAgICAgICAgVGV4dEJyZWFr
SXRlcmF0b3IqIGJyZWFrSXRlcmF0b3IgPSBsYXp5QnJlYWtJdGVyYXRvci5nZXQoKTsKICAgICAg
ICAgICAgICAgICBpZiAoYnJlYWtJdGVyYXRvcikKICAgICAgICAgICAgICAgICAgICAgbmV4dEJy
ZWFrID0gdGV4dEJyZWFrRm9sbG93aW5nKGJyZWFrSXRlcmF0b3IsIGkgLSAxKTsKICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChpID09IG5leHRCcmVhayAmJiAhaXNCcmVha2FibGVTcGFj
ZShsYXN0Q2gsIHRyZWF0Tm9CcmVha1NwYWNlQXNCcmVhaykpCisgICAgICAgICAgICBpZiAoaSA9
PSBuZXh0QnJlYWsgJiYgIWlzQnJlYWthYmxlU3BhY2U8dHJlYXROb0JyZWFrU3BhY2VBc0JyZWFr
PihsYXN0Q2gpKQogICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAKQEAgLTE3
NCw0ICsxNzksMTQgQEAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRl
cmF0b3ImIGxhenlCcmVha0l0ZXJhdG9yLCBpbnQgcG9zLCBib28KICAgICByZXR1cm4gbGVuOwog
fQogCitpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uSWdub3JpbmdOQlNQKExhenlMaW5lQnJlYWtJ
dGVyYXRvciYgbGF6eUJyZWFrSXRlcmF0b3IsIGludCBwb3MpCit7CisgICAgcmV0dXJuIG5leHRC
cmVha2FibGVQb3NpdGlvbjxmYWxzZT4obGF6eUJyZWFrSXRlcmF0b3IsIHBvcyk7Cit9CisKK2lu
dCBuZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5QnJlYWtJ
dGVyYXRvciwgaW50IHBvcykKK3sKKyAgICByZXR1cm4gbmV4dEJyZWFrYWJsZVBvc2l0aW9uPHRy
dWU+KGxhenlCcmVha0l0ZXJhdG9yLCBwb3MpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvYnJlYWtfbGluZXMuaCBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9icmVha19saW5lcy5oCmluZGV4IDY2MDBlNTI0YjBiMTYz
OGM1NGFkMDE4ODlmZjQ1YzYxYWU4YTgyZTkuLjY5MjM2MzAwOTdjODM3M2ZjMzg0MGZiYThiOTMw
YjEyNzEyZDIwNGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9icmVha19s
aW5lcy5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9icmVha19saW5lcy5oCkBAIC0y
NywxMiArMjcsMTcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBMYXp5TGluZUJyZWFr
SXRlcmF0b3I7CiAKLWludCBuZXh0QnJlYWthYmxlUG9zaXRpb24oTGF6eUxpbmVCcmVha0l0ZXJh
dG9yJiwgaW50IHBvcywgYm9vbCBicmVha05CU1AgPSBmYWxzZSk7CitpbnQgbmV4dEJyZWFrYWJs
ZVBvc2l0aW9uSWdub3JpbmdOQlNQKExhenlMaW5lQnJlYWtJdGVyYXRvciYsIGludCBwb3MpOwor
aW50IG5leHRCcmVha2FibGVQb3NpdGlvbihMYXp5TGluZUJyZWFrSXRlcmF0b3ImLCBpbnQgcG9z
KTsKIAotaW5saW5lIGJvb2wgaXNCcmVha2FibGUoTGF6eUxpbmVCcmVha0l0ZXJhdG9yJiBsYXp5
QnJlYWtJdGVyYXRvciwgaW50IHBvcywgaW50JiBuZXh0QnJlYWthYmxlLCBib29sIGJyZWFrTkJT
UCA9IGZhbHNlKQoraW5saW5lIGJvb2wgaXNCcmVha2FibGUoTGF6eUxpbmVCcmVha0l0ZXJhdG9y
JiBsYXp5QnJlYWtJdGVyYXRvciwgaW50IHBvcywgaW50JiBuZXh0QnJlYWthYmxlLCBib29sIGJy
ZWFrTkJTUCkKIHsKLSAgICBpZiAocG9zID4gbmV4dEJyZWFrYWJsZSkKLSAgICAgICAgbmV4dEJy
ZWFrYWJsZSA9IG5leHRCcmVha2FibGVQb3NpdGlvbihsYXp5QnJlYWtJdGVyYXRvciwgcG9zLCBi
cmVha05CU1ApOworICAgIGlmIChwb3MgPiBuZXh0QnJlYWthYmxlKSB7CisgICAgICAgIGlmIChi
cmVha05CU1ApCisgICAgICAgICAgICBuZXh0QnJlYWthYmxlID0gbmV4dEJyZWFrYWJsZVBvc2l0
aW9uKGxhenlCcmVha0l0ZXJhdG9yLCBwb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBu
ZXh0QnJlYWthYmxlID0gbmV4dEJyZWFrYWJsZVBvc2l0aW9uSWdub3JpbmdOQlNQKGxhenlCcmVh
a0l0ZXJhdG9yLCBwb3MpOworICAgIH0KICAgICByZXR1cm4gcG9zID09IG5leHRCcmVha2FibGU7
CiB9CiAK
</data>
<flag name="review"
          id="174205"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>