Skip to content

Commit 701e61b

Browse files
committed
Transform Jet codec towards object safety
1 parent 4bef6bb commit 701e61b

12 files changed

Lines changed: 45 additions & 34 deletions

File tree

fuzz/fuzz_targets/decode_program.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ fn do_test(data: &[u8]) {
1111
let wit_iter = BitIter::new(core::iter::repeat(0));
1212
if let Ok(program) = RedeemNode::<Core>::decode(prog_iter, wit_iter) {
1313
let mut prog_reser = Vec::<u8>::new();
14-
let mut wit_reser = std::io::sink();
14+
let mut wit_reser = Vec::<u8>::new();
1515

16-
let mut prog_w = BitWriter::from(&mut prog_reser);
17-
let mut wit_w = BitWriter::from(&mut wit_reser);
16+
let mut prog_w = BitWriter::from(&mut prog_reser as &mut dyn std::io::Write);
17+
let mut wit_w = BitWriter::from(&mut wit_reser as &mut dyn std::io::Write);
1818
program
1919
.encode(&mut prog_w, &mut wit_w)
2020
.expect("encoding to vector");

src/bit_encoding/encode.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ impl<N: node::Marker> SharingTracker<EncodeNode<'_, N>> for EncodeSharing<N> {
154154
/// Encode a Simplicity program to bits, without witness data.
155155
///
156156
/// Returns the number of written bits.
157-
pub fn encode_program<W: io::Write, N: node::Marker>(
157+
pub fn encode_program<N: node::Marker>(
158158
program: &node::Node<N>,
159-
w: &mut BitWriter<W>,
159+
w: &mut BitWriter<&mut dyn io::Write>,
160160
) -> io::Result<usize> {
161161
let iter = EncodeNode::Node(program).post_order_iter::<EncodeSharing<N>>();
162162

@@ -172,9 +172,9 @@ pub fn encode_program<W: io::Write, N: node::Marker>(
172172
}
173173

174174
/// Encode a node to bits.
175-
fn encode_node<W: io::Write, N: node::Marker>(
175+
fn encode_node<N: node::Marker>(
176176
data: PostOrderIterItem<EncodeNode<N>>,
177-
w: &mut BitWriter<W>,
177+
w: &mut BitWriter<&mut dyn io::Write>,
178178
) -> io::Result<()> {
179179
// Handle Hidden nodes specially
180180
let node = match data.node {

src/human_encoding/named_node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ impl<J: Jet> NamedCommitNode<J> {
199199

200200
/// Encode a Simplicity expression to bits without any witness data
201201
#[deprecated(since = "0.5.0", note = "use Self::encode_without_witness instead")]
202-
pub fn encode<W: io::Write>(&self, w: &mut BitWriter<W>) -> io::Result<usize> {
202+
pub fn encode(&self, w: &mut BitWriter<&mut dyn io::Write>) -> io::Result<usize> {
203203
let program_bits = encode::encode_program(self, w)?;
204204
w.flush_all()?;
205205
Ok(program_bits)

src/human_encoding/parse/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ fn parse_expr<J: Jet + 'static>(p: &mut Parser) -> Result<Expression<J>, ErrorSe
495495
Some(Token::Jet(ref name)) => {
496496
let jet_name = name.clone();
497497
p.advance();
498-
let Ok(jet) = J::from_str(&jet_name[4..]) else {
498+
let Ok(jet) = J::parse(&jet_name[4..]) else {
499499
return Err(ErrorSet::single(position, Error::UnknownJet(jet_name)));
500500
};
501501
Ok(Expression {

src/jet/init/bitcoin.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,7 @@ impl Jet for Bitcoin {
17541754
TypeName(name)
17551755
}
17561756

1757-
fn encode<W: Write>(&self, w: &mut BitWriter<W>) -> std::io::Result<usize> {
1757+
fn encode(&self, w: &mut BitWriter<&mut dyn Write>) -> std::io::Result<usize> {
17581758
let (n, len) = match self {
17591759
Bitcoin::Verify => (0, 3),
17601760
Bitcoin::Low1 => (8, 6),
@@ -2189,7 +2189,7 @@ impl Jet for Bitcoin {
21892189
w.write_bits_be(n, len)
21902190
}
21912191

2192-
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> {
2192+
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> where Self: Sized {
21932193
decode_bits!(bits, {
21942194
0 => {
21952195
0 => {
@@ -4701,6 +4701,10 @@ impl Jet for Bitcoin {
47014701
fn cost(&self) -> Cost {
47024702
unimplemented!("Unspecified cost of Bitcoin jets")
47034703
}
4704+
4705+
fn parse(s: &str) -> Result<Self, crate::Error> where Self: Sized {
4706+
str::FromStr::from_str(s)
4707+
}
47044708
}
47054709

47064710
impl fmt::Display for Bitcoin {

src/jet/init/core.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3357,7 +3357,7 @@ impl Jet for Core {
33573357
TypeName(name)
33583358
}
33593359

3360-
fn encode<W: Write>(&self, w: &mut BitWriter<W>) -> std::io::Result<usize> {
3360+
fn encode(&self, w: &mut BitWriter<&mut dyn Write>) -> std::io::Result<usize> {
33613361
let (n, len) = match self {
33623362
Core::Verify => (0, 2),
33633363
Core::Low1 => (8, 5),
@@ -3732,7 +3732,7 @@ impl Jet for Core {
37323732
w.write_bits_be(n, len)
37333733
}
37343734

3735-
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> {
3735+
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> where Self: Sized {
37363736
decode_bits!(bits, {
37373737
0 => {
37383738
0 => {Core::Verify},
@@ -6385,6 +6385,10 @@ impl Jet for Core {
63856385
Core::XorXor8 => Cost::from_milliweight(86),
63866386
}
63876387
}
6388+
6389+
fn parse(s: &str) -> Result<Self, crate::Error> where Self: Sized {
6390+
str::FromStr::from_str(s)
6391+
}
63886392
}
63896393

63906394
impl fmt::Display for Core {

src/jet/init/elements.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4285,7 +4285,7 @@ impl Jet for Elements {
42854285
TypeName(name)
42864286
}
42874287

4288-
fn encode<W: Write>(&self, w: &mut BitWriter<W>) -> std::io::Result<usize> {
4288+
fn encode(&self, w: &mut BitWriter<&mut dyn Write>) -> std::io::Result<usize> {
42894289
let (n, len) = match self {
42904290
Elements::Verify => (0, 3),
42914291
Elements::Low1 => (8, 6),
@@ -4763,7 +4763,7 @@ impl Jet for Elements {
47634763
w.write_bits_be(n, len)
47644764
}
47654765

4766-
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> {
4766+
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error> where Self: Sized {
47674767
decode_bits!(bits, {
47684768
0 => {
47694769
0 => {
@@ -7894,6 +7894,10 @@ impl Jet for Elements {
78947894
Elements::XorXor8 => Cost::from_milliweight(98),
78957895
}
78967896
}
7897+
7898+
fn parse(s: &str) -> Result<Self, crate::Error> where Self: Sized {
7899+
str::FromStr::from_str(s)
7900+
}
78977901
}
78987902

78997903
impl fmt::Display for Elements {

src/jet/mod.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,7 @@ pub trait JetEnvironment {
8080
/// Jets may read values from their _environment_.
8181
///
8282
/// Jets are **always** leaves in a Simplicity DAG.
83-
pub trait Jet:
84-
Copy + Eq + Ord + Hash + std::fmt::Debug + std::fmt::Display + std::str::FromStr + 'static
85-
{
83+
pub trait Jet: Copy + Eq + Ord + Hash + std::fmt::Debug + std::fmt::Display + 'static {
8684
/// Return the CMR of the jet.
8785
fn cmr(&self) -> Cmr;
8886

@@ -93,13 +91,18 @@ pub trait Jet:
9391
fn target_ty(&self) -> TypeName;
9492

9593
/// Encode the jet to bits.
96-
fn encode<W: Write>(&self, w: &mut BitWriter<W>) -> std::io::Result<usize>;
94+
fn encode(&self, w: &mut BitWriter<&mut dyn Write>) -> std::io::Result<usize>;
9795

9896
/// Decode a jet from bits.
99-
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error>;
97+
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error>
98+
where
99+
Self: Sized;
100100

101101
/// Return the cost of the jet.
102102
fn cost(&self) -> Cost;
103+
104+
/// Parse a jet from a string.
105+
fn parse(s: &str) -> Result<Self, crate::Error>;
103106
}
104107

105108
#[cfg(test)]

src/node/commit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ impl<J: Jet> CommitNode<J> {
283283

284284
/// Encode a Simplicity expression to bits without any witness data
285285
#[deprecated(since = "0.5.0", note = "use Self::encode_without_witness instead")]
286-
pub fn encode<W: io::Write>(&self, w: &mut BitWriter<W>) -> io::Result<usize> {
286+
pub fn encode(&self, w: &mut BitWriter<&mut dyn io::Write>) -> io::Result<usize> {
287287
let program_bits = encode::encode_program(self, w)?;
288288
w.flush_all()?;
289289
Ok(program_bits)

src/node/construct.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ impl<'brand, J: Jet> ConstructNode<'brand, J> {
258258

259259
/// Encode a Simplicity expression to bits, with no witness data
260260
#[deprecated(since = "0.5.0", note = "use Self::encode_without_witness instead")]
261-
pub fn encode<W: io::Write>(&self, w: &mut BitWriter<W>) -> io::Result<usize> {
261+
pub fn encode(&self, w: &mut BitWriter<&mut dyn io::Write>) -> io::Result<usize> {
262262
let program_bits = encode::encode_program(self, w)?;
263263
w.flush_all()?;
264264
Ok(program_bits)

0 commit comments

Comments
 (0)