<?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>144731</bug_id>
          
          <creation_ts>2015-05-07 01:43:19 -0700</creation_ts>
          <short_desc>Special-case Int32 values in JSON.stringify().</short_desc>
          <delta_ts>2015-05-07 11:25: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>JavaScriptCore</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>Performance</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Andreas Kling">kling</assigned_to>
          <cc>benjamin</cc>
    
    <cc>ggaren</cc>
    
    <cc>kling</cc>
    
    <cc>msaboff</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1092545</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-05-07 01:43:19 -0700</bug_when>
    <thetext>We should have a fast-path in JSON.stringify() for Int32 values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092546</commentid>
    <comment_count>1</comment_count>
      <attachid>252580</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-05-07 01:46:10 -0700</bug_when>
    <thetext>Created attachment 252580
Patch

Boom:

json-stringify-tinderbox        60.176+-8.602      ^      39.277+-1.632         ^ definitely 1.5321x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092584</commentid>
    <comment_count>2</comment_count>
      <attachid>252580</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2015-05-07 07:50:44 -0700</bug_when>
    <thetext>Comment on attachment 252580
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092596</commentid>
    <comment_count>3</comment_count>
      <attachid>252580</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-05-07 08:58:01 -0700</bug_when>
    <thetext>Comment on attachment 252580
Patch

Clearing flags on attachment: 252580

Committed r183928: &lt;http://trac.webkit.org/changeset/183928&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092597</commentid>
    <comment_count>4</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2015-05-07 08:58:06 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092605</commentid>
    <comment_count>5</comment_count>
      <attachid>252580</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-07 09:14:27 -0700</bug_when>
    <thetext>Comment on attachment 252580
Patch

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

&gt; Source/JavaScriptCore/runtime/JSONObject.cpp:403
&gt;      if (value.isNumber()) {
&gt; -        double number = value.asNumber();
&gt; -        if (!std::isfinite(number))
&gt; -            builder.appendLiteral(&quot;null&quot;);
&gt; -        else
&gt; -            builder.appendECMAScriptNumber(number);
&gt; +        if (value.isInt32())
&gt; +            builder.appendNumber(value.asInt32());
&gt; +        else {
&gt; +            double number = value.asNumber();
&gt; +            if (!std::isfinite(number))
&gt; +                builder.appendLiteral(&quot;null&quot;);
&gt; +            else
&gt; +                builder.appendECMAScriptNumber(number);
&gt; +        }
&gt;          return StringifySucceeded;
&gt;      }

