Skip to content

Commit d6e99bc

Browse files
committed
Get MemoryBufferWrite trait working
1 parent 797586f commit d6e99bc

6 files changed

Lines changed: 111 additions & 100 deletions

File tree

crates/library/std/src/buf.fe

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub struct MemoryBuffer {
5454
pub fn from_u8(value: u8) -> Self {
5555
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 1)
5656
let mut writer: MemoryBufferWriter = buf.writer()
57-
writer.write_u8(value)
57+
writer.write(value)
5858
return buf
5959
}
6060

@@ -97,71 +97,82 @@ pub struct MemoryBufferWriter {
9797
return self.cur.remainder()
9898
}
9999

100-
fn write_offset(mut self, len: u256) -> u256 {
100+
pub fn write_offset(mut self, len: u256) -> u256 {
101101
return self.buf.offset() + self.cur.advance(len)
102102
}
103103

104-
fn write_n(mut self, value: u256, len: u256) {
104+
pub fn write_n(mut self, value: u256, len: u256) {
105105
let offset: u256 = self.write_offset(len)
106106
unsafe { rewrite_slot(offset, value, len) }
107107
}
108108

109-
pub fn write_u8(mut self, value: u8) {
110-
let offset: u256 = self.write_offset(len: 1)
111-
unsafe { evm::mstore8(offset, value) }
112-
}
113-
114-
pub fn write_u16(mut self, value: u16) {
115-
self.write_n(value: u256(value), len: 2)
116-
}
117-
118-
pub fn write_u32(mut self, value: u32) {
119-
self.write_n(value: u256(value), len: 4)
120-
}
121-
122-
pub fn write_u64(mut self, value: u64) {
123-
self.write_n(value: u256(value), len: 8)
124-
}
125-
126-
pub fn write_u128(mut self, value: u128) {
127-
self.write_n(value: u256(value), len: 16)
128-
}
129-
130-
pub fn write_u256(mut self, value: u256) {
131-
let offset: u256 = self.write_offset(len: 32)
132-
unsafe { evm::mstore(offset, value) }
133-
}
134-
135109
pub fn write_buf(mut self, buf: MemoryBuffer) {
136110
let mut reader: MemoryBufferReader = buf.reader()
137111

138112
while true {
139113
let bytes_remaining: u256 = reader.remainder()
140114

141115
if bytes_remaining >= 32 {
142-
self.write_u256(value: reader.read_u256())
116+
self.write(value: reader.read_u256())
143117
} else if bytes_remaining == 0 {
144118
break
145119
} else {
146-
self.write_u8(value: reader.read_u8())
120+
self.write(value: reader.read_u8())
147121
}
148122
}
149123
}
150124

151-
// panicked at 'missing impl', crates/mir/src/lower/function.rs:1036:22
152-
// pub fn write<T: MemoryBufferWrite>(mut self, value: T) {
153-
// value.write_buf(writer: self)
154-
// }
125+
pub fn write<T: MemoryBufferWrite>(mut self, value: T) {
126+
value.write_buf(writer: self)
127+
}
155128
}
156129

157-
// pub trait MemoryBufferWrite {
158-
// fn write_buf(self, mut writer: MemoryBufferWriter);
159-
// }
160-
//
161-
// impl MemoryBufferWrite for u256 { .. }
162-
// .
163-
// .
164-
// impl MemoryBufferWrite for u8 { .. }
130+
pub trait MemoryBufferWrite {
131+
fn write_buf(self, mut writer: MemoryBufferWriter);
132+
}
133+
134+
impl MemoryBufferWrite for u256 {
135+
fn write_buf(self, mut writer: MemoryBufferWriter) {
136+
let offset: u256 = writer.write_offset(len: 32)
137+
unsafe { evm::mstore(offset, value: self) }
138+
}
139+
}
140+
141+
impl MemoryBufferWrite for u128 {
142+
fn write_buf(self, mut writer: MemoryBufferWriter) {
143+
writer.write_n(value: u256(self), len: 16)
144+
}
145+
}
146+
147+
impl MemoryBufferWrite for u64 {
148+
fn write_buf(self, mut writer: MemoryBufferWriter) {
149+
writer.write_n(value: u256(self), len: 8)
150+
}
151+
}
152+
153+
impl MemoryBufferWrite for u32 {
154+
fn write_buf(self, mut writer: MemoryBufferWriter) {
155+
writer.write_n(value: u256(self), len: 4)
156+
}
157+
}
158+
159+
impl MemoryBufferWrite for u16 {
160+
fn write_buf(self, mut writer: MemoryBufferWriter) {
161+
writer.write_n(value: u256(self), len: 2)
162+
}
163+
}
164+
165+
impl MemoryBufferWrite for u8 {
166+
fn write_buf(self, mut writer: MemoryBufferWriter) {
167+
let offset: u256 = writer.write_offset(len: 1)
168+
unsafe { evm::mstore8(offset, value: self) }
169+
}
170+
}
171+
172+
// This is needed to prevent the `mir_lower_std_lib` to crash the compiler
173+
impl MemoryBufferWrite for () {
174+
fn write_buf(self, mut writer: MemoryBufferWriter) {}
175+
}
165176

166177
/// Rewrites the left-most `len` bytes in slot with the right-most `len` bytes of `value`.
167178
unsafe fn rewrite_slot(offset: u256, value: u256, len: u256) {
@@ -247,11 +258,11 @@ pub struct MemoryBufferReader {
247258
let bytes_remaining: u256 = writer.remainder()
248259

249260
if bytes_remaining >= 32 {
250-
writer.write_u256(value: self.read_u256())
261+
writer.write(value: self.read_u256())
251262
} else if bytes_remaining == 0 {
252263
break
253264
} else {
254-
writer.write_u8(value: self.read_u8())
265+
writer.write(value: self.read_u8())
255266
}
256267
}
257268

crates/library/std/src/precompiles.fe

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@ pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address {
5858
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 128)
5959

6060
let mut writer: MemoryBufferWriter = buf.writer()
61-
writer.write_u256(value: hash)
62-
writer.write_u256(value: v)
63-
writer.write_u256(value: r)
64-
writer.write_u256(value: s)
61+
writer.write(value: hash)
62+
writer.write(value: v)
63+
writer.write(value: r)
64+
writer.write(value: s)
6565

6666
Precompile::EcRecover.single_buf_call(buf)
6767

@@ -106,9 +106,9 @@ pub fn mod_exp(
106106
)
107107

108108
let mut writer: MemoryBufferWriter = buf.writer()
109-
writer.write_u256(value: b_size)
110-
writer.write_u256(value: e_size)
111-
writer.write_u256(value: m_size)
109+
writer.write(value: b_size)
110+
writer.write(value: e_size)
111+
writer.write(value: m_size)
112112
writer.write_buf(buf: b)
113113
writer.write_buf(buf: e)
114114
writer.write_buf(buf: m)
@@ -124,10 +124,10 @@ pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256) -> (u256, u256) {
124124
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 128)
125125
let mut writer: MemoryBufferWriter = buf.writer()
126126

127-
writer.write_u256(value: x1)
128-
writer.write_u256(value: y1)
129-
writer.write_u256(value: x2)
130-
writer.write_u256(value: y2)
127+
writer.write(value: x1)
128+
writer.write(value: y1)
129+
writer.write(value: x2)
130+
writer.write(value: y2)
131131

132132
Precompile::EcAdd.single_buf_call(buf)
133133

@@ -140,9 +140,9 @@ pub fn ec_mul(x: u256, y: u256, s: u256) -> (u256, u256) {
140140
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 128)
141141
let mut writer: MemoryBufferWriter = buf.writer()
142142

143-
writer.write_u256(value: x)
144-
writer.write_u256(value: y)
145-
writer.write_u256(value: s)
143+
writer.write(value: x)
144+
writer.write(value: y)
145+
writer.write(value: s)
146146

147147
Precompile::EcMul.single_buf_call(buf)
148148

@@ -169,11 +169,11 @@ pub fn blake_2f(
169169
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 213)
170170
let mut writer: MemoryBufferWriter = buf.writer()
171171

172-
writer.write_u32(value: rounds)
173-
for value in h { writer.write_u64(value) }
174-
for value in m { writer.write_u64(value) }
175-
for value in t { writer.write_u64(value) }
176-
writer.write_u8(value: 1 if f else 0)
172+
writer.write(value: rounds)
173+
for value in h { writer.write(value) }
174+
for value in m { writer.write(value) }
175+
for value in t { writer.write(value) }
176+
writer.write(value: u8(1) if f else u8(0))
177177

178178
Precompile::Blake2f.single_buf_call(buf)
179179

crates/tests/fixtures/files/buf.fe

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ fn test_buf_rw() {
77
let mut writer: MemoryBufferWriter = buf.writer()
88
let mut reader: MemoryBufferReader = buf.reader()
99

10-
writer.write_u256(value: 42)
11-
writer.write_u256(value: 42)
12-
writer.write_u256(value: 26)
13-
writer.write_u8(value: 26)
14-
writer.write_u256(value: u256::max())
15-
writer.write_u128(value: u128::max())
16-
writer.write_u64(value: u64::max())
17-
writer.write_u32(value: u32::max())
18-
writer.write_u16(value: u16::max())
19-
writer.write_u8(value: u8::max())
20-
writer.write_u8(value: 0)
10+
writer.write(value: 42)
11+
writer.write(value: 42)
12+
writer.write(value: 26)
13+
writer.write(value: u8(26))
14+
writer.write(value: u256::max())
15+
writer.write(value: u128::max())
16+
writer.write(value: u64::max())
17+
writer.write(value: u32::max())
18+
writer.write(value: u16::max())
19+
writer.write(value: u8::max())
20+
writer.write(value: u8(0))
2121

2222
assert reader.read_u256() == 42
2323
assert reader.read_u256() == 42

crates/tests/fixtures/files/precompiles.fe

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,18 @@ fn test_ec_pairing() {
8181
let mut buf: MemoryBuffer = MemoryBuffer::new(len: 384)
8282
let mut writer: MemoryBufferWriter = buf.writer()
8383

84-
writer.write_u256(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
85-
writer.write_u256(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
86-
writer.write_u256(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
87-
writer.write_u256(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
88-
writer.write_u256(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
89-
writer.write_u256(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
90-
writer.write_u256(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
91-
writer.write_u256(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
92-
writer.write_u256(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
93-
writer.write_u256(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
94-
writer.write_u256(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
95-
writer.write_u256(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
84+
writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
85+
writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
86+
writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
87+
writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
88+
writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
89+
writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
90+
writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
91+
writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
92+
writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
93+
writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
94+
writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
95+
writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
9696

9797
assert precompiles::ec_pairing(buf)
9898
}

crates/tests/fixtures/files/raw_call.fe

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn test_raw_call(mut ctx: Context) {
2626
)
2727
let mut writer: MemoryBufferWriter = buf.writer()
2828

29-
writer.write_u256(value: 42)
29+
writer.write(value: 42)
3030
assert ctx.raw_call(addr: address(foo), value: 0, buf)
3131

3232
let mut reader: MemoryBufferReader = buf.reader()

newsfragments/885.feature.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ fn test_buf_rw() {
1414
let mut writer: MemoryBufferWriter = buf.writer()
1515
let mut reader: MemoryBufferReader = buf.reader()
1616
17-
writer.write_u256(value: 42)
18-
writer.write_u256(value: 42)
19-
writer.write_u256(value: 26)
20-
writer.write_u8(value: 26)
21-
writer.write_u256(value: u256::max())
22-
writer.write_u128(value: u128::max())
23-
writer.write_u64(value: u64::max())
24-
writer.write_u32(value: u32::max())
25-
writer.write_u16(value: u16::max())
26-
writer.write_u8(value: u8::max())
27-
writer.write_u8(value: 0)
17+
writer.write(value: 42)
18+
writer.write(value: 42)
19+
writer.write(value: 26)
20+
writer.write(value: u8(26))
21+
writer.write(value: u256::max())
22+
writer.write(value: u128::max())
23+
writer.write(value: u64::max())
24+
writer.write(value: u32::max())
25+
writer.write(value: u16::max())
26+
writer.write(value: u8::max())
27+
writer.write(value: u8(0))
2828
2929
assert reader.read_u256() == 42
3030
assert reader.read_u256() == 42
@@ -94,7 +94,7 @@ fn test_raw_call(mut ctx: Context) {
9494
)
9595
let mut writer: MemoryBufferWriter = buf.writer()
9696
97-
writer.write_u256(value: 42)
97+
writer.write(value: 42)
9898
assert ctx.raw_call(addr: address(foo), value: 0, buf)
9999
100100
let mut reader: MemoryBufferReader = buf.reader()

0 commit comments

Comments
 (0)