瀏覽代碼

added delay_late

Simon Krajewski 13 年之前
父節點
當前提交
424f1e31aa
共有 2 個文件被更改,包括 26 次插入10 次删除
  1. 10 2
      typecore.ml
  2. 16 8
      typer.ml

+ 10 - 2
typecore.ml

@@ -36,10 +36,15 @@ type macro_mode =
 	| MBuild
 	| MMacroType
 
+type delayed_functions = {
+	mutable df_normal : (unit -> unit) list;
+	mutable df_late : (unit -> unit) list;
+}
+
 type typer_globals = {
 	types_module : (path, path) Hashtbl.t;
 	modules : (path , module_def) Hashtbl.t;
-	mutable delayed : (unit -> unit) list;
+	mutable delayed : delayed_functions;
 	doinline : bool;
 	mutable core_api : typer option;
 	mutable macros : ((unit -> unit) * typer) option;
@@ -209,7 +214,10 @@ let not_opened = ref Closed
 let mk_anon fl = TAnon { a_fields = fl; a_status = not_opened; }
 
 let delay ctx f =
-	ctx.g.delayed <- f :: ctx.g.delayed
+	ctx.g.delayed.df_normal <- f :: ctx.g.delayed.df_normal
+
+let delay_late ctx f =
+	ctx.g.delayed.df_late <- f :: ctx.g.delayed.df_late
 
 let mk_field name t p = {
 	cf_name = name;

+ 16 - 8
typer.ml

@@ -2368,16 +2368,21 @@ let get_main ctx =
 		Some (mk (TCall (mk (TField (emain,"main")) ft null_pos,[])) r null_pos)
 
 let rec finalize ctx =
-	let delays = ctx.g.delayed in
-	ctx.g.delayed <- [];
-	match delays with
-	| [] when ctx.com.dead_code_elimination ->
+	let delays = ctx.g.delayed.df_normal in
+	ctx.g.delayed.df_normal <- [];
+	match delays,ctx.g.delayed.df_late with
+	| [],[] when ctx.com.dead_code_elimination ->
 		ignore(get_main ctx);
-		if dce_finalize ctx && ctx.g.delayed = [] then dce_optimize ctx else finalize ctx
-	| [] ->
+		if dce_finalize ctx && ctx.g.delayed.df_normal = [] then dce_optimize ctx else finalize ctx
+	| [],[] ->
 		(* at last done *)
 		()
-	| l ->
+	| [],l ->
+		(* normal done, but late remains *)
+		ctx.g.delayed.df_late <- [];
+		List.iter (fun f -> f()) l;
+		finalize ctx		
+	| l,_ ->
 		List.iter (fun f -> f()) l;
 		finalize ctx
 
@@ -2975,7 +2980,10 @@ let rec create com is_macro_ctx =
 			modules = Hashtbl.create 0;
 			types_module = Hashtbl.create 0;
 			type_patches = Hashtbl.create 0;
-			delayed = [];
+			delayed = {
+				df_normal = [];
+				df_late = [];
+			};
 			doinline = not (Common.defined com "no_inline" || com.display);
 			hook_generate = [];
 			get_build_infos = (fun() -> None);