From 0bd323298de243b6ad331bcce78cb08f2313b047 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 16 Oct 2024 14:51:06 +0200 Subject: [PATCH] MIR: added EMPTY_MAP instruction --- contrib/mir/src/ast.rs | 1 + contrib/mir/src/ast/micheline.rs | 3 +-- contrib/mir/src/gas.rs | 1 + contrib/mir/src/interpreter.rs | 19 ++++++++++++++++++- contrib/mir/src/typechecker.rs | 9 +++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/contrib/mir/src/ast.rs b/contrib/mir/src/ast.rs index 06d6b4b62016..0326174dc0aa 100644 --- a/contrib/mir/src/ast.rs +++ b/contrib/mir/src/ast.rs @@ -569,6 +569,7 @@ pub enum Instruction<'a> { Amount, Nil, EmptySet, + EmptyMap, EmptyBigMap(Type, Type), Mem(overloads::Mem), Get(overloads::Get), diff --git a/contrib/mir/src/ast/micheline.rs b/contrib/mir/src/ast/micheline.rs index 6e6dbd9bf242..d4bae7dbb279 100644 --- a/contrib/mir/src/ast/micheline.rs +++ b/contrib/mir/src/ast/micheline.rs @@ -253,8 +253,7 @@ macro_rules! micheline_fields { /// supported. Useful for total match in the typechecker. macro_rules! micheline_unsupported_instructions { () => { - Prim::EMPTY_MAP - | Prim::SAPLING_EMPTY_STATE + Prim::SAPLING_EMPTY_STATE | Prim::SAPLING_VERIFY_UPDATE | Prim::OPEN_CHEST | Prim::VIEW diff --git a/contrib/mir/src/gas.rs b/contrib/mir/src/gas.rs index 998f1d558b82..7b9b42235bdc 100644 --- a/contrib/mir/src/gas.rs +++ b/contrib/mir/src/gas.rs @@ -341,6 +341,7 @@ pub mod interpret_cost { pub const SIZE_LIST: u32 = 10; pub const SIZE_SET: u32 = 10; pub const SIZE_MAP: u32 = 10; + pub const EMPTY_MAP: u32 = 300; pub const EMPTY_BIG_MAP: u32 = 300; pub const CHAIN_ID: u32 = 15; pub const PACK: u32 = 0; diff --git a/contrib/mir/src/interpreter.rs b/contrib/mir/src/interpreter.rs index 082ebc3ca65d..cb4a5fb6c9d5 100644 --- a/contrib/mir/src/interpreter.rs +++ b/contrib/mir/src/interpreter.rs @@ -13,9 +13,9 @@ use cryptoxide::hashing::{blake2b_256, keccak256, sha256, sha3_256, sha512}; use num_bigint::{BigInt, BigUint, Sign}; use num_integer::Integer; use num_traits::{Signed, ToPrimitive, Zero}; +use std::cmp::min; use std::ops::{Shl, Shr}; use std::rc::Rc; -use std::cmp::min; use tezos_crypto_rs::blake2b::digest as blake2bdigest; use typed_arena::Arena; @@ -1186,6 +1186,11 @@ fn interpret_one<'a>( ctx.gas.consume(interpret_cost::EMPTY_SET)?; stack.push(V::Set(BTreeSet::new())) } + I::EmptyMap => { + use std::collections::BTreeMap; + ctx.gas.consume(interpret_cost::EMPTY_MAP)?; + stack.push(V::Map(BTreeMap::new())) + } I::EmptyBigMap(kty, vty) => { use std::collections::BTreeMap; ctx.gas.consume(interpret_cost::EMPTY_BIG_MAP)?; @@ -3734,6 +3739,18 @@ mod interpreter_tests { ); } + #[test] + fn empty_map() { + let mut ctx = Ctx::default(); + let mut stack = stk![]; + assert_eq!(interpret(&[EmptyMap], &mut ctx, &mut stack), Ok(())); + assert_eq!(stack, stk![TypedValue::Map(BTreeMap::new())]); + assert_eq!( + ctx.gas.milligas(), + Gas::default().milligas() - interpret_cost::EMPTY_MAP - interpret_cost::INTERPRET_RET + ); + } + #[test] fn empty_big_map() { let mut ctx = Ctx::default(); diff --git a/contrib/mir/src/typechecker.rs b/contrib/mir/src/typechecker.rs index 749d42391271..c3bb8cf2b411 100644 --- a/contrib/mir/src/typechecker.rs +++ b/contrib/mir/src/typechecker.rs @@ -1569,6 +1569,15 @@ pub(crate) fn typecheck_instruction<'a>( } (App(EMPTY_SET, expect_args!(1), _), _) => unexpected_micheline!(), + (App(EMPTY_MAP, [kty, vty], _), _) => { + let kty = parse_ty(ctx, kty)?; + kty.ensure_prop(&mut ctx.gas, TypeProperty::Comparable)?; + let vty = parse_ty(ctx, vty)?; + stack.push(T::new_map(kty.clone(), vty.clone())); + I::EmptyMap + } + (App(EMPTY_MAP, expect_args!(2), _), _) => unexpected_micheline!(), + (App(EMPTY_BIG_MAP, [kty, vty], _), _) => { let kty = parse_ty(ctx, kty)?; kty.ensure_prop(&mut ctx.gas, TypeProperty::Comparable)?; -- GitLab