<?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>30186</bug_id>
          
          <creation_ts>2009-10-07 15:05:38 -0700</creation_ts>
          <short_desc>Optimization: Many StringImpl transformations are no-ops and should just return &apos;this&apos;</short_desc>
          <delta_ts>2009-10-09 14:24:39 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jens Alfke">jens</reporter>
          <assigned_to name="Jens Alfke">jens</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>153196</commentid>
    <comment_count>0</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-07 15:05:38 -0700</bug_when>
    <thetext>I&apos;ve instrumented the WebCore::StringImpl methods lower(), stripWhiteSpace() and simplifyWhiteSpace(), and found that, when loading common websites like yahoo.com or GMail, the great majority of calls are no-ops, i.e. return a string identical to the receiver. These could be optimized to check for no-op before allocating memory, and simply return &apos;this&apos;.

(Interestingly, upper() does not follow this pattern -- most of the calls do something. I suspect this is because WebKit uses this method to canonicalize HTML tag names, but almost all sites use lowercase tags.)

The fix to lower() will slow the nontrivial case down slightly, as it scans the string twice instead of once. Given caching, this is probably not a big deal, especially considering that most calls are no-ops and will save a large number of CPU cycles in malloc and copying.

The fixes to stripWhiteSpace() and simplifyWhiteSpace() are just simple checks at the end that only take a few instructions.

I&apos;ll add a patch and flag for review once my previous StringImpl patch(es) are submitted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153560</commentid>
    <comment_count>1</comment_count>
      <attachid>40917</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 16:11:50 -0700</bug_when>
    <thetext>Created attachment 40917
patch

Here&apos;s the patch. Note that I added a comment to upper() explaining why it isn&apos;t optimized the way lower() is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153562</commentid>
    <comment_count>2</comment_count>
      <attachid>40918</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 16:30:54 -0700</bug_when>
    <thetext>Created attachment 40918
patch 2

Fixed two stylistic nits dave_levin found. And added changelog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153569</commentid>
    <comment_count>3</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-08 16:50:45 -0700</bug_when>
    <thetext>Here are some statistics I collected of the number of StringImpls created through various means. In each case I launched the browser, opened the page, and immediately quit. Each line shows the number of calls followed by my shorthand for the specific call, e.g. &quot;adopt&quot; is StringImpl::adopt.  &quot;createC&quot; is StringImpl::create taking a C string. &quot;~dt~&quot; is the destructor. The &quot;-noop&quot; suffix denotes a case where the method was a no-op and returned the original string.

The only one of these optimizations that might be controversial is the lower() one since it takes extra cycles to pre-scan the string. But the numbers below show that in each test case at least 80% of the calls were no-ops, so the optimization&apos;s definitely a time-saver as well as a memory saver.

Yahoo! home page:
 905 [[adopt]]
5706 [[createC]]
3689 [[create]]
  64 [[lower-noop]]
   9 [[lower]]
   2 [[simplify-noop]]
  40 [[strip-noop]]
 268 [[upper]]
8098 [[~dt~]]

GMail (home page of my account):
   2 [[strip]]
   9 [[lower]]
   9 [[strip-noop]]
  16 [[upper-noop]]
 121 [[secure]]
 131 [[lower-noop]]
 630 [[upper]]
2128 [[adopt]]
7394 [[createC]]
14391 [[~dt~]]
17240 [[create]]

Pitchfork.com (a music-review site, fairly complex page):
   1 [[upper-noop]]
   8 [[strip]]
  39 [[lower]]
  65 [[strip-noop]]
 164 [[lower-noop]]
1717 [[upper]]
3191 [[adopt]]
5196 [[createC]]
7755 [[create]]
13169 [[~dt~]]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153571</commentid>
    <comment_count>4</comment_count>
      <attachid>40918</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-10-08 17:00:22 -0700</bug_when>
    <thetext>Comment on attachment 40918
patch 2

Thanks.  This looks good.

Just a little clean and a potential bug to address.

&gt; Index: WebCore/ChangeLog
&gt; +2009-10-08  Jens Alfke  &lt;snej@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
Please add 
    bug title
    bug link
    blank line
here.

