Browse Source

handle local assignment

Simon Krajewski 12 years ago
parent
commit
b1de807ad9
1 changed files with 8 additions and 7 deletions
  1. 8 7
      codegen.ml

+ 8 - 7
codegen.ml

@@ -1667,25 +1667,26 @@ module PatternMatchConversion = struct
 end
 end
 
 
 let promote_complex_returns ctx e =
 let promote_complex_returns ctx e =
-	let rec loop t e = match e.eexpr with
+	let rec loop f e = match e.eexpr with
 		| TBlock(el) ->
 		| TBlock(el) ->
 			begin match List.rev el with
 			begin match List.rev el with
-				| elast :: el -> {e with eexpr = TBlock(List.rev ((loop t elast) :: el))}
+				| elast :: el -> {e with eexpr = TBlock(List.rev ((loop f elast) :: el))}
 				| [] -> e
 				| [] -> e
 			end
 			end
 		| TSwitch(es,cases,edef) ->
 		| TSwitch(es,cases,edef) ->
-			{e with eexpr = TSwitch(es,List.map (fun (el,e) -> el,loop t e) cases,match edef with None -> None | Some e -> Some (loop t e))}
+			{e with eexpr = TSwitch(es,List.map (fun (el,e) -> el,loop f e) cases,match edef with None -> None | Some e -> Some (loop f e))}
 		| TIf(eif,ethen,eelse) ->
 		| TIf(eif,ethen,eelse) ->
-			{e with eexpr = TIf(eif, loop t ethen, match eelse with None -> None | Some e -> Some (loop t e))}
+			{e with eexpr = TIf(eif, loop f ethen, match eelse with None -> None | Some e -> Some (loop f e))}
 		| TTry(e1,el) ->
 		| TTry(e1,el) ->
-			{e with eexpr = TTry(loop t e1, List.map (fun (el,e) -> el,loop t e) el)}
+			{e with eexpr = TTry(loop f e1, List.map (fun (el,e) -> el,loop f e) el)}
 		| TReturn _ | TThrow _ ->
 		| TReturn _ | TThrow _ ->
 			e
 			e
 		| _ ->
 		| _ ->
-			mk (TReturn (Some e)) t e.epos
+			f e
 	in
 	in
 	let rec find e = match e.eexpr with
 	let rec find e = match e.eexpr with
-		| TReturn (Some e1) -> loop e.etype e1
+		| TReturn (Some e1) -> loop (fun e -> {e with eexpr = TReturn (Some e)}) e1
+		| TBinop(OpAssign, ({eexpr = TLocal v} as e1), e2) -> loop (fun er -> {e with eexpr = TBinop(OpAssign, e1, er)}) e2
 		| _ -> Type.map_expr find e
 		| _ -> Type.map_expr find e
 	in
 	in
 	find e
 	find e