From 621fc9c4408c6b99fa0bf37578f5f8ed7490de97 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 11 Jun 2019 11:51:36 -0700 Subject: [PATCH] Remove the `Clamped` descriptor type This is just a bit too general to work with and is pretty funky. Instead just tweak `Clamped<&[u8]>` to naturally generate a descriptor for `Ref(Slice(ClampedU8))`, requiring fewer gymnastics when interpreting descriptors. --- crates/cli-support/src/anyref.rs | 1 - crates/cli-support/src/descriptor.rs | 36 +++++++++++----------------- crates/cli-support/src/js/js2rust.rs | 2 +- crates/cli-support/src/js/rust2js.rs | 2 +- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/crates/cli-support/src/anyref.rs b/crates/cli-support/src/anyref.rs index b56085b1..5576a891 100644 --- a/crates/cli-support/src/anyref.rs +++ b/crates/cli-support/src/anyref.rs @@ -82,7 +82,6 @@ fn process_closure_arguments(cfg: &mut Context, function: &mut Function) { | Descriptor::RefMut(d) | Descriptor::Option(d) | Descriptor::Slice(d) - | Descriptor::Clamped(d) | Descriptor::Vector(d) => process_descriptor(cfg, d), Descriptor::Closure(c) => process_closure(cfg, c), Descriptor::Function(c) => process_function(cfg, c), diff --git a/crates/cli-support/src/descriptor.rs b/crates/cli-support/src/descriptor.rs index ebaf794f..1d263234 100644 --- a/crates/cli-support/src/descriptor.rs +++ b/crates/cli-support/src/descriptor.rs @@ -42,6 +42,7 @@ tys! { pub enum Descriptor { I8, U8, + ClampedU8, I16, U16, I32, @@ -64,7 +65,6 @@ pub enum Descriptor { Char, Option(Box), Unit, - Clamped(Box), } #[derive(Debug, Clone)] @@ -105,17 +105,18 @@ pub struct Number { impl Descriptor { pub fn decode(mut data: &[u32]) -> Descriptor { - let descriptor = Descriptor::_decode(&mut data); + let descriptor = Descriptor::_decode(&mut data, false); assert!(data.is_empty(), "remaining data {:?}", data); descriptor } - fn _decode(data: &mut &[u32]) -> Descriptor { + fn _decode(data: &mut &[u32], clamped: bool) -> Descriptor { match get(data) { I8 => Descriptor::I8, I16 => Descriptor::I16, I32 => Descriptor::I32, I64 => Descriptor::I64, + U8 if clamped => Descriptor::ClampedU8, U8 => Descriptor::U8, U16 => Descriptor::U16, U32 => Descriptor::U32, @@ -125,11 +126,11 @@ impl Descriptor { BOOLEAN => Descriptor::Boolean, FUNCTION => Descriptor::Function(Box::new(Function::decode(data))), CLOSURE => Descriptor::Closure(Box::new(Closure::decode(data))), - REF => Descriptor::Ref(Box::new(Descriptor::_decode(data))), - REFMUT => Descriptor::RefMut(Box::new(Descriptor::_decode(data))), - SLICE => Descriptor::Slice(Box::new(Descriptor::_decode(data))), - VECTOR => Descriptor::Vector(Box::new(Descriptor::_decode(data))), - OPTIONAL => Descriptor::Option(Box::new(Descriptor::_decode(data))), + REF => Descriptor::Ref(Box::new(Descriptor::_decode(data, clamped))), + REFMUT => Descriptor::RefMut(Box::new(Descriptor::_decode(data, clamped))), + SLICE => Descriptor::Slice(Box::new(Descriptor::_decode(data, clamped))), + VECTOR => Descriptor::Vector(Box::new(Descriptor::_decode(data, clamped))), + OPTIONAL => Descriptor::Option(Box::new(Descriptor::_decode(data, clamped))), STRING => Descriptor::String, ANYREF => Descriptor::Anyref, ENUM => Descriptor::Enum { hole: get(data) }, @@ -141,7 +142,7 @@ impl Descriptor { } CHAR => Descriptor::Char, UNIT => Descriptor::Unit, - CLAMPED => Descriptor::Clamped(Box::new(Descriptor::_decode(data))), + CLAMPED => Descriptor::_decode(data, true), other => panic!("unknown descriptor: {}", other), } } @@ -217,6 +218,7 @@ impl Descriptor { let inner = match *self { Descriptor::String => return Some(VectorKind::String), Descriptor::Vector(ref d) => &**d, + Descriptor::Slice(ref d) => &**d, Descriptor::Ref(ref d) => match **d { Descriptor::Slice(ref d) => &**d, Descriptor::String => return Some(VectorKind::String), @@ -226,10 +228,6 @@ impl Descriptor { Descriptor::Slice(ref d) => &**d, _ => return None, }, - Descriptor::Clamped(ref d) => match d.vector_kind()? { - VectorKind::U8 => return Some(VectorKind::ClampedU8), - _ => return None, - }, _ => return None, }; match *inner { @@ -238,6 +236,7 @@ impl Descriptor { Descriptor::I32 => Some(VectorKind::I32), Descriptor::I64 => Some(VectorKind::I64), Descriptor::U8 => Some(VectorKind::U8), + Descriptor::ClampedU8 => Some(VectorKind::ClampedU8), Descriptor::U16 => Some(VectorKind::U16), Descriptor::U32 => Some(VectorKind::U32), Descriptor::U64 => Some(VectorKind::U64), @@ -279,13 +278,6 @@ impl Descriptor { } } - pub fn is_clamped_by_ref(&self) -> bool { - match self { - Descriptor::Clamped(d) => d.is_by_ref(), - _ => false, - } - } - pub fn is_mut_ref(&self) -> bool { match *self { Descriptor::RefMut(_) => true, @@ -396,12 +388,12 @@ impl Function { fn decode(data: &mut &[u32]) -> Function { let shim_idx = get(data); let arguments = (0..get(data)) - .map(|_| Descriptor::_decode(data)) + .map(|_| Descriptor::_decode(data, false)) .collect::>(); Function { arguments, shim_idx, - ret: Descriptor::_decode(data), + ret: Descriptor::_decode(data, false), } } } diff --git a/crates/cli-support/src/js/js2rust.rs b/crates/cli-support/src/js/js2rust.rs index 4fe8c303..3f01cc0b 100644 --- a/crates/cli-support/src/js/js2rust.rs +++ b/crates/cli-support/src/js/js2rust.rs @@ -204,7 +204,7 @@ impl<'a, 'b> Js2Rust<'a, 'b> { i = i, val = val, )); - if arg.is_by_ref() || arg.is_clamped_by_ref() { + if arg.is_by_ref() { if optional { bail!("optional slices aren't currently supported"); } diff --git a/crates/cli-support/src/js/rust2js.rs b/crates/cli-support/src/js/rust2js.rs index b2d39ada..b334c27e 100644 --- a/crates/cli-support/src/js/rust2js.rs +++ b/crates/cli-support/src/js/rust2js.rs @@ -165,7 +165,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> { }, )); - if !arg.is_by_ref() && !arg.is_clamped_by_ref() { + if !arg.is_by_ref() { self.prelude(&format!( "\ {start}