2
0
Эх сурвалжийг харах

generalize flabels so we can output other things at arbitrary lines

Simon Krajewski 9 жил өмнө
parent
commit
67b9076562
1 өөрчлөгдсөн 26 нэмэгдсэн , 5 устгасан
  1. 26 5
      genhl.ml

+ 26 - 5
genhl.ml

@@ -5531,6 +5531,15 @@ let dump code =
 (* --------------------------------------------------------------------------------------------------------------------- *)
 (* --------------------------------------------------------------------------------------------------------------------- *)
 (* HLC *)
 (* HLC *)
 
 
+type output_options =
+	| OOLabel
+	| OOCase of int
+	| OODefault
+	| OOIncreaseIndent
+	| OODecreaseIndent
+	| OOBeginBlock
+	| OOEndBlock
+
 let c_kwds = [
 let c_kwds = [
 "auto";"break";"case";"char";"const";"continue";"default";"do";"double";"else";"enum";"extern";"float";"for";"goto";
 "auto";"break";"case";"char";"const";"continue";"default";"do";"double";"else";"enum";"extern";"float";"for";"goto";
 "if";"int";"long";"register";"return";"short";"signed";"sizeof";"static";"struct";"switch";"typedef";"union";"unsigned";
 "if";"int";"long";"register";"return";"short";"signed";"sizeof";"static";"struct";"switch";"typedef";"union";"unsigned";
@@ -5905,14 +5914,26 @@ let write_c version ch (code:code) =
 			else
 			else
 			expr (var_type (reg i) t);
 			expr (var_type (reg i) t);
 		) f.regs;
 		) f.regs;
-		let flabels = Array.make (Array.length f.code) false in
+		let output_options = Array.make (Array.length f.code) [] in
+		let output_at i oo = output_options.(i) <- oo :: output_options.(i) in
+		let output_at2 i ool = List.iter (output_at i) ool in
+		let has_label i = List.exists (function OOLabel -> true | _ -> false) output_options.(i) in
 
 
 		Array.iteri (fun i op ->
 		Array.iteri (fun i op ->
-			if flabels.(i) then line (label i ^":");
+			List.iter (function
+				| OOLabel -> line (label i ^ ":")
+				| OOCase i -> line (Printf.sprintf "case %i:" i)
+				| OODefault -> line "default:"
+				| OOIncreaseIndent -> block()
+				| OODecreaseIndent -> unblock()
+				| OOBeginBlock ->  line "{"
+				| OOEndBlock -> line "}"
+			) (List.rev output_options.(i));
 			let label delta =
 			let label delta =
 				let addr = delta + i + 1 in
 				let addr = delta + i + 1 in
-				flabels.(addr) <- true;
-				label addr
+				let label = label addr in
+				if not (has_label addr) then output_at addr OOLabel;
+				label
 			in
 			in
 			match op with
 			match op with
 			| OMov (r,v) ->
 			| OMov (r,v) ->
@@ -6029,7 +6050,7 @@ let write_c version ch (code:code) =
 			| OJAlways d ->
 			| OJAlways d ->
 				sexpr "goto %s" (label d)
 				sexpr "goto %s" (label d)
 			| OLabel _ ->
 			| OLabel _ ->
-				if not (flabels.(i)) then line (label (-1) ^ ":")
+				if not (has_label i) then line (label (-1) ^ ":")
 			| OToDyn (r,v) ->
 			| OToDyn (r,v) ->
 				sexpr "%s = (vdynamic*)hl_gc_alloc%s(sizeof(vdynamic))" (reg r) (if is_gc_ptr (rtype v) then "" else "_noptr");
 				sexpr "%s = (vdynamic*)hl_gc_alloc%s(sizeof(vdynamic))" (reg r) (if is_gc_ptr (rtype v) then "" else "_noptr");
 				sexpr "%s->t = %s" (reg r) (type_value (rtype v));
 				sexpr "%s->t = %s" (reg r) (type_value (rtype v));