Răsfoiți Sursa

do not post-process fields which are removed afterwards (closes #1578)

Simon Krajewski 12 ani în urmă
părinte
comite
1df36a7ebb
3 a modificat fișierele cu 15 adăugiri și 14 ștergeri
  1. 13 12
      codegen.ml
  2. 1 1
      main.ml
  3. 1 1
      typer.ml

+ 13 - 12
codegen.ml

@@ -674,23 +674,24 @@ let add_rtti ctx t =
 		()
 
 (* Removes extern and macro fields, also checks for Void fields *)
+
+let is_removable_field ctx f =
+	Meta.has Meta.Extern f.cf_meta || Meta.has Meta.Generic f.cf_meta
+	|| (match f.cf_kind with
+		| Var {v_read = AccRequire (s,_)} -> true
+		| Method MethMacro -> not ctx.in_macro
+		| _ -> false)
+
 let remove_extern_fields ctx t = match t with
 	| TClassDecl c ->
-		let do_remove f =
-			Meta.has Meta.Extern f.cf_meta || Meta.has Meta.Generic f.cf_meta
-			|| (match f.cf_kind with
-				| Var {v_read = AccRequire (s,_)} -> true
-				| Method MethMacro -> not ctx.in_macro
-				| _ -> false)
-		in
 		if not (Common.defined ctx.com Define.DocGen) then begin
 			c.cl_ordered_fields <- List.filter (fun f ->
-				let b = do_remove f in
+				let b = is_removable_field ctx f in
 				if b then c.cl_fields <- PMap.remove f.cf_name c.cl_fields;
 				not b
 			) c.cl_ordered_fields;
 			c.cl_ordered_statics <- List.filter (fun f ->
-				let b = do_remove f in
+				let b = is_removable_field ctx f in
 				if b then c.cl_statics <- PMap.remove f.cf_name c.cl_statics;
 				not b
 			) c.cl_ordered_statics;
@@ -1695,7 +1696,7 @@ let detect_usage com =
 
 let pp_counter = ref 1
 
-let post_process filters t =
+let post_process ctx filters t =
 	(* ensure that we don't process twice the same (cached) module *)
 	let m = (t_infos t).mt_module.m_extra in
 	if m.m_processed = 0 then m.m_processed <- !pp_counter;
@@ -1704,11 +1705,11 @@ let post_process filters t =
 	| TClassDecl c ->
 		let process_field f =
 			match f.cf_expr with
-			| None -> ()
-			| Some e ->
+			| Some e when not (is_removable_field ctx f) ->
 				Abstract.cast_stack := f :: !Abstract.cast_stack;
 				f.cf_expr <- Some (List.fold_left (fun e f -> f e) e filters);
 				Abstract.cast_stack := List.tl !Abstract.cast_stack;
+			| _ -> ()
 		in
 		List.iter process_field c.cl_ordered_fields;
 		List.iter process_field c.cl_ordered_statics;

+ 1 - 1
main.ml

@@ -1220,7 +1220,7 @@ try
 			Codegen.captured_vars com;
 			Codegen.rename_local_vars com;
 		] in
-		List.iter (Codegen.post_process filters) com.types;
+		List.iter (Codegen.post_process tctx filters) com.types;
 		Codegen.post_process_end();
 		List.iter (fun f -> f()) (List.rev com.filters);
 		List.iter (Codegen.save_class_state tctx) com.types;

+ 1 - 1
typer.ml

@@ -3672,7 +3672,7 @@ and flush_macro_context mint ctx =
 		mint
 	end else mint in
 	(* we should maybe ensure that all filters in Main are applied. Not urgent atm *)
-	(try Interp.add_types mint types (Codegen.post_process [Codegen.Abstract.handle_abstract_casts mctx; Codegen.captured_vars mctx.com; Codegen.rename_local_vars mctx.com])
+	(try Interp.add_types mint types (Codegen.post_process mctx [Codegen.Abstract.handle_abstract_casts mctx; Codegen.captured_vars mctx.com; Codegen.rename_local_vars mctx.com])
 	with Error (e,p) -> raise (Fatal_error(error_msg e,p)));
 	Codegen.post_process_end()