소스 검색

[analyzer] do not bind `@:structAccess` to temp vars

Simon Krajewski 8 년 전
부모
커밋
747c9e048a
2개의 변경된 파일6개의 추가작업 그리고 1개의 파일을 삭제
  1. 2 0
      src/optimization/analyzerTexpr.ml
  2. 4 1
      src/optimization/analyzerTexprTransformer.ml

+ 2 - 0
src/optimization/analyzerTexpr.ml

@@ -30,6 +30,8 @@ let rec is_true_expr e1 = match e1.eexpr with
 	| TParenthesis e1 -> is_true_expr e1
 	| _ -> false
 
+let is_stack_allocated c = Meta.has Meta.StructAccess c.cl_meta
+
 let map_values ?(allow_control_flow=true) f e =
 	let branching = ref false in
 	let efinal = ref None in

+ 4 - 1
src/optimization/analyzerTexprTransformer.ml

@@ -333,7 +333,10 @@ let rec func ctx bb tf t p =
 		add_texpr bb {e with eexpr = TBinop(OpAssign,ea,eop)};
 		bb,ea
 	and field_assign_op bb op e ef e1 fa e2 =
-		let bb,e1 = bind_to_temp bb false e1 in
+		let bb,e1 = match fa with
+			| FInstance(c,_,_) | FClosure(Some(c,_),_) when is_stack_allocated c -> bb,e1
+			| _ -> bind_to_temp bb false e1
+		in
 		let ef = {ef with eexpr = TField(e1,fa)} in
 		let bb,e3 = bind_to_temp bb false ef in
 		let bb,e2 = bind_to_temp bb false e2 in