@@ -15,9 +15,13 @@ use wasmer_middlewares::metering::{get_remaining_points, MeteringPoints};
15
15
16
16
use pwasm_utils:: { self , rules} ;
17
17
18
- use wasmer:: {
19
- imports, wasmparser, wasmparser:: Operator , CompilerConfig , Function , Singlepass , Store , JIT ,
20
- } ;
18
+ #[ cfg( feature = "cranelift" ) ]
19
+ use wasmer:: Cranelift ;
20
+
21
+ #[ cfg( not( feature = "cranelift" ) ) ]
22
+ use wasmer:: Singlepass ;
23
+
24
+ use wasmer:: { imports, wasmparser, wasmparser:: Operator , CompilerConfig , Function , Store , JIT } ;
21
25
use wasmer_middlewares:: Metering ;
22
26
23
27
use owasm_crypto:: ecvrf;
@@ -134,6 +138,21 @@ pub fn compile(code: &[u8]) -> Result<Vec<u8>, Error> {
134
138
elements:: serialize ( module) . map_err ( |_| Error :: SerializationError )
135
139
}
136
140
141
+ pub fn new_compile ( code : & [ u8 ] ) -> Result < Vec < u8 > , Error > {
142
+ // Check that the given Wasm code is indeed a valid Wasm.
143
+ wasmparser:: validate ( code) . map_err ( |_| Error :: ValidationError ) ?;
144
+
145
+ // Start the compiling chains.
146
+ let module = elements:: deserialize_buffer ( code) . map_err ( |_| Error :: DeserializationError ) ?;
147
+ check_wasm_exports ( & module) ?;
148
+ check_wasm_imports ( & module) ?;
149
+ let module = inject_memory ( module) ?;
150
+ let module = inject_stack_height ( module) ?;
151
+
152
+ // Serialize the final Wasm code back to bytes.
153
+ elements:: serialize ( module) . map_err ( |_| Error :: SerializationError )
154
+ }
155
+
137
156
fn require_mem_range ( max_range : usize , require_range : usize ) -> Result < ( ) , Error > {
138
157
if max_range < require_range {
139
158
return Err ( Error :: MemoryOutOfBoundError ) ;
@@ -164,7 +183,12 @@ where
164
183
{
165
184
let owasm_env = Environment :: new ( env, gas) ;
166
185
186
+ #[ cfg( feature = "cranelift" ) ]
187
+ let mut compiler = Cranelift :: default ( ) ;
188
+
189
+ #[ cfg( not( feature = "cranelift" ) ) ]
167
190
let mut compiler = Singlepass :: default ( ) ;
191
+
168
192
let metering = Arc :: new ( Metering :: new ( 4294967290 , cost) ) ;
169
193
compiler. push_middleware ( metering) ;
170
194
let engine = Universal :: new ( compiler) . engine ( ) ;
@@ -173,9 +197,9 @@ where
173
197
let import_object = imports ! {
174
198
"env" => {
175
199
"gas" => Function :: new_native_with_env( & store, owasm_env. clone( ) , |env: & Environment <E >, gas: u32 | {
176
- env. with_mut_vm( |vm| {
177
- vm. consume_gas( gas)
178
- } )
200
+ // env.with_mut_vm(|vm| {
201
+ // vm.consume_gas(gas)
202
+ // })
179
203
} ) ,
180
204
"get_span_size" => Function :: new_native_with_env( & store, owasm_env. clone( ) , |env: & Environment <E >| {
181
205
env. with_vm( |vm| {
@@ -338,6 +362,7 @@ mod test {
338
362
use parity_wasm:: elements;
339
363
use std:: io:: { Read , Write } ;
340
364
use std:: process:: Command ;
365
+ use std:: time:: Instant ;
341
366
use tempfile:: NamedTempFile ;
342
367
343
368
pub struct MockEnv { }
@@ -517,6 +542,47 @@ mod test {
517
542
assert_eq ! ( gas_used, 1000015 as u32 ) ;
518
543
}
519
544
545
+ #[ test]
546
+ fn test_run_time ( ) {
547
+ let wasm = wat2wasm (
548
+ r#"(module
549
+ (type (func (param i64 i64 i64 i64) (result)))
550
+ (func
551
+ (local $idx i32)
552
+ (local.set $idx (i32.const 0))
553
+ (block
554
+ (loop
555
+ (local.set $idx (local.get $idx) (i32.const 1) (i32.add) )
556
+ (br_if 0 (i32.lt_u (local.get $idx) (i32.const 1000000)))
557
+ )
558
+ )
559
+ )
560
+ (func (;"execute": Resolves with result "beeb";)
561
+ )
562
+ (memory 17)
563
+ (data (i32.const 1048576) "beeb") (;str = "beeb";)
564
+ (export "prepare" (func 0))
565
+ (export "execute" (func 1)))
566
+ "# ,
567
+ ) ;
568
+ let code = compile ( & wasm) . unwrap ( ) ;
569
+ let new_code = new_compile ( & wasm) . unwrap ( ) ;
570
+ let mut cache = Cache :: new ( CacheOptions { cache_size : 10000 } ) ;
571
+ let env = MockEnv { } ;
572
+
573
+ let now = Instant :: now ( ) ;
574
+ let _gas_used = run ( & mut cache, & code, 4294967290 , true , env) . unwrap ( ) ;
575
+ let elapsed_time = now. elapsed ( ) ;
576
+
577
+ let env = MockEnv { } ;
578
+
579
+ let now = Instant :: now ( ) ;
580
+ let _gas_used = run ( & mut cache, & new_code, 4294967290 , true , env) . unwrap ( ) ;
581
+ let elapsed_time_2 = now. elapsed ( ) ;
582
+
583
+ assert_eq ! ( elapsed_time. as_micros( ) , elapsed_time_2. as_micros( ) ) ;
584
+ }
585
+
520
586
#[ test]
521
587
fn test_inject_memory_no_memory ( ) {
522
588
let wasm = wat2wasm ( "(module)" ) ;
0 commit comments