Bug 130775 - [Bindings] constants are always typed to 'int'
Summary: [Bindings] constants are always typed to 'int'
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Bindings (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Antonio Gomes
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-03-26 08:02 PDT by Antonio Gomes
Modified: 2014-03-28 10:53 PDT (History)
6 users (show)

See Also:


Attachments
patch - for EWS (10.38 KB, patch)
2014-03-26 14:30 PDT, Antonio Gomes
buildbot: commit-queue-
Details | Formatted Diff | Diff
Archive of layout-test-results from webkit-ews-15 for mac-mountainlion-wk2 (463.44 KB, application/zip)
2014-03-26 15:39 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-03 for mac-mountainlion (550.11 KB, application/zip)
2014-03-26 16:39 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-16 for mac-mountainlion-wk2 (464.79 KB, application/zip)
2014-03-26 16:47 PDT, Build Bot
no flags Details
Archive of layout-test-results from webkit-ews-06 for mac-mountainlion (489.17 KB, application/zip)
2014-03-26 18:06 PDT, Build Bot
no flags Details
patch - for review (11.81 KB, patch)
2014-03-26 21:32 PDT, Antonio Gomes
darin: review-
buildbot: commit-queue-
Details | Formatted Diff | Diff
Archive of layout-test-results from webkit-ews-16 for mac-mountainlion-wk2 (568.37 KB, application/zip)
2014-03-26 23:44 PDT, Build Bot
no flags Details
patch - as per Darin's review (12.47 KB, patch)
2014-03-27 15:46 PDT, Antonio Gomes
no flags Details | Formatted Diff | Diff
(actual) patch - as per Darin's review (12.93 KB, patch)
2014-03-27 15:52 PDT, Antonio Gomes
darin: review+
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Antonio Gomes 2014-03-26 08:02:09 PDT
that makes the following IDL return -1 (overflow) instead of the actual result.

] interface NodeFilter {
...
    // Constants for whatToShow
    const unsigned long       SHOW_ALL                       = 0xFFFFFFFF;
...
}

Generated code from this IDL looks like:

JSValue jsNodeFilterSHOW_ALL(ExecState* exec, JSValue, PropertyName)
{
    UNUSED_PARAM(exec);
    return jsNumber(static_cast<int>(0xFFFFFFFF)); <--- OVERFLOW
}


Firefox, for instance, returns 4294967295 as expected.
Comment 1 Darin Adler 2014-03-26 08:50:39 PDT
We should try just removing "static_cast<int>" from the generated code. I don’t think that cast is doing us any good.

Actually parsing the type of the constant (“unsigned long”) would be OK, but likely is not needed.

I suggest we make tests for all these enum values. They would be very easy to write:

    shouldBe("NodeFilter.SHOW_ALL", "0xFFFFFFFF");
