Bug 157458 - [Bindings] Add convert<>() template specializations for integer types
Summary: [Bindings] Add convert<>() template specializations for integer types
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Bindings (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Chris Dumez
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-05-07 23:17 PDT by Chris Dumez
Modified: 2016-05-08 11:28 PDT (History)
6 users (show)

See Also:


Attachments
Patch (73.89 KB, patch)
2016-05-07 23:57 PDT, Chris Dumez
no flags Details | Formatted Diff | Diff
Patch (74.49 KB, patch)
2016-05-08 00:22 PDT, Chris Dumez
no flags Details | Formatted Diff | Diff
Patch (93.97 KB, patch)
2016-05-08 10:50 PDT, Chris Dumez
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Chris Dumez 2016-05-07 23:17:16 PDT
Add convert<>() template specializations for integer types and use them in the JS bindings.
Comment 1 Chris Dumez 2016-05-07 23:57:39 PDT
Created attachment 278357 [details]
Patch
Comment 2 Darin Adler 2016-05-08 00:12:37 PDT
Comment on attachment 278357 [details]
Patch

This looks good to me. I am concerned that our new JSDOMConvert.h things are just duplication of JSDOMBinding.h things. Eventually we don’t want so many different ways of doing the same thing.
Comment 3 Chris Dumez 2016-05-08 00:22:36 PDT
Created attachment 278359 [details]
Patch
Comment 4 Darin Adler 2016-05-08 07:53:23 PDT
Comment on attachment 278359 [details]
Patch

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

> Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp:158
> -static std::unique_ptr<CryptoAlgorithmParameters> createAesKeyGenParams(ExecState* exec, JSValue value)
> +static std::unique_ptr<CryptoAlgorithmParameters> createAesKeyGenParams(ExecState* state, JSValue value)

Generally I have been trying to change the type from ExecState* to ExecState& at the same time I change the name from exec to state.

> Source/WebCore/bindings/scripts/CodeGeneratorJS.pm:4239
> -    "long long" => "long long",
> +    "long long" => "int64_t",

I’m not completely sure I understand this change. Seems like if we did this we’d also want to use int32_t and uint32_t.

> Source/WebCore/bindings/scripts/CodeGeneratorJS.pm:4245
> -    "unsigned long long" => "unsigned long long",
> +    "unsigned long long" => "uint64_t",

Same comment here.

It seems that on Unix builds we are building on platforms that use 64-bit for long, so uint64_t is the same thing as "unsigned long" rather than "unsigned long long". (As an aside, that means that we need to be careful to never use the type "long" or "unsigned long", assuming they are 32 bits.)

This breaks the binding for IDBFactory, which is using Optional<unsigned long long> in the C++ header, not Optional<uint64_t>. Both are 64-bit types, but they are distinct types.

I think we will probably need to either go all in on the native C types or all in on the sized ones. Because IDL syntax looks like native C types, I think that’s the direction I personally would slightly prefer. So we would use "unsigned char" and "signed char" and "short" rather than using "uint8_t" and "int8_t" and "int16_t". On the other hand, those type names are all longer and then don’t go well with the names of the integer conversion functions with numbers in their names. There are other arguments in both directions two.

Or we could continue to use a mix like this, but then we would have to move to only use int64_t and uint64_t rather than "long long" and "unsigned long long" in the code.
Comment 5 Darin Adler 2016-05-08 07:54:00 PDT
Comment on attachment 278359 [details]
Patch

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

>> Source/WebCore/bindings/js/JSCryptoAlgorithmDictionary.cpp:158
>> -static std::unique_ptr<CryptoAlgorithmParameters> createAesKeyGenParams(ExecState* exec, JSValue value)
>> +static std::unique_ptr<CryptoAlgorithmParameters> createAesKeyGenParams(ExecState* state, JSValue value)
> 
> Generally I have been trying to change the type from ExecState* to ExecState& at the same time I change the name from exec to state.

Generally I have been trying to change the type from ExecState* to ExecState& at the same time I change the name from exec to state.

>> Source/WebCore/bindings/scripts/CodeGeneratorJS.pm:4239
>> -    "long long" => "long long",
>> +    "long long" => "int64_t",
> 
> I’m not completely sure I understand this change. Seems like if we did this we’d also want to use int32_t and uint32_t.

I’m not completely sure I understand this change. Seems like if we did this we’d also want to use int32_t and uint32_t.

>> Source/WebCore/bindings/scripts/CodeGeneratorJS.pm:4245
>> -    "unsigned long long" => "unsigned long long",
>> +    "unsigned long long" => "uint64_t",
> 
> Same comment here.
> 
> It seems that on Unix builds we are building on platforms that use 64-bit for long, so uint64_t is the same thing as "unsigned long" rather than "unsigned long long". (As an aside, that means that we need to be careful to never use the type "long" or "unsigned long", assuming they are 32 bits.)
> 
> This breaks the binding for IDBFactory, which is using Optional<unsigned long long> in the C++ header, not Optional<uint64_t>. Both are 64-bit types, but they are distinct types.
> 
> I think we will probably need to either go all in on the native C types or all in on the sized ones. Because IDL syntax looks like native C types, I think that’s the direction I personally would slightly prefer. So we would use "unsigned char" and "signed char" and "short" rather than using "uint8_t" and "int8_t" and "int16_t". On the other hand, those type names are all longer and then don’t go well with the names of the integer conversion functions with numbers in their names. There are other arguments in both directions two.
> 
> Or we could continue to use a mix like this, but then we would have to move to only use int64_t and uint64_t rather than "long long" and "unsigned long long" in the code.

Same comment here.

It seems that on Unix builds we are building on platforms that use 64-bit for long, so uint64_t is the same thing as "unsigned long" rather than "unsigned long long". (As an aside, that means that we need to be careful to never use the type "long" or "unsigned long", assuming they are 32 bits.)

This breaks the binding for IDBFactory, which is using Optional<unsigned long long> in the C++ header, not Optional<uint64_t>. Both are 64-bit types, but they are distinct types.

I think we will probably need to either go all in on the native C types or all in on the sized ones. Because IDL syntax looks like native C types, I think that’s the direction I personally would slightly prefer. So we would use "unsigned char" and "signed char" and "short" rather than using "uint8_t" and "int8_t" and "int16_t". On the other hand, those type names are all longer and then don’t go well with the names of the integer conversion functions with numbers in their names. There are other arguments in both directions two.

Or we could continue to use a mix like this, but then we would have to move to only use int64_t and uint64_t rather than "long long" and "unsigned long long" in the code.
Comment 6 Chris Dumez 2016-05-08 09:54:50 PDT
Ok, I did not realize they were distinct types. I'll use the native C types more consistently then (including in the convert<>() specializations).
Comment 7 Darin Adler 2016-05-08 10:20:27 PDT
(In reply to comment #6)
> Ok, I did not realize they were distinct types. I'll use the native C types
> more consistently then (including in the convert<>() specializations).

The thing that makes this tricky is that they are not exactly distinct types. The native C types are all real and distinct. The intxxx_t type are typedefs that map to one of the native C types.
Comment 8 Chris Dumez 2016-05-08 10:44:34 PDT
(In reply to comment #6)
> Ok, I did not realize they were distinct types. I'll use the native C types
> more consistently then (including in the convert<>() specializations).

Actually, given the difference between platform of the native C types, I think I prefer to use the sized types in the bindings. The sized types are also shorted.

I think that the fact that we need to map unsigned long to unsigned, and long to int is a bit confusing otherwise. Web IDL clearly defines those types to be 32bit, so mapping to uint32_t / int32_t is a bit nicer IMHO.
Comment 9 Chris Dumez 2016-05-08 10:50:17 PDT
Created attachment 278364 [details]
Patch
Comment 10 Chris Dumez 2016-05-08 11:28:22 PDT
Comment on attachment 278364 [details]
Patch

Clearing flags on attachment: 278364

Committed r200556: <http://trac.webkit.org/changeset/200556>
Comment 11 Chris Dumez 2016-05-08 11:28:29 PDT
All reviewed patches have been landed.  Closing bug.