@@ -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`.
167178unsafe 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
0 commit comments