Skip to content

Commit 2ce848f

Browse files
committed
Remove type restrictions on IR nodes when (de)serializing
1 parent 5b8c709 commit 2ce848f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+558
-346
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ derive_more = { version = "2.0.1", default-features = false, features = [
5858
] }
5959
num-derive = "0.4.2"
6060
thiserror = { version = "2.0.1", default-features = false }
61-
bounded-vec = { version = "0.8.0", default-features = false }
61+
bounded-vec = { version = "0.9.0", default-features = false }
6262
bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] }
6363
blake2 = { version = "0.10.6", default-features = false }
6464
sha2 = { version = "0.10", default-features = false }

bindings/ergo-lib-wasm/src/box_selector.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
//! Simple box selection algorithms
2+
use bounded_vec::NonEmptyBoundedVec;
23
use ergo_lib::ergotree_ir::chain;
34
use ergo_lib::wallet;
45
use ergo_lib::wallet::box_selector::BoxSelector;
@@ -9,7 +10,6 @@ use crate::ergo_box::BoxValue;
910
use crate::ergo_box::ErgoBoxAssetsDataList;
1011
use crate::error_conversion::to_js;
1112
use crate::token::Tokens;
12-
use bounded_vec::BoundedVec;
1313

1414
extern crate derive_more;
1515
use derive_more::{From, Into};
@@ -29,7 +29,7 @@ impl BoxSelection {
2929
Ok(BoxSelection(wallet::box_selector::BoxSelection::<
3030
ergo_lib::ergotree_ir::chain::ergo_box::ErgoBox,
3131
> {
32-
boxes: BoundedVec::from_vec(boxes.clone().into()).map_err(to_js)?,
32+
boxes: NonEmptyBoundedVec::from_vec(boxes.clone().into()).map_err(to_js)?,
3333
change_boxes: change.clone().into(),
3434
}))
3535
}

ergo-lib/src/wallet/tx_builder.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,6 @@ impl<S: ErgoBoxAssets + ErgoBoxId + Clone> TxBuilder<S> {
142142
}
143143

144144
fn build_tx(&self) -> Result<UnsignedTransaction, TxBuilderError> {
145-
if self.box_selection.boxes.is_empty() {
146-
return Err(TxBuilderError::InvalidArgs("inputs are empty".to_string()));
147-
}
148145
if self.output_candidates.is_empty() {
149146
return Err(TxBuilderError::InvalidArgs("outputs are empty".to_string()));
150147
}

ergo-p2p/src/peer_spec.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! PeerSpec types
22
use std::io;
33

4-
use bounded_vec::BoundedVec;
4+
use bounded_vec::{BoundedVec, NonEmptyBoundedVec};
55
use ergo_chain_types::PeerAddr;
66
use sigma_ser::vlq_encode::VlqEncodingError;
77
use sigma_ser::{ScorexParsingError, ScorexSerializable, ScorexSerializeResult};
@@ -118,7 +118,7 @@ impl ScorexSerializable for PeerSpec {
118118
for _ in 0..n {
119119
f.push(PeerFeature::scorex_parse(r)?);
120120
}
121-
Some(BoundedVec::from_vec(f)?)
121+
Some(NonEmptyBoundedVec::from_vec(f)?)
122122
}
123123
};
124124