Would we get better code by writing these two separately? I ask because isNumber() is really just isInt32() || isDouble(). And if isDouble() is true then we can call asDouble(). Maybe the compiler will fold everything for us and remove all the dead code, but I think it would be nicer to just write it out like this:

    if (value.isInt32()) {
        builder.appendNumber(value.asInt32());
        return StringifySucceeded;
    }

    if (value.isDouble()) {
        double number = value.asDouble();
        if (!std::isfinite(number))
            builder.appendLiteral(&quot;null&quot;);
        else
            builder.appendECMAScriptNumber(number);
        return StringifySucceeded;
    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092655</commentid>
    <comment_count>6</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-05-07 11:25:15 -0700</bug_when>
    <thetext>c:\cygwin\home\buildbot\webkit\webkitbuild\release\include\private\javascriptcore\X86Assembler.h(1811): error C2039: &apos;twoByteOp64&apos; : is not a member of &apos;JSC::X86Assembler::X86InstructionFormatter&apos; [C:\cygwin\home\buildbot\WebKit\Source\JavaScriptCore\JavaScriptCore.vcxproj\LLInt\LLIntOffsetsExtractor\LLIntOffsetsExtractor.vcxproj]
          c:\cygwin\home\buildbot\webkit\webkitbuild\release\include\private\javascriptcore\X86Assembler.h(2332) : see declaration of &apos;JSC::X86Assembler::X86InstructionFormatter&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092658</commentid>
    <comment_count>7</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-05-07 11:25:39 -0700</bug_when>
    <thetext>Oops! Wrong bug :(.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252580</attachid>
            <date>2015-05-07 01:46:10 -0700</date>
            <delta_ts>2015-05-07 08:58:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144731.diff</filename>
            <type>text/plain</type>
            <size>1766</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IDMyMzhkMGYuLjdmOGMxMjggMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL0phdmFTY3JpcHRD
b3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDE1LTA1LTA3ICBBbmRyZWFzIEtsaW5n
ICA8YWtsaW5nQGFwcGxlLmNvbT4KKworICAgICAgICBTcGVjaWFsLWNhc2UgSW50MzIgdmFsdWVz
IGluIEpTT04uc3RyaW5naWZ5KCkuCisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xNDQ3
MzE+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRk
IGEgZmFzdCBwYXRoIGZvciBzZXJpYWxpemluZyBJbnQzMiB2YWx1ZXMgdG8gSlNPTi4gVGhpcyBp
cyBmYXIgZmFzdGVyIHRoYW4gZHJhZ2dpbmcKKyAgICAgICAgc2ltcGxlIGludGVnZXJzIHRocm91
Z2ggdGhlIGZ1bGwtYmxvd24gZHRvYSgpIG1hY2hpbmVyeS4KKworICAgICAgICB+NTAlIHNwZWVk
dXAgb24gS3Jha2VuL2pzb24tc3RyaW5naWZ5LXRpbmRlcmJveC4KKworICAgICAgICAqIHJ1bnRp
bWUvSlNPTk9iamVjdC5jcHA6CisgICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjphcHBlbmRTdHJp
bmdpZmllZFZhbHVlKToKKwogMjAxNS0wNS0wNiAgQW5kcmVhcyBLbGluZyAgPGFrbGluZ0BhcHBs
ZS5jb20+CiAKICAgICAgICAgRG9uJ3QgYWxsb2NhdGUgYSBTdHJpbmdJbXBsIGZvciBldmVyeSBO
dW1iZXIgSlNWYWx1ZSBpbiBKU09OLnN0cmluZ2lmeSgpLgpkaWZmIC0tZ2l0IGEvU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU09OT2JqZWN0LmNwcAppbmRleCBhZmI2ZDE2Li41ODFiZDQ1IDEwMDY0NAot
LS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcAorKysgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcApAQCAtMzkwLDExICsz
OTAsMTUgQEAgU3RyaW5naWZpZXI6OlN0cmluZ2lmeVJlc3VsdCBTdHJpbmdpZmllcjo6YXBwZW5k
U3RyaW5naWZpZWRWYWx1ZShTdHJpbmdCdWlsZGVyJgogICAgIH0KIAogICAgIGlmICh2YWx1ZS5p
c051bWJlcigpKSB7Ci0gICAgICAgIGRvdWJsZSBudW1iZXIgPSB2YWx1ZS5hc051bWJlcigpOwot
ICAgICAgICBpZiAoIXN0ZDo6aXNmaW5pdGUobnVtYmVyKSkKLSAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kTGl0ZXJhbCgibnVsbCIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBidWlsZGVy
LmFwcGVuZEVDTUFTY3JpcHROdW1iZXIobnVtYmVyKTsKKyAgICAgICAgaWYgKHZhbHVlLmlzSW50
MzIoKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kTnVtYmVyKHZhbHVlLmFzSW50MzIoKSk7
CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG91YmxlIG51bWJlciA9IHZhbHVlLmFzTnVt
YmVyKCk7CisgICAgICAgICAgICBpZiAoIXN0ZDo6aXNmaW5pdGUobnVtYmVyKSkKKyAgICAgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZExpdGVyYWwoIm51bGwiKTsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZEVDTUFTY3JpcHROdW1iZXIobnVtYmVyKTsK
KyAgICAgICAgfQogICAgICAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOwogICAgIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>