Comment 2 Antonio Gomes 2014-03-26 09:41:31 PDT
(In reply to comment #1)
> We should try just removing "static_cast<int>" from the generated code. I don’t think that cast is doing us any good.

It might be important to static_cast it, so the proper jsNumber constructor can be called?
 
> Actually parsing the type of the constant (“unsigned long”) would be OK, but likely is not needed.

We already here this information:

-                push(@implContent, "    return JSValue::encode(jsNumber(static_cast<int>(" . $constant->value . ")));\n");
+                push(@implContent, "    return JSValue::encode(jsNumber(static_cast<" . $constant->type . ">(" . $constant->value . ")));\n");

> I suggest we make tests for all these enum values. They would be very easy to write:
> 
>     shouldBe("NodeFilter.SHOW_ALL", "0xFFFFFFFF");

Sounds good. There are actually compile-times tests dumped into the generated C++ code, but an IDL might have a "DoNotCheckConstants" extended attribute entry, that bypasses it.
Comment 3 Darin Adler 2014-03-26 10:07:54 PDT
(In reply to comment #2)
> (In reply to comment #1)
> > We should try just removing "static_cast<int>" from the generated code. I don’t think that cast is doing us any good.
> 
> It might be important to static_cast it, so the proper jsNumber constructor can be called?

No, I don’t believe it is important.

Generally speaking, the jsNumber constructor should correctly convert a number passed in of most any C++ type. It’s overloaded for the various types. But of course we need to test to make sure it works.

> > Actually parsing the type of the constant (“unsigned long”) would be OK, but likely is not needed.
> 
> We already here this information:
> 
> -                push(@implContent, "    return JSValue::encode(jsNumber(static_cast<int>(" . $constant->value . ")));\n");
> +                push(@implContent, "    return JSValue::encode(jsNumber(static_cast<" . $constant->type . ">(" . $constant->value . ")));\n");

If $constant->type is going to be “unsigned long” then the code above is going to be incorrect. The type “unsigned long” in IDL needs to turn into “unsigned” in C++. That’s one of the reasons I made my suggestion above. Casting to unsigned long will convert to 64-bit on a 64-bit system, which is something we don’t want to do.

> There are actually compile-times tests dumped into the generated C++ code, but an IDL might have a "DoNotCheckConstants" extended attribute entry, that bypasses it.

Tests in C++ code would not be sufficient. We need to test this in JavaScript, since it’s a JavaScript binding we are testing.
Comment 4 Antonio Gomes 2014-03-26 14:30:15 PDT
Created attachment 227885 [details]
patch - for EWS
Comment 5 Build Bot 2014-03-26 15:38:59 PDT
Comment on attachment 227885 [details]
patch - for EWS

Attachment 227885 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/6078183057129472

New failing tests:
fast/dom/constants.html
Comment 6 Build Bot 2014-03-26 15:39:03 PDT
Created attachment 227893 [details]
Archive of layout-test-results from webkit-ews-15 for mac-mountainlion-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: webkit-ews-15  Port: mac-mountainlion-wk2  Platform: Mac OS X 10.8.5
Comment 7 Build Bot 2014-03-26 16:39:13 PDT
Comment on attachment 227885 [details]
patch - for EWS

Attachment 227885 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/5987782585483264

New failing tests:
fast/dom/constants.html
Comment 8 Build Bot 2014-03-26 16:39:19 PDT
Created attachment 227897 [details]
Archive of layout-test-results from webkit-ews-03 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-03  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 9 Build Bot 2014-03-26 16:47:11 PDT
Comment on attachment 227885 [details]
patch - for EWS

Attachment 227885 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/4716566755147776

New failing tests:
fast/dom/constants.html
Comment 10 Build Bot 2014-03-26 16:47:17 PDT
Created attachment 227899 [details]
Archive of layout-test-results from webkit-ews-16 for mac-mountainlion-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: webkit-ews-16  Port: mac-mountainlion-wk2  Platform: Mac OS X 10.8.5
Comment 11 Build Bot 2014-03-26 18:06:17 PDT
Comment on attachment 227885 [details]
patch - for EWS

Attachment 227885 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/4573937333698560

New failing tests:
fast/dom/constants.html
Comment 12 Build Bot 2014-03-26 18:06:24 PDT
Created attachment 227901 [details]
Archive of layout-test-results from webkit-ews-06 for mac-mountainlion

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: webkit-ews-06  Port: mac-mountainlion  Platform: Mac OS X 10.8.5
Comment 13 Antonio Gomes 2014-03-26 21:32:49 PDT
Created attachment 227918 [details]
patch - for review
Comment 14 Build Bot 2014-03-26 23:44:24 PDT
Comment on attachment 227918 [details]
patch - for review

Attachment 227918 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/5823585985757184

New failing tests:
media/W3C/audio/canPlayType/canPlayType_application_octet_stream_with_codecs_1.html
Comment 15 Build Bot 2014-03-26 23:44:28 PDT
Created attachment 227927 [details]
Archive of layout-test-results from webkit-ews-16 for mac-mountainlion-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: webkit-ews-16  Port: mac-mountainlion-wk2  Platform: Mac OS X 10.8.5
Comment 16 Antonio Gomes 2014-03-27 12:48:30 PDT
Darin, could you review the patch?
Comment 17 Darin Adler 2014-03-27 15:31:28 PDT
Comment on attachment 227918 [details]
patch - for review

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

Fix is good, but LayoutTests part of patch is wrong.

> LayoutTests/fast/dom/constants-expected.txt:30
> -PASS: nodeFilter.SHOW_ALL should be -1 and is.
> +FAIL: nodeFilter.SHOW_ALL should be -1 but instead is 4294967295.

This is wrong.

We should fix the fast/dom/constants.html test itself, which we now believe was expecting the wrong thing.

We should not instead update the expected results to show failure!

> Source/WebCore/ChangeLog:16
> +        NodeFilter.SHOW_ALL (0xFFFFFF).

Should have 8 Fs there, not 6.
Comment 18 Antonio Gomes 2014-03-27 15:46:25 PDT
Created attachment 227998 [details]
patch  - as per Darin's review
Comment 19 Antonio Gomes 2014-03-27 15:52:12 PDT
Created attachment 227999 [details]
(actual) patch - as per Darin's review
Comment 20 Darin Adler 2014-03-27 17:10:02 PDT
Comment on attachment 227999 [details]
(actual) patch - as per Darin's review

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

> LayoutTests/fast/dom/constants.html:83
> +    shouldBe("nodeFilter.SHOW_ALL", 4294967295);

I would have written this as 0xFFFFFFFF.

> LayoutTests/fast/dom/constants.html:100
> +    shouldBe("window.NodeFilter.SHOW_ALL", 4294967295);

Ditto.
Comment 21 Antonio Gomes 2014-03-28 10:53:31 PDT
(In reply to comment #20)
> (From update of attachment 227999 [details])
> View in context: https://bugs.webkit.org/attachment.cgi?id=227999&action=review
> 
> > LayoutTests/fast/dom/constants.html:83
> > +    shouldBe("nodeFilter.SHOW_ALL", 4294967295);
> 
> I would have written this as 0xFFFFFFFF.
> 
> > LayoutTests/fast/dom/constants.html:100
> > +    shouldBe("window.NodeFilter.SHOW_ALL", 4294967295);
> 
> Ditto.

Done: <https://trac.webkit.org/r166413>