11use crate :: frontend:: * ;
2+ use cranelift:: codegen:: ir:: BlockArg ;
23use cranelift:: prelude:: * ;
34use cranelift_jit:: { JITBuilder , JITModule } ;
45use cranelift_module:: { DataDescription , Linkage , Module } ;
@@ -295,7 +296,9 @@ impl<'a> FunctionTranslator<'a> {
295296 }
296297
297298 // Jump to the merge block, passing it the block return value.
298- self . builder . ins ( ) . jump ( merge_block, & [ then_return] ) ;
299+ self . builder
300+ . ins ( )
301+ . jump ( merge_block, & [ BlockArg :: Value ( then_return) ] ) ;
299302
300303 self . builder . switch_to_block ( else_block) ;
301304 self . builder . seal_block ( else_block) ;
@@ -305,7 +308,9 @@ impl<'a> FunctionTranslator<'a> {
305308 }
306309
307310 // Jump to the merge block, passing it the block return value.
308- self . builder . ins ( ) . jump ( merge_block, & [ else_return] ) ;
311+ self . builder
312+ . ins ( )
313+ . jump ( merge_block, & [ BlockArg :: Value ( else_return) ] ) ;
309314
310315 // Switch to the merge block for subsequent statements.
311316 self . builder . switch_to_block ( merge_block) ;
@@ -399,20 +404,18 @@ fn declare_variables(
399404 entry_block : Block ,
400405) -> HashMap < String , Variable > {
401406 let mut variables = HashMap :: new ( ) ;
402- let mut index = 0 ;
403-
404407 for ( i, name) in params. iter ( ) . enumerate ( ) {
405408 // TODO: cranelift_frontend should really have an API to make it easy to set
406409 // up param variables.
407410 let val = builder. block_params ( entry_block) [ i] ;
408- let var = declare_variable ( int, builder, & mut variables, & mut index , name) ;
411+ let var = declare_variable ( int, builder, & mut variables, name) ;
409412 builder. def_var ( var, val) ;
410413 }
411414 let zero = builder. ins ( ) . iconst ( int, 0 ) ;
412- let return_variable = declare_variable ( int, builder, & mut variables, & mut index , the_return) ;
415+ let return_variable = declare_variable ( int, builder, & mut variables, the_return) ;
413416 builder. def_var ( return_variable, zero) ;
414417 for expr in stmts {
415- declare_variables_in_stmt ( int, builder, & mut variables, & mut index , expr) ;
418+ declare_variables_in_stmt ( int, builder, & mut variables, expr) ;
416419 }
417420
418421 variables
@@ -424,24 +427,23 @@ fn declare_variables_in_stmt(
424427 int : types:: Type ,
425428 builder : & mut FunctionBuilder ,
426429 variables : & mut HashMap < String , Variable > ,
427- index : & mut usize ,
428430 expr : & Expr ,
429431) {
430432 match * expr {
431433 Expr :: Assign ( ref name, _) => {
432- declare_variable ( int, builder, variables, index , name) ;
434+ declare_variable ( int, builder, variables, name) ;
433435 }
434436 Expr :: IfElse ( ref _condition, ref then_body, ref else_body) => {
435437 for stmt in then_body {
436- declare_variables_in_stmt ( int, builder, variables, index , stmt) ;
438+ declare_variables_in_stmt ( int, builder, variables, stmt) ;
437439 }
438440 for stmt in else_body {
439- declare_variables_in_stmt ( int, builder, variables, index , stmt) ;
441+ declare_variables_in_stmt ( int, builder, variables, stmt) ;
440442 }
441443 }
442444 Expr :: WhileLoop ( ref _condition, ref loop_body) => {
443445 for stmt in loop_body {
444- declare_variables_in_stmt ( int, builder, variables, index , stmt) ;
446+ declare_variables_in_stmt ( int, builder, variables, stmt) ;
445447 }
446448 }
447449 _ => ( ) ,
@@ -453,14 +455,7 @@ fn declare_variable(
453455 int : types:: Type ,
454456 builder : & mut FunctionBuilder ,
455457 variables : & mut HashMap < String , Variable > ,
456- index : & mut usize ,
457458 name : & str ,
458459) -> Variable {
459- let var = Variable :: new ( * index) ;
460- if !variables. contains_key ( name) {
461- variables. insert ( name. into ( ) , var) ;
462- builder. declare_var ( var, int) ;
463- * index += 1 ;
464- }
465- var
460+ * variables. entry ( name. into ( ) ) . or_insert_with ( || builder. declare_var ( int) )
466461}
0 commit comments