&gt; +        Optimized StringImpl methods lower(), stripWhiteSpace() and simplifyWhiteSpace() to
&gt; +        detect no-ops and return this instead of creating a new instance.
&gt; +        Empirical testing shows that the majority of calls to these methods are no-ops, making
&gt; +        this worthwhile even if (in the case of lower()) the non-no-op case is slightly slowed.
&gt; +        Upper() is very rarely a no-op, so it wasn&apos;t worthwhile to optimize it.


&gt; Index: WebCore/platform/text/StringImpl.cpp

&gt;  PassRefPtr&lt;StringImpl&gt; StringImpl::lower()

&gt; +    UChar* data;
&gt; +    RefPtr&lt;StringImpl&gt; newImpl = createUninitialized(m_length, data);
&gt; +
&gt; +    if (!(ored &amp; ~0x7F)) {
&gt; +        // Do a faster loop for the case where all the characters are ASCII.
&gt; +        for (int i = 0; i &lt; length; i++) {
&gt; +            UChar c = m_data[i];
&gt; +            data[i] = toASCIILower(c);
&gt; +        }
&gt; +        return newImpl;

return newImpl.release();

Since you changed to a RefPtr (at my request).
  


&gt; @@ -346,6 +363,9 @@ PassRefPtr&lt;StringImpl&gt; StringImpl::simpl
&gt;      if (outc &gt; 0 &amp;&amp; to[outc - 1] == &apos; &apos;)
&gt;          outc--;
&gt;      
&gt; +    if (static_cast&lt;unsigned&gt;(outc) == m_length)
&gt; +        return this;
&gt; +    

It looks like outc may equal m_length, but a newline may have been converted to a space. In this case, &quot;this&quot; is not equivalent to &quot;data&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153574</commentid>
    <comment_count>5</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-10-08 17:07:36 -0700</bug_when>
    <thetext>Note this change &quot;return newImpl.release();&quot; in StringImpl::lower will need to happen at the other return sides in the function as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153575</commentid>
    <comment_count>6</comment_count>
      <attachid>40918</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-08 17:08:41 -0700</bug_when>
    <thetext>Comment on attachment 40918
patch 2

&gt; +    // Nothing to do if the string is all ascii with no uppercase.

We call it ASCII, not ascii.

&gt; +    // (This method could be optimized for no-op cases the way lower() is,
&gt; +    // but in empirical testing, few actual calls to upper() are no-ops, so
&gt; +    // it wouldn&apos;t be worth the extra time for pre-scanning.)

I suggest replacing the word &quot;method&quot; with the word &quot;function&quot; and taking out the parentheses.

You should check call sites for isLower -- I suspect if you did a function in AtomicString that was similarly optimized we could eliminate the isLower function entirely. Also, those call sites check isLower when what they are actually trying to check is &quot;would not change if lower was called&quot;, which is not the same thing!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153714</commentid>
    <comment_count>7</comment_count>
      <attachid>40953</attachid>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-09 10:46:19 -0700</bug_when>
    <thetext>Created attachment 40953
patch 3

Fixed the issues that were pointed out.
Fixing the bug in simplifyWhiteSpace required adding a test inside the space-skipping loop. I don&apos;t think it&apos;ll slow it down much, and in my testing I found that this method isn&apos;t called much, and all of the calls I did see were no-ops; so I think it&apos;s still worthwhile.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153718</commentid>
    <comment_count>8</comment_count>
      <attachid>40953</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-10-09 10:57:21 -0700</bug_when>
    <thetext>Comment on attachment 40953
patch 3

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153722</commentid>
    <comment_count>9</comment_count>
      <attachid>40953</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-10-09 11:11:23 -0700</bug_when>
    <thetext>Comment on attachment 40953
patch 3

Rejecting patch 40953 from commit-queue.

snej@chromium.org does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/modules/committers.py.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153752</commentid>
    <comment_count>10</comment_count>
    <who name="Jens Alfke">jens</who>
    <bug_when>2009-10-09 13:56:33 -0700</bug_when>
    <thetext>Oops, sorry, I must have misunderstood what setting the commit-queue flag meant.
Dave, would you mind checking this in? Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153758</commentid>
    <comment_count>11</comment_count>
      <attachid>40953</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-10-09 14:24:35 -0700</bug_when>
    <thetext>Comment on attachment 40953
patch 3

Clearing flags on attachment: 40953

Committed r49403: &lt;http://trac.webkit.org/changeset/49403&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>153759</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-10-09 14:24:39 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40917</attachid>
            <date>2009-10-08 16:11:50 -0700</date>
            <delta_ts>2009-10-08 16:30:54 -0700</delta_ts>
            <desc>patch</desc>
            <filename>optstring.patch</filename>
            <type>text/plain</type>
            <size>2521</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDQ5MzMwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNzUsMjAgKzE3NSwzMiBAQCBib29sIFN0cmluZ0ltcGw6OmlzTG93ZXIoKQogCiBQYXNzUmVm
UHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6Omxvd2VyKCkKIHsKLSAgICBVQ2hhciogZGF0YTsK
LSAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwgPSBjcmVhdGVVbmluaXRpYWxpemVk
KG1fbGVuZ3RoLCBkYXRhKTsKKyAgICAvLyBGaXJzdCBzY2FuIHRoZSBzdHJpbmcgZm9yIHVwcGVy
Y2FzZSBhbmQgbm9uLUFTQ0lJIGNoYXJhY3RlcnM6CiAgICAgaW50MzJfdCBsZW5ndGggPSBtX2xl
bmd0aDsKLQotICAgIC8vIERvIGEgZmFzdGVyIGxvb3AgZm9yIHRoZSBjYXNlIHdoZXJlIGFsbCB0
aGUgY2hhcmFjdGVycyBhcmUgQVNDSUkuCiAgICAgVUNoYXIgb3JlZCA9IDA7CisgICAgYm9vbCBu
b1VwcGVyID0gdHJ1ZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAg
ICAgICAgIFVDaGFyIGMgPSBtX2RhdGFbaV07CiAgICAgICAgIG9yZWQgfD0gYzsKLSAgICAgICAg
ZGF0YVtpXSA9IHRvQVNDSUlMb3dlcihjKTsKKyAgICAgICAgbm9VcHBlciA9IG5vVXBwZXIgJiYg
IWlzQVNDSUlVcHBlcihjKTsKICAgICB9Ci0gICAgaWYgKCEob3JlZCAmIH4weDdGKSkKLSAgICAg
ICAgcmV0dXJuIG5ld0ltcGw7CisgICAgCisgICAgLy8gTm90aGluZyB0byBkbyBpZiB0aGUgc3Ry
aW5nIGlzIGFsbCBhc2NpaSB3aXRoIG5vIHVwcGVyY2FzZS4KKyAgICBpZiAobm9VcHBlciAmJiAh
KG9yZWQgJiB+MHg3RikpCisgICAgICAgIHJldHVybiB0aGlzOwogCisgICAgVUNoYXIqIGRhdGE7
CisgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBuZXdJbXBsID0gY3JlYXRlVW5pbml0aWFsaXpl
ZChtX2xlbmd0aCwgZGF0YSk7CisKKyAgICBpZiAoIShvcmVkICYgfjB4N0YpKSB7CisgICAgICAg
IC8vIERvIGEgZmFzdGVyIGxvb3AgZm9yIHRoZSBjYXNlIHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVy
cyBhcmUgQVNDSUkuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICAgIFVDaGFyIGMgPSBtX2RhdGFbaV07CisgICAgICAgICAgICBkYXRhW2ldID0g
dG9BU0NJSUxvd2VyKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdJbXBsOworICAg
IH0KKyAgICAKICAgICAvLyBEbyBhIHNsb3dlciBpbXBsZW1lbnRhdGlvbiBmb3IgY2FzZXMgdGhh
dCBpbmNsdWRlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgogICAgIGJvb2wgZXJyb3I7CiAgICAgaW50
MzJfdCByZWFsTGVuZ3RoID0gVW5pY29kZTo6dG9Mb3dlcihkYXRhLCBsZW5ndGgsIG1fZGF0YSwg
bV9sZW5ndGgsICZlcnJvcik7CkBAIC0yMDMsNiArMjE1LDkgQEAgUGFzc1JlZlB0cjxTdHJpbmdJ
bXBsPiBTdHJpbmdJbXBsOjpsb3dlcgogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0lt
cGw6OnVwcGVyKCkKIHsKKyAgICAvLyAoVGhpcyBtZXRob2QgY291bGQgYmUgb3B0aW1pemVkIGZv
ciBuby1vcCBjYXNlcyB0aGUgd2F5IGxvd2VyKCkgaXMsCisgICAgLy8gYnV0IGluIGVtcGlyaWNh
bCB0ZXN0aW5nLCBmZXcgYWN0dWFsIGNhbGxzIHRvIHVwcGVyKCkgYXJlIG5vLW9wcywgc28KKyAg
ICAvLyBpdCB3b3VsZG4ndCBiZSB3b3J0aCB0aGUgZXh0cmEgdGltZSBmb3IgcHJlLXNjYW5uaW5n
LikKICAgICBVQ2hhciogZGF0YTsKICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwg
PSBjcmVhdGVVbmluaXRpYWxpemVkKG1fbGVuZ3RoLCBkYXRhKTsKICAgICBpbnQzMl90IGxlbmd0
aCA9IG1fbGVuZ3RoOwpAQCAtMjg3LDYgKzMwMiw4IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
U3RyaW5nSW1wbDo6c3RyaXAKICAgICB3aGlsZSAoZW5kICYmIGlzU3BhY2VPck5ld2xpbmUobV9k
YXRhW2VuZF0pKQogICAgICAgICBlbmQtLTsKIAorICAgIGlmIChzdGFydCA9PSAwICYmIGVuZCA9
PSBtX2xlbmd0aCAtIDEpCisgICAgICAgIHJldHVybiB0aGlzOwogICAgIHJldHVybiBjcmVhdGUo
bV9kYXRhICsgc3RhcnQsIGVuZCArIDEgLSBzdGFydCk7CiB9CiAKQEAgLTM0Niw2ICszNjMsOSBA
QCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OnNpbXBsCiAgICAgaWYgKG91dGMg
PiAwICYmIHRvW291dGMgLSAxXSA9PSAnICcpCiAgICAgICAgIG91dGMtLTsKICAgICAKKyAgICBp
ZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG91dGMpID09IG1fbGVuZ3RoKQorICAgICAgICByZXR1
cm4gdGhpczsKKyAgICAKICAgICBkYXRhLnNocmluayhvdXRjKTsKICAgICAKICAgICByZXR1cm4g
YWRvcHQoZGF0YSk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40918</attachid>
            <date>2009-10-08 16:30:54 -0700</date>
            <delta_ts>2009-10-09 10:46:19 -0700</delta_ts>
            <desc>patch 2</desc>
            <filename>optstring.patch</filename>
            <type>text/plain</type>
            <size>3600</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTMzMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMDktMTAtMDggIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBPcHRp
bWl6ZWQgU3RyaW5nSW1wbCBtZXRob2RzIGxvd2VyKCksIHN0cmlwV2hpdGVTcGFjZSgpIGFuZCBz
aW1wbGlmeVdoaXRlU3BhY2UoKSB0bworICAgICAgICBkZXRlY3Qgbm8tb3BzIGFuZCByZXR1cm4g
dGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlLgorICAgICAgICBFbXBpcmlj
YWwgdGVzdGluZyBzaG93cyB0aGF0IHRoZSBtYWpvcml0eSBvZiBjYWxscyB0byB0aGVzZSBtZXRo
b2RzIGFyZSBuby1vcHMsIG1ha2luZworICAgICAgICB0aGlzIHdvcnRod2hpbGUgZXZlbiBpZiAo
aW4gdGhlIGNhc2Ugb2YgbG93ZXIoKSkgdGhlIG5vbi1uby1vcCBjYXNlIGlzIHNsaWdodGx5IHNs
b3dlZC4KKyAgICAgICAgVXBwZXIoKSBpcyB2ZXJ5IHJhcmVseSBhIG5vLW9wLCBzbyBpdCB3YXNu
J3Qgd29ydGh3aGlsZSB0byBvcHRpbWl6ZSBpdC4KKworICAgICAgICAqIHBsYXRmb3JtL3RleHQv
U3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjpsb3dlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjp1cHBlcik6IEp1c3QgYWRkIGEgY29tbWVudCBl
eHBsYWluaW5nIHdoeSB0aGlzIHdhc24ndCBvcHRpbWl6ZWQKKyAgICAgICAgKFdlYkNvcmU6OlN0
cmluZ0ltcGw6OnN0cmlwV2hpdGVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBs
OjpzaW1wbGlmeVdoaXRlU3BhY2UpOgorCiAyMDA5LTEwLTA4ICBCcmlhbiBXZWluc3RlaW4gIDxi
d2VpbnN0ZWluQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBUaW1vdGh5IEhhdGNo
ZXIuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwCShyZXZpc2lvbiA0OTMz
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTc1LDIwICsxNzUsMzIgQEAgYm9vbCBTdHJpbmdJbXBsOjppc0xvd2VyKCkKIAogUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpsb3dlcigpCiB7Ci0gICAgVUNoYXIqIGRh
dGE7Ci0gICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBuZXdJbXBsID0gY3JlYXRlVW5pbml0aWFs
aXplZChtX2xlbmd0aCwgZGF0YSk7CisgICAgLy8gRmlyc3Qgc2NhbiB0aGUgc3RyaW5nIGZvciB1
cHBlcmNhc2UgYW5kIG5vbi1BU0NJSSBjaGFyYWN0ZXJzOgogICAgIGludDMyX3QgbGVuZ3RoID0g
bV9sZW5ndGg7Ci0KLSAgICAvLyBEbyBhIGZhc3RlciBsb29wIGZvciB0aGUgY2FzZSB3aGVyZSBh
bGwgdGhlIGNoYXJhY3RlcnMgYXJlIEFTQ0lJLgogICAgIFVDaGFyIG9yZWQgPSAwOworICAgIGJv
b2wgbm9VcHBlciA9IHRydWU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykg
ewogICAgICAgICBVQ2hhciBjID0gbV9kYXRhW2ldOwogICAgICAgICBvcmVkIHw9IGM7Ci0gICAg
ICAgIGRhdGFbaV0gPSB0b0FTQ0lJTG93ZXIoYyk7CisgICAgICAgIG5vVXBwZXIgPSBub1VwcGVy
ICYmICFpc0FTQ0lJVXBwZXIoYyk7CiAgICAgfQotICAgIGlmICghKG9yZWQgJiB+MHg3RikpCi0g
ICAgICAgIHJldHVybiBuZXdJbXBsOworICAgIAorICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhl
IHN0cmluZyBpcyBhbGwgYXNjaWkgd2l0aCBubyB1cHBlcmNhc2UuCisgICAgaWYgKG5vVXBwZXIg
JiYgIShvcmVkICYgfjB4N0YpKQorICAgICAgICByZXR1cm4gdGhpczsKIAorICAgIFVDaGFyKiBk
YXRhOworICAgIFJlZlB0cjxTdHJpbmdJbXBsPiBuZXdJbXBsID0gY3JlYXRlVW5pbml0aWFsaXpl
ZChtX2xlbmd0aCwgZGF0YSk7CisKKyAgICBpZiAoIShvcmVkICYgfjB4N0YpKSB7CisgICAgICAg
IC8vIERvIGEgZmFzdGVyIGxvb3AgZm9yIHRoZSBjYXNlIHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVy
cyBhcmUgQVNDSUkuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsK
KyAgICAgICAgICAgIFVDaGFyIGMgPSBtX2RhdGFbaV07CisgICAgICAgICAgICBkYXRhW2ldID0g
dG9BU0NJSUxvd2VyKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdJbXBsOworICAg
IH0KKyAgICAKICAgICAvLyBEbyBhIHNsb3dlciBpbXBsZW1lbnRhdGlvbiBmb3IgY2FzZXMgdGhh
dCBpbmNsdWRlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgogICAgIGJvb2wgZXJyb3I7CiAgICAgaW50
MzJfdCByZWFsTGVuZ3RoID0gVW5pY29kZTo6dG9Mb3dlcihkYXRhLCBsZW5ndGgsIG1fZGF0YSwg
bV9sZW5ndGgsICZlcnJvcik7CkBAIC0yMDMsNiArMjE1LDkgQEAgUGFzc1JlZlB0cjxTdHJpbmdJ
bXBsPiBTdHJpbmdJbXBsOjpsb3dlcgogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0lt
cGw6OnVwcGVyKCkKIHsKKyAgICAvLyAoVGhpcyBtZXRob2QgY291bGQgYmUgb3B0aW1pemVkIGZv
ciBuby1vcCBjYXNlcyB0aGUgd2F5IGxvd2VyKCkgaXMsCisgICAgLy8gYnV0IGluIGVtcGlyaWNh
bCB0ZXN0aW5nLCBmZXcgYWN0dWFsIGNhbGxzIHRvIHVwcGVyKCkgYXJlIG5vLW9wcywgc28KKyAg
ICAvLyBpdCB3b3VsZG4ndCBiZSB3b3J0aCB0aGUgZXh0cmEgdGltZSBmb3IgcHJlLXNjYW5uaW5n
LikKICAgICBVQ2hhciogZGF0YTsKICAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IG5ld0ltcGwg
PSBjcmVhdGVVbmluaXRpYWxpemVkKG1fbGVuZ3RoLCBkYXRhKTsKICAgICBpbnQzMl90IGxlbmd0
aCA9IG1fbGVuZ3RoOwpAQCAtMjg3LDYgKzMwMiw4IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
U3RyaW5nSW1wbDo6c3RyaXAKICAgICB3aGlsZSAoZW5kICYmIGlzU3BhY2VPck5ld2xpbmUobV9k
YXRhW2VuZF0pKQogICAgICAgICBlbmQtLTsKIAorICAgIGlmICghc3RhcnQgJiYgZW5kID09IG1f
bGVuZ3RoIC0gMSkKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgcmV0dXJuIGNyZWF0ZShtX2Rh
dGEgKyBzdGFydCwgZW5kICsgMSAtIHN0YXJ0KTsKIH0KIApAQCAtMzQ2LDYgKzM2Myw5IEBAIFBh
c3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6c2ltcGwKICAgICBpZiAob3V0YyA+IDAg
JiYgdG9bb3V0YyAtIDFdID09ICcgJykKICAgICAgICAgb3V0Yy0tOwogICAgIAorICAgIGlmIChz
dGF0aWNfY2FzdDx1bnNpZ25lZD4ob3V0YykgPT0gbV9sZW5ndGgpCisgICAgICAgIHJldHVybiB0
aGlzOworICAgIAogICAgIGRhdGEuc2hyaW5rKG91dGMpOwogICAgIAogICAgIHJldHVybiBhZG9w
dChkYXRhKTsK
</data>
<flag name="review"
          id="22218"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>40953</attachid>
            <date>2009-10-09 10:46:19 -0700</date>
            <delta_ts>2009-10-09 14:24:35 -0700</delta_ts>
            <desc>patch 3</desc>
            <filename>optstring.patch</filename>
            <type>text/plain</type>
            <size>4392</size>
            <attacher name="Jens Alfke">jens</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0OTM5MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjIgQEAKKzIwMDktMTAtMDkgIEplbnMgQWxma2UgIDxzbmVqQGNocm9taXVtLm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisgICAg
ICAgIE9wdGltaXphdGlvbjogTWFueSBTdHJpbmdJbXBsIHRyYW5zZm9ybWF0aW9ucyBhcmUgbm8t
b3BzIGFuZCBzaG91bGQganVzdCByZXR1cm4gJ3RoaXMnCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDE4NgorCisgICAgICAgIE9wdGltaXplZCBTdHJp
bmdJbXBsIG1ldGhvZHMgbG93ZXIoKSwgc3RyaXBXaGl0ZVNwYWNlKCkgYW5kIHNpbXBsaWZ5V2hp
dGVTcGFjZSgpIHRvCisgICAgICAgIGRldGVjdCBuby1vcHMgYW5kIHJldHVybiB0aGlzIGluc3Rl
YWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgIEVtcGlyaWNhbCB0ZXN0aW5n
IHNob3dzIHRoYXQgdGhlIG1ham9yaXR5IG9mIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIG5v
LW9wcywgbWFraW5nCisgICAgICAgIHRoaXMgd29ydGh3aGlsZSBldmVuIGlmIChpbiB0aGUgY2Fz
ZSBvZiBsb3dlcigpKSB0aGUgbm9uLW5vLW9wIGNhc2UgaXMgc2xpZ2h0bHkgc2xvd2VkLgorICAg
ICAgICBVcHBlcigpIGlzIHZlcnkgcmFyZWx5IGEgbm8tb3AsIHNvIGl0IHdhc24ndCB3b3J0aHdo
aWxlIHRvIG9wdGltaXplIGl0LgorCisgICAgICAgICogcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBs
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6Omxvd2VyKToKKyAgICAgICAgKFdl
YkNvcmU6OlN0cmluZ0ltcGw6OnVwcGVyKTogSnVzdCBhZGQgYSBjb21tZW50IGV4cGxhaW5pbmcg
d2h5IHRoaXMgd2Fzbid0IG9wdGltaXplZAorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6
c3RyaXBXaGl0ZVNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0cmluZ0ltcGw6OnNpbXBsaWZ5
V2hpdGVTcGFjZSk6CisKIDIwMDktMTAtMDkgIFBhdmVsIEZlbGRtYW4gIDxwZmVsZG1hbkBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcAkocmV2aXNpb24gNDkzOTMpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3NSwy
MCArMTc1LDMyIEBAIGJvb2wgU3RyaW5nSW1wbDo6aXNMb3dlcigpCiAKIFBhc3NSZWZQdHI8U3Ry
aW5nSW1wbD4gU3RyaW5nSW1wbDo6bG93ZXIoKQogewotICAgIFVDaGFyKiBkYXRhOwotICAgIFBh
c3NSZWZQdHI8U3RyaW5nSW1wbD4gbmV3SW1wbCA9IGNyZWF0ZVVuaW5pdGlhbGl6ZWQobV9sZW5n
dGgsIGRhdGEpOworICAgIC8vIEZpcnN0IHNjYW4gdGhlIHN0cmluZyBmb3IgdXBwZXJjYXNlIGFu
ZCBub24tQVNDSUkgY2hhcmFjdGVyczoKICAgICBpbnQzMl90IGxlbmd0aCA9IG1fbGVuZ3RoOwot
Ci0gICAgLy8gRG8gYSBmYXN0ZXIgbG9vcCBmb3IgdGhlIGNhc2Ugd2hlcmUgYWxsIHRoZSBjaGFy
YWN0ZXJzIGFyZSBBU0NJSS4KICAgICBVQ2hhciBvcmVkID0gMDsKKyAgICBib29sIG5vVXBwZXIg
PSB0cnVlOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAg
VUNoYXIgYyA9IG1fZGF0YVtpXTsKICAgICAgICAgb3JlZCB8PSBjOwotICAgICAgICBkYXRhW2ld
ID0gdG9BU0NJSUxvd2VyKGMpOworICAgICAgICBub1VwcGVyID0gbm9VcHBlciAmJiAhaXNBU0NJ
SVVwcGVyKGMpOwogICAgIH0KLSAgICBpZiAoIShvcmVkICYgfjB4N0YpKQotICAgICAgICByZXR1
cm4gbmV3SW1wbDsKKyAgICAKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZSBzdHJpbmcgaXMg
YWxsIEFTQ0lJIHdpdGggbm8gdXBwZXJjYXNlLgorICAgIGlmIChub1VwcGVyICYmICEob3JlZCAm
IH4weDdGKSkKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAKKyAgICBVQ2hhciogZGF0YTsKKyAgICBS
ZWZQdHI8U3RyaW5nSW1wbD4gbmV3SW1wbCA9IGNyZWF0ZVVuaW5pdGlhbGl6ZWQobV9sZW5ndGgs
IGRhdGEpOworCisgICAgaWYgKCEob3JlZCAmIH4weDdGKSkgeworICAgICAgICAvLyBEbyBhIGZh
c3RlciBsb29wIGZvciB0aGUgY2FzZSB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgYXJlIEFTQ0lJ
LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAg
ICBVQ2hhciBjID0gbV9kYXRhW2ldOworICAgICAgICAgICAgZGF0YVtpXSA9IHRvQVNDSUlMb3dl
cihjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3SW1wbDsKKyAgICB9CisgICAgCiAg
ICAgLy8gRG8gYSBzbG93ZXIgaW1wbGVtZW50YXRpb24gZm9yIGNhc2VzIHRoYXQgaW5jbHVkZSBu
b24tQVNDSUkgY2hhcmFjdGVycy4KICAgICBib29sIGVycm9yOwogICAgIGludDMyX3QgcmVhbExl
bmd0aCA9IFVuaWNvZGU6OnRvTG93ZXIoZGF0YSwgbGVuZ3RoLCBtX2RhdGEsIG1fbGVuZ3RoLCAm
ZXJyb3IpOwpAQCAtMjAzLDYgKzIxNSw5IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5n
SW1wbDo6bG93ZXIKIAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjp1cHBlcigp
CiB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBvcHRpbWl6ZWQgZm9yIG5vLW9wIGNh
c2VzIHRoZSB3YXkgbG93ZXIoKSBpcywKKyAgICAvLyBidXQgaW4gZW1waXJpY2FsIHRlc3Rpbmcs
IGZldyBhY3R1YWwgY2FsbHMgdG8gdXBwZXIoKSBhcmUgbm8tb3BzLCBzbworICAgIC8vIGl0IHdv
dWxkbid0IGJlIHdvcnRoIHRoZSBleHRyYSB0aW1lIGZvciBwcmUtc2Nhbm5pbmcuCiAgICAgVUNo
YXIqIGRhdGE7CiAgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBuZXdJbXBsID0gY3JlYXRlVW5p
bml0aWFsaXplZChtX2xlbmd0aCwgZGF0YSk7CiAgICAgaW50MzJfdCBsZW5ndGggPSBtX2xlbmd0
aDsKQEAgLTI4Nyw2ICszMDIsOCBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6
OnN0cmlwCiAgICAgd2hpbGUgKGVuZCAmJiBpc1NwYWNlT3JOZXdsaW5lKG1fZGF0YVtlbmRdKSkK
ICAgICAgICAgZW5kLS07CiAKKyAgICBpZiAoIXN0YXJ0ICYmIGVuZCA9PSBtX2xlbmd0aCAtIDEp
CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIHJldHVybiBjcmVhdGUobV9kYXRhICsgc3RhcnQs
IGVuZCArIDEgLSBzdGFydCk7CiB9CiAKQEAgLTMyOSwxMiArMzQ2LDE2IEBAIFBhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6c2ltcGwKICAgICBjb25zdCBVQ2hhciogZnJvbSA9IG1f
ZGF0YTsKICAgICBjb25zdCBVQ2hhciogZnJvbWVuZCA9IGZyb20gKyBtX2xlbmd0aDsKICAgICBp
bnQgb3V0YyA9IDA7CisgICAgYm9vbCBjaGFuZ2VkVG9TcGFjZSA9IGZhbHNlOwogICAgIAogICAg
IFVDaGFyKiB0byA9IGRhdGEuY2hhcmFjdGVycygpOwogICAgIAogICAgIHdoaWxlICh0cnVlKSB7
Ci0gICAgICAgIHdoaWxlIChmcm9tICE9IGZyb21lbmQgJiYgaXNTcGFjZU9yTmV3bGluZSgqZnJv
bSkpCisgICAgICAgIHdoaWxlIChmcm9tICE9IGZyb21lbmQgJiYgaXNTcGFjZU9yTmV3bGluZSgq
ZnJvbSkpIHsKKyAgICAgICAgICAgIGlmICgqZnJvbSAhPSAnICcpCisgICAgICAgICAgICAgICAg
Y2hhbmdlZFRvU3BhY2UgPSB0cnVlOwogICAgICAgICAgICAgZnJvbSsrOworICAgICAgICB9CiAg
ICAgICAgIHdoaWxlIChmcm9tICE9IGZyb21lbmQgJiYgIWlzU3BhY2VPck5ld2xpbmUoKmZyb20p
KQogICAgICAgICAgICAgdG9bb3V0YysrXSA9ICpmcm9tKys7CiAgICAgICAgIGlmIChmcm9tICE9
IGZyb21lbmQpCkBAIC0zNDYsNiArMzY3LDkgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJp
bmdJbXBsOjpzaW1wbAogICAgIGlmIChvdXRjID4gMCAmJiB0b1tvdXRjIC0gMV0gPT0gJyAnKQog
ICAgICAgICBvdXRjLS07CiAgICAgCisgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihvdXRj
KSA9PSBtX2xlbmd0aCAmJiAhY2hhbmdlZFRvU3BhY2UpCisgICAgICAgIHJldHVybiB0aGlzOwor
ICAgIAogICAgIGRhdGEuc2hyaW5rKG91dGMpOwogICAgIAogICAgIHJldHVybiBhZG9wdChkYXRh
KTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>