@@ -75,6 +75,11 @@ fn create_custom_deployer(payload: &[u8]) -> Module {
75
75
// This is the pre-written deployer code.
76
76
let mut module: Module = parity_wasm:: deserialize_buffer ( & code) . expect ( "Failed to load module" ) ;
77
77
78
+ // Re-write memory to pre-allocate enough for code size
79
+ let memory_initial = ( payload. len ( ) as u32 / 65536 ) + 1 ;
80
+ let mem_type = parity_wasm:: elements:: MemoryType :: new ( memory_initial, None , false ) ;
81
+ module. memory_section_mut ( ) . unwrap ( ) . entries_mut ( ) [ 0 ] = mem_type;
82
+
78
83
// Prepare payload (append length).
79
84
let mut custom_payload = payload. to_vec ( ) ;
80
85
custom_payload
@@ -102,6 +107,8 @@ fn create_memory_deployer(payload: &[u8]) -> Module {
102
107
parity_wasm:: elements:: Instruction :: End ,
103
108
] ;
104
109
110
+ let memory_initial = ( payload. len ( ) as u32 / 65536 ) + 1 ;
111
+
105
112
let module = builder:: module ( )
106
113
// Create a func/type for the ethereum::finish
107
114
. function ( )
@@ -132,6 +139,7 @@ fn create_memory_deployer(payload: &[u8]) -> Module {
132
139
. build ( )
133
140
// Add default memory section
134
141
. memory ( )
142
+ . with_min ( memory_initial)
135
143
. build ( )
136
144
// Export memory
137
145
. export ( )
@@ -214,6 +222,19 @@ mod tests {
214
222
assert_eq ! ( output, expected) ;
215
223
}
216
224
225
+ #[ test]
226
+ fn big_payload ( ) {
227
+ let payload = [ 0 ; 632232 ] ;
228
+ let module = Deployer :: with_preset ( "customsection" , & payload)
229
+ . unwrap ( )
230
+ . create ( )
231
+ . unwrap ( ) ;
232
+ let memory_initial = module. memory_section ( ) . unwrap ( ) . entries ( ) [ 0 ]
233
+ . limits ( )
234
+ . initial ( ) ;
235
+ assert_eq ! ( memory_initial, 10 ) ;
236
+ }
237
+
217
238
#[ test]
218
239
fn memory_zero_payload ( ) {
219
240
let payload = vec ! [ ] ;
@@ -252,4 +273,17 @@ mod tests {
252
273
let output = parity_wasm:: serialize ( module) . expect ( "Failed to serialize" ) ;
253
274
assert_eq ! ( output, expected) ;
254
275
}
276
+
277
+ #[ test]
278
+ fn memory_big_payload ( ) {
279
+ let payload = [ 0 ; 632232 ] ;
280
+ let module = Deployer :: with_preset ( "memory" , & payload)
281
+ . unwrap ( )
282
+ . create ( )
283
+ . unwrap ( ) ;
284
+ let memory_initial = module. memory_section ( ) . unwrap ( ) . entries ( ) [ 0 ]
285
+ . limits ( )
286
+ . initial ( ) ;
287
+ assert_eq ! ( memory_initial, 10 ) ;
288
+ }
255
289
}
0 commit comments