Translate LongLong types to f64

Any LongLong still present after flattening now gets translated to a `f64` type
so we can bind these types. While not a true integral value or truely 64-bits of
integer precision, it's all JS has anyway!
This commit is contained in:
Alex Crichton
2018-09-14 18:44:54 -07:00
parent 941397745d
commit ae60bb4ba8
2 changed files with 17 additions and 3 deletions

View File

@ -1087,7 +1087,7 @@ impl ToTokens for ast::Const {
Null => unimplemented!(),
};
let declaration = quote!(#vis const #name: #ty = #value;);
let declaration = quote!(#vis const #name: #ty = #value as #ty;);
if let Some(class) = &self.class {
(quote! {

View File

@ -461,8 +461,22 @@ impl<'a> IdlType<'a> {
IdlType::UnsignedShort => Some(ident_ty(raw_ident("u16"))),
IdlType::Long => Some(ident_ty(raw_ident("i32"))),
IdlType::UnsignedLong => Some(ident_ty(raw_ident("u32"))),
IdlType::LongLong => None,
IdlType::UnsignedLongLong => None,
// Technically these are 64-bit numbers, but we're binding web
// APIs that don't actually have return the corresponding 64-bit
// type, `BigInt`. Instead the web basically uses floats for these
// values. We already expand these types in argument position to
// i32/f64 (convenience for i32, losslessness for f64). If we get
// here then we're looking at an un-flattened long type such as
// dictionary fields or return types. In order to generate bindings
// for these functions we just use `f64` here, which should match
// exactly what the JS web currently uses anyway.
//
// Perhaps one day we'll bind to u64/i64 here, but we need `BigInt`
// to see more usage!
IdlType::LongLong |
IdlType::UnsignedLongLong => Some(ident_ty(raw_ident("f64"))),
IdlType::Float => Some(ident_ty(raw_ident("f32"))),
IdlType::UnrestrictedFloat => Some(ident_ty(raw_ident("f32"))),
IdlType::Double => Some(ident_ty(raw_ident("f64"))),