@@ -152,7 +152,7 @@ pub mod arbitrary {
152152
option::of(vec(any::<PeerFeature>(), 1..4)),
153153
)
154154
.prop_map(|(version, declared_addr, features)| {
155-
let feats = features.map(|f| BoundedVec::from_vec(f).unwrap());
155+
let feats = features.map(|f| NonEmptyBoundedVec::from_vec(f).unwrap());
156156

157157
PeerSpec::new(
158158
"/Ergo-Scala-client:2.0.0(iPad; U; CPU OS 3_2_1)/AndroidBuild:0.8/",

ergotree-interpreter/src/eval/coll_exists.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,7 @@ impl Evaluable for Exists {
4141
))),
4242
};
4343
let normalized_input_vals: Vec<Value> = match input_v {
44-
Value::Coll(coll) => {
45-
if coll.elem_tpe() != &*self.elem_tpe {
46-
return Err(EvalError::UnexpectedValue(format!(
47-
"expected Exists input element type to be {0:?}, got: {1:?}",
48-
self.elem_tpe,
49-
coll.elem_tpe()
50-
)));
51-
};
52-
Ok(coll.as_vec())
53-
}
44+
Value::Coll(coll) => Ok(coll.as_vec()),
5445
_ => Err(EvalError::UnexpectedValue(format!(
5546
"expected Map input to be Value::Coll, got: {0:?}",
5647
input_v

ergotree-interpreter/src/eval/coll_filter.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use ergotree_ir::mir::coll_filter::Filter;
66
use ergotree_ir::mir::constant::TryExtractInto;
77
use ergotree_ir::mir::value::CollKind;
88
use ergotree_ir::mir::value::Value;
9+
use ergotree_ir::types::stype::SType;
910

1011
use crate::eval::env::Env;
1112
use crate::eval::Context;
@@ -18,6 +19,13 @@ impl Evaluable for Filter {
1819
env: &mut Env<'ctx>,
1920
ctx: &Context<'ctx>,
2021
) -> Result<Value<'ctx>, EvalError> {
22+
let input_elem_type = match self.input.post_eval_tpe() {
23+
SType::SColl(elem_type) => Ok(elem_type.clone()),
24+
_ => Err(EvalError::UnexpectedExpr(format!(
25+
"Expected ForAll input to be SColl, got {0:?}",
26+
self.input.tpe()
27+
))),
28+
}?;
2129
let input_v = self.input.eval(env, ctx)?;
2230
let condition_v = self.condition.eval(env, ctx)?;
2331
let input_v_clone = input_v.clone();
@@ -45,10 +53,10 @@ impl Evaluable for Filter {
4553
};
4654
let normalized_input_vals: Vec<Value> = match input_v {
4755
Value::Coll(coll) => {
48-
if coll.elem_tpe() != &*self.elem_tpe {
56+
if coll.elem_tpe() != &*input_elem_type {
4957
return Err(EvalError::UnexpectedValue(format!(
5058
"expected Filter input element type to be {0:?}, got: {1:?}",
51-
self.elem_tpe,
59+
input_elem_type,
5260
coll.elem_tpe()
5361
)));
5462
};
@@ -77,7 +85,7 @@ impl Evaluable for Filter {
7785
.map(|(item, _)| item)
7886
.collect::<Arc<_>>();
7987
Ok(Value::Coll(CollKind::from_collection(
80-
(*self.elem_tpe).clone(),
88+
(*input_elem_type).clone(),
8189
filtered_items,
8290
)?))
8391
}

ergotree-interpreter/src/eval/coll_forall.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use alloc::vec::Vec;
33
use ergotree_ir::mir::coll_forall::ForAll;
44
use ergotree_ir::mir::constant::TryExtractInto;
55
use ergotree_ir::mir::value::Value;
6+
use ergotree_ir::types::stype::SType;
67

78
use crate::eval::env::Env;
89
use crate::eval::Context;
@@ -15,6 +16,13 @@ impl Evaluable for ForAll {
1516
env: &mut Env<'ctx>,
1617
ctx: &Context<'ctx>,
1718
) -> Result<Value<'ctx>, EvalError> {
19+
let input_elem_type = match self.input.post_eval_tpe() {
20+
SType::SColl(elem_type) => Ok(elem_type),
21+
_ => Err(EvalError::UnexpectedExpr(format!(
22+
"Expected ForAll input to be SColl, got {0:?}",
23+
self.input.tpe()
24+
))),
25+
}?;
1826
let input_v = self.input.eval(env, ctx)?;
1927
let condition_v = self.condition.eval(env, ctx)?;
2028
let input_v_clone = input_v.clone();
@@ -42,10 +50,10 @@ impl Evaluable for ForAll {
4250
};
4351
let normalized_input_vals: Vec<Value> = match input_v {
4452
Value::Coll(coll) => {
45-
if coll.elem_tpe() != &*self.elem_tpe {
53+
if coll.elem_tpe() != &*input_elem_type {
4654
return Err(EvalError::UnexpectedValue(format!(
4755
"expected ForAll input element type to be {0:?}, got: {1:?}",
48-
self.elem_tpe,
56+
input_elem_type,
4957
coll.elem_tpe()
5058
)));
5159
};

ergotree-interpreter/src/eval/collection.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ impl Evaluable for Collection {
2424
Collection::Exprs { elem_tpe, items } => {
2525
let items_v: Result<Arc<[Value]>, EvalError> =
2626
items.iter().map(|i| i.eval(env, ctx)).collect();
27+
if let Some(tpe) = items
28+
.iter()
29+
.map(|item| item.tpe())
30+
.find(|tpe| tpe != elem_tpe)
31+
{
32+
return Err(EvalError::UnexpectedExpr(format!(
33+
"Collection: expected value of type {elem_tpe:?}, found {tpe:?}"
34+
)));
35+
}
2736
match elem_tpe {
2837
SType::SByte => {
2938
let bytes: Result<Arc<[i8]>, TryExtractFromError> = items_v?

ergotree-interpreter/src/eval/extract_reg_as.rs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::convert::TryInto;
2-
31
use alloc::boxed::Box;
42
use ergotree_ir::chain::ergo_box::ErgoBox;
53
use ergotree_ir::mir::constant::TryExtractInto;
@@ -22,24 +20,19 @@ impl Evaluable for ExtractRegisterAs {
2220
.input
2321
.eval(env, ctx)?
2422
.try_extract_into::<Ref<'_, ErgoBox>>()?;
25-
let id = self.register_id.try_into().map_err(|e| {
26-
EvalError::RegisterIdOutOfBounds(format!(
27-
"register index {} is out of bounds: {:?} ",
28-
self.register_id, e
29-
))
30-
})?;
31-
let reg_val_opt = ir_box.get_register(id).map_err(|e| {
23+
let reg_val_opt = ir_box.get_register(self.register_id).map_err(|e| {
3224
EvalError::NotFound(format!(
33-
"Error getting the register id {id} with error {e:?}"
25+
"Error getting the register id {} with error {e:?}",
26+
self.register_id
3427
))
3528
})?;
3629
match reg_val_opt {
3730
Some(constant) if constant.tpe == *self.elem_tpe => {
3831
Ok(Value::Opt(Some(Box::new(constant.v.into()))))
3932
}
4033
Some(constant) => Err(EvalError::UnexpectedValue(format!(
41-
"Expected register {id} to be of type {}, got {}",
42-
self.elem_tpe, constant.tpe
34+
"Expected register {} to be of type {}, got {}",
35+
self.register_id, self.elem_tpe, constant.tpe
4336
))),
4437
None => Ok(Value::Opt(None)),
4538
}
@@ -56,7 +49,6 @@ mod tests {
5649
use ergotree_ir::mir::expr::Expr;
5750
use ergotree_ir::mir::global_vars::GlobalVars;
5851
use ergotree_ir::mir::option_get::OptionGet;
59-
use ergotree_ir::mir::unary_op::OneArgOpTryBuild;
6052
use ergotree_ir::types::stype::SType;
6153
use sigma_test_util::force_any_val;
6254

@@ -69,7 +61,7 @@ mod tests {
6961
)
7062
.unwrap()
7163
.into();
72-
let option_get_expr: Expr = OptionGet::try_build(get_reg_expr).unwrap().into();
64+
let option_get_expr: Expr = OptionGet::new(get_reg_expr).unwrap().into();
7365
let ctx = force_any_val::<Context>();
7466
let v = eval_out::<i64>(&option_get_expr, &ctx);
7567
assert_eq!(v, ctx.self_box.value.as_i64());
@@ -84,7 +76,7 @@ mod tests {
8476
)
8577
.unwrap()
8678
.into();
87-
let option_get_expr: Expr = OptionGet::try_build(get_reg_expr).unwrap().into();
79+
let option_get_expr: Expr = OptionGet::new(get_reg_expr).unwrap().into();
8880
let ctx = force_any_val::<Context>();
8981
assert!(try_eval_out::<Value>(&option_get_expr, &ctx).is_err());
9082
}

ergotree-interpreter/src/eval/option_get.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ mod tests {
3636
use ergotree_ir::mir::expr::Expr;
3737
use ergotree_ir::mir::extract_reg_as::ExtractRegisterAs;
3838
use ergotree_ir::mir::global_vars::GlobalVars;
39-
use ergotree_ir::mir::unary_op::OneArgOpTryBuild;
4039
use ergotree_ir::types::stype::SType;
4140
use sigma_test_util::force_any_val;
4241

@@ -49,7 +48,7 @@ mod tests {
4948
)
5049
.unwrap()
5150
.into();
52-
let option_get_expr: Expr = OptionGet::try_build(get_reg_expr).unwrap().into();
51+
let option_get_expr: Expr = OptionGet::new(get_reg_expr).unwrap().into();
5352
let ctx = force_any_val::<Context>();
5453
let v = eval_out::<i64>(&option_get_expr, &ctx);
5554
assert_eq!(v, ctx.self_box.value.as_i64());

0 commit comments

Comments
 (0)