From 203d3d71513fe316d97541dc3ef04bc8944b9f4a Mon Sep 17 00:00:00 2001 From: Sergey Pepyakin Date: Thu, 18 Apr 2019 18:48:47 +0200 Subject: [PATCH] Keep::count --- src/isa.rs | 10 ++++++++++ src/prepare/compile.rs | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/isa.rs b/src/isa.rs index 01bc69c..fcb3905 100644 --- a/src/isa.rs +++ b/src/isa.rs @@ -82,6 +82,16 @@ pub enum Keep { Single, } +impl Keep { + /// Reutrns a number of items that should be kept on the stack. + pub fn count(&self) -> u32 { + match *self { + Keep::None => 0, + Keep::Single => 1, + } + } +} + /// Specifies how many values we should keep and how many we should drop. #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub struct DropKeep { diff --git a/src/prepare/compile.rs b/src/prepare/compile.rs index a79451e..83b3f6e 100644 --- a/src/prepare/compile.rs +++ b/src/prepare/compile.rs @@ -1012,14 +1012,14 @@ fn compute_drop_keep( start_value_stack_height, ))); } - if (actual_value_stack_height as u32 - start_value_stack_height as u32) < keep as u32 { + if (actual_value_stack_height as u32 - start_value_stack_height as u32) < keep.count() { return Err(Error(format!( "Stack underflow detected: asked to keep {:?} values, but there are only {}", keep, actual_value_stack_height as u32 - start_value_stack_height as u32, ))); } - (actual_value_stack_height as u32 - start_value_stack_height as u32) - keep as u32 + (actual_value_stack_height as u32 - start_value_stack_height as u32) - keep.count() }; Ok(isa::DropKeep { drop, keep })