Przeglądaj źródła

wrap inlined @:pure functions in a TMeta Pure and respect that in the analyzer

Dan Korostelev 9 lat temu
rodzic
commit
132bf31968
2 zmienionych plików z 7 dodań i 1 usunięć
  1. 6 0
      analyzer.ml
  2. 1 1
      optimizer.ml

+ 6 - 0
analyzer.ml

@@ -361,6 +361,8 @@ module TexprFilter = struct
 	let get_interference_kind e =
 		let vars = ref [] in
 		let rec loop e = match e.eexpr with
+			| TMeta((Meta.Pure,_,_),_) ->
+				()
 			| TUnop((Increment | Decrement),_,{eexpr = TLocal v}) ->
 				vars := v :: !vars
 			| TBinop((OpAssign | OpAssignOp _),{eexpr = TLocal v},e2) ->
@@ -489,6 +491,8 @@ module TexprFilter = struct
 						| IKNone -> ()
 						| IKSideEffect -> (* TODO: Could this miss a IKVarMod case? *)
 							let rec loop e = match e.eexpr with
+								| TMeta((Meta.Pure,_,_),_) ->
+									()
 								| TField _ when Optimizer.is_affected_type e.etype ->
 									raise Exit
 								| TCall({eexpr = TField(_,FStatic(c,cf))},el) when is_pure c cf ->
@@ -2703,6 +2707,8 @@ module Purity = struct
 					taint_raise node
 			end
 		and loop e = match e.eexpr with
+			| TMeta((Meta.Pure,_,_),_) ->
+				()
 			| TThrow _ ->
 				taint_raise node;
 			| TBinop((OpAssign | OpAssignOp _),e1,e2) ->

+ 1 - 1
optimizer.ml

@@ -644,7 +644,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 				mk (TBlock (el_v @ [e])) tret e.epos
 		) in
 		let inline_meta e meta = match meta with
-			| Meta.Deprecated,_,_ -> mk (TMeta(meta,e)) e.etype e.epos
+			| (Meta.Deprecated | Meta.Pure),_,_ -> mk (TMeta(meta,e)) e.etype e.epos
 			| _ -> e
 		in
 		let e = List.fold_left inline_meta e cf.cf_meta in