Jelajahi Sumber

[analyzer] reconstruct some ternaries

Simon Krajewski 11 tahun lalu
induk
melakukan
96dfbd791c
1 mengubah file dengan 29 tambahan dan 7 penghapusan
  1. 29 7
      analyzer.ml

+ 29 - 7
analyzer.ml

@@ -331,13 +331,35 @@ module Simplifier = struct
 		let var_map = ref IntMap.empty in
 		let rec loop e = match e.eexpr with
 			| TBlock el ->
-				let el = ExtList.List.filter_map (fun e -> match e.eexpr with
-					| TVar(v,Some e1) when Meta.has Meta.CompilerGenerated v.v_meta ->
-						var_map := IntMap.add v.v_id (loop e1) !var_map;
-						None
-					| _ ->
-						Some (loop e)
-				) el in
+				let rec loop2 el = match el with
+					| e :: el ->
+						begin match e.eexpr with
+							| TVar(v,Some e1) when Meta.has Meta.CompilerGenerated v.v_meta ->
+								var_map := IntMap.add v.v_id (loop e1) !var_map;
+								loop2 el
+							| TVar(v,None) ->
+								begin match el with
+									| {eexpr = TBinop(OpAssign,{eexpr = TLocal v2},e2)} :: el when v == v2 ->
+										let e = {e with eexpr = TVar(v,Some e2)} in
+										loop2 (e :: el)
+									| ({eexpr = TIf(e1,
+										{eexpr = TBlock [{eexpr = TBinop(OpAssign,{eexpr = TLocal v2},e2)}]},
+										Some {eexpr = TBlock [{eexpr = TBinop(OpAssign,{eexpr = TLocal v3},e3)}]})} as e_if) :: el when v == v2 && v == v3 ->
+										let e_if = {e_if with eexpr = TIf(e1,e2,Some e3)} in
+										let e = {e with eexpr = TVar(v,Some e_if)} in
+										loop2 (e :: el)
+									| _ ->
+										let e = loop e in
+										e :: loop2 el
+								end
+							| _ ->
+								let e = loop e in
+								e :: loop2 el
+						end
+					| [] ->
+						[]
+				in
+				let el = loop2 el in
 				{e with eexpr = TBlock el}
 			| TLocal v when Meta.has Meta.CompilerGenerated v.v_meta ->
 				begin try IntMap.find v.v_id !var_map