瀏覽代碼

add some unreachable block sanity checks

Simon Krajewski 1 年之前
父節點
當前提交
60c8e64cf2
共有 4 個文件被更改,包括 18 次插入19 次删除
  1. 1 0
      src/coro/coro.ml
  2. 8 9
      src/coro/coroFromTexpr.ml
  3. 1 3
      src/coro/coroToTexpr.ml
  4. 8 7
      src/coro/coroTypes.ml

+ 1 - 0
src/coro/coro.ml

@@ -26,4 +26,5 @@ let create_coro_context com meta = {
 	com;
 	coro_debug = Meta.has (Meta.Custom ":coroutine.debug") meta;
 	vthis = None;
+	cb_unreachable = make_block None;
 }

+ 8 - 9
src/coro/coroFromTexpr.ml

@@ -9,10 +9,6 @@ let terminate cb kind t p =
 
 let e_no_value = Texpr.Builder.make_null t_dynamic null_pos
 
-let add_expr cb e =
-	if cb.cb_next.next_kind = NextUnknown && e != e_no_value then
-		DynArray.add cb.cb_el e
-
 type coro_ret =
 	| RLocal of tvar
 	| RTerminate of (coro_block -> texpr -> unit)
@@ -32,7 +28,10 @@ let expr_to_coro ctx (vresult,verror) cb_root e =
 	let block_from_e e =
 		make_block (Some(e.etype,e.epos))
 	in
-	let cb_unreachable = make_block None in
+	let add_expr cb e =
+		if cb.cb_next.next_kind = NextUnknown && e != e_no_value && cb != ctx.cb_unreachable then
+			DynArray.add cb.cb_el e
+	in
 	let replace_this e =
 		let v = match ctx.vthis with
 			| Some v ->
@@ -160,7 +159,7 @@ let expr_to_coro ctx (vresult,verror) cb_root e =
 			cb,e_no_value
 		| TReturn None ->
 			terminate cb NextReturnVoid e.etype e.epos;
-			cb_unreachable,e_no_value
+			ctx.cb_unreachable,e_no_value
 		| TReturn (Some e1) ->
 			let f_terminate cb e1 =
 				terminate cb (NextReturn e1) e.etype e.epos;
@@ -168,7 +167,7 @@ let expr_to_coro ctx (vresult,verror) cb_root e =
 			let ret = RTerminate f_terminate in
 			let cb_ret,e1 = loop_assign cb ret e1 in
 			terminate cb_ret (NextReturn e1) e.etype e.epos;
-			cb_unreachable,e_no_value
+			ctx.cb_unreachable,e_no_value
 		| TThrow e1 ->
 			let f_terminate cb e1 =
 				terminate cb (NextThrow e1) e.etype e.epos;
@@ -176,7 +175,7 @@ let expr_to_coro ctx (vresult,verror) cb_root e =
 			let ret = RTerminate f_terminate in
 			let cb_ret,e1 = loop_assign cb ret e1 in
 			terminate cb_ret (NextThrow e1) e.etype e.epos;
-			cb_unreachable,e_no_value
+			ctx.cb_unreachable,e_no_value
 		(* branching *)
 		| TIf(e1,e2,None) ->
 			let cb,e1 = loop cb RValue e1 in
@@ -265,7 +264,7 @@ let expr_to_coro ctx (vresult,verror) cb_root e =
 				cb,ev
 			| RTerminate f ->
 				f cb e;
-				cb_unreachable,e_no_value
+				ctx.cb_unreachable,e_no_value
 	and loop_block cb ret e =
 		let el = match e.eexpr with
 			| TBlock el ->

+ 1 - 3
src/coro/coroToTexpr.ml

@@ -8,9 +8,6 @@ type coro_state = {
 	mutable cs_el : texpr list;
 }
 
-let is_empty cb =
-	DynArray.empty cb.cb_el
-
 let block_to_texpr_coroutine ctx bb vcontinuation vresult verror p =
 	let open Texpr.Builder in
 	let com = ctx.com in
@@ -95,6 +92,7 @@ let block_to_texpr_coroutine ctx bb vcontinuation vresult verror p =
 	in
 	debug_endline "---";
 	let rec loop bb state_id back_state_id current_el while_loop exc_state_id_getter =
+		assert (bb != ctx.cb_unreachable);
 		let el = DynArray.to_list bb.cb_el in
 
 		let ereturn = mk (TReturn None) com.basic.tvoid p in

+ 8 - 7
src/coro/coroTypes.ml

@@ -2,12 +2,6 @@ open Common
 open Globals
 open Type
 
-type some_ctx = {
-	com : Common.context;
-	coro_debug : bool;
-	mutable vthis : tvar option;
-}
-
 type coro_block = {
 	cb_el : texpr DynArray.t;
 	cb_typepos : (Type.t * pos) option;
@@ -46,4 +40,11 @@ and coro_next = {
 	next_kind : coro_next_kind;
 	next_type : Type.t;
 	next_pos : pos;
-}
+}
+
+type coro_ctx = {
+	com : Common.context;
+	coro_debug : bool;
+	mutable vthis : tvar option;
+	cb_unreachable : coro_block;
+}