Skip to content

Commit bb63bff

Browse files
committed
Transform Jet codec towards object safety
1 parent 3ce087d commit bb63bff

16 files changed

Lines changed: 908 additions & 932 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");
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# This file has been automatically generated.
2-
d190505509f4c04b1b9193c6739515f9faa18aac
2+
c6ab4dd8f17838506f92f0d829c40618168817cd

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/bitcoin/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ pub use environment::BitcoinEnv;
66

77
use super::init::bitcoin::Bitcoin;
88
use super::JetEnvironment;
9-
use crate::jet::Jet;
109
use simplicity_sys::c_jets::frame_ffi::CFrameItem;
1110

1211
impl JetEnvironment for BitcoinEnv {
@@ -19,7 +18,7 @@ impl JetEnvironment for BitcoinEnv {
1918

2019
fn c_jet_ptr(
2120
jet: &Self::Jet,
22-
) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
23-
jet.c_jet_ptr()
21+
) -> fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
22+
super::init::bitcoin::c_jet_ptr(jet)
2423
}
2524
}

src/jet/core/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
use super::init::core::Core;
44
use super::JetEnvironment;
5-
use crate::jet::Jet;
65
use simplicity_sys::c_jets::frame_ffi::CFrameItem;
76

87
/// Type alias for the Core jet environment.
@@ -27,7 +26,7 @@ impl JetEnvironment for CoreEnv {
2726

2827
fn c_jet_ptr(
2928
jet: &Self::Jet,
30-
) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
31-
jet.c_jet_ptr()
29+
) -> fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
30+
super::init::core::c_jet_ptr(jet)
3231
}
3332
}

src/jet/elements/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ pub use environment::{ElementsEnv, ElementsUtxo};
99

1010
use super::init::elements::Elements;
1111
use super::JetEnvironment;
12-
use crate::jet::Jet;
1312
use simplicity_sys::c_jets::frame_ffi::CFrameItem;
1413
use simplicity_sys::CElementsTxEnv;
1514

@@ -26,7 +25,7 @@ impl JetEnvironment for ElementsTxEnv {
2625

2726
fn c_jet_ptr(
2827
jet: &Self::Jet,
29-
) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
30-
jet.c_jet_ptr()
28+
) -> fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
29+
super::init::elements::c_jet_ptr(jet)
3130
}
3231
}

src/jet/init/bitcoin.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use hashes::sha256::Midstate;
1010
use simplicity_sys::CFrameItem;
1111
use std::io::Write;
1212
use std::{fmt, str};
13-
use crate::jet::bitcoin::BitcoinEnv;
1413

1514
/// The Bitcoin jet family.
1615
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
@@ -881,13 +880,6 @@ impl Bitcoin {
881880

882881
impl Jet for Bitcoin {
883882

884-
type Environment = BitcoinEnv;
885-
type CJetEnvironment = ();
886-
887-
fn c_jet_env(_env: &Self::Environment) -> &Self::CJetEnvironment {
888-
unimplemented!("Unspecified CJetEnvironment for Bitcoin jets")
889-
}
890-
891883
fn cmr(&self) -> Cmr {
892884
unimplemented!("Bitcoin jet CMRs weights have not yet been implemented.")
893885
}
@@ -1762,7 +1754,7 @@ impl Jet for Bitcoin {
17621754
TypeName(name)
17631755
}
17641756

1765-
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> {
17661758
let (n, len) = match self {
17671759
Bitcoin::Verify => (0, 3),
17681760
Bitcoin::Low1 => (8, 6),
@@ -2197,7 +2189,7 @@ impl Jet for Bitcoin {
21972189
w.write_bits_be(n, len)
21982190
}
21992191

2200-
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 {
22012193
decode_bits!(bits, {
22022194
0 => {
22032195
0 => {
@@ -4706,13 +4698,13 @@ impl Jet for Bitcoin {
47064698
})
47074699
}
47084700

4709-
fn c_jet_ptr(&self) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool {
4710-
unimplemented!("Bitcoin jets have not yet been implemented.")
4711-
}
4712-
47134701
fn cost(&self) -> Cost {
47144702
unimplemented!("Unspecified cost of Bitcoin jets")
47154703
}
4704+
4705+
fn parse(s: &str) -> Result<Self, crate::Error> where Self: Sized {
4706+
str::FromStr::from_str(s)
4707+
}
47164708
}
47174709

47184710
impl fmt::Display for Bitcoin {
@@ -5587,3 +5579,7 @@ impl str::FromStr for Bitcoin {
55875579
}
55885580
}
55895581
}
5582+
5583+
pub(crate) fn c_jet_ptr(jet: &Bitcoin) -> fn(&mut CFrameItem, CFrameItem, &()) -> bool {
5584+
unimplemented!("Bitcoin jets have not yet been implemented.")
5585+
}

0 commit comments

Comments
 (0)