소스 검색

move for-transformation to codegen.ml

Simon Krajewski 8 년 전
부모
커밋
0d0657c0a7
3개의 변경된 파일17개의 추가작업 그리고 18개의 파일을 삭제
  1. 15 0
      src/generators/codegen.ml
  2. 1 1
      src/generators/genhl.ml
  3. 1 17
      src/optimization/analyzerTexpr.ml

+ 15 - 0
src/generators/codegen.ml

@@ -870,3 +870,18 @@ module ExtClass = struct
 		let e_assign = mk (TBinop(OpAssign,ef1,e)) e.etype p in
 		add_cl_init c e_assign
 end
+
+let for_remap com v e1 e2 p =
+	let v' = alloc_var v.v_name e1.etype e1.epos in
+	let ev' = mk (TLocal v') e1.etype e1.epos in
+	let t1 = (Abstract.follow_with_abstracts e1.etype) in
+	let ehasnext = mk (TField(ev',quick_field t1 "hasNext")) (tfun [] com.basic.tbool) e1.epos in
+	let ehasnext = mk (TCall(ehasnext,[])) com.basic.tbool ehasnext.epos in
+	let enext = mk (TField(ev',quick_field t1 "next")) (tfun [] v.v_type) e1.epos in
+	let enext = mk (TCall(enext,[])) v.v_type e1.epos in
+	let eassign = mk (TVar(v,Some enext)) com.basic.tvoid p in
+	let ebody = Type.concat eassign e2 in
+	mk (TBlock [
+		mk (TVar (v',Some e1)) com.basic.tvoid e1.epos;
+		mk (TWhile((mk (TParenthesis ehasnext) ehasnext.etype ehasnext.epos),ebody,NormalWhile)) com.basic.tvoid e1.epos;
+	]) com.basic.tvoid p

+ 1 - 1
src/generators/genhl.ml

@@ -2379,7 +2379,7 @@ and eval_expr ctx e =
 	| TMeta (_,e) ->
 		eval_expr ctx e
 	| TFor (v,it,loop) ->
-		eval_expr ctx (AnalyzerTexpr.TexprFilter.for_remap ctx.com v it loop e.epos)
+		eval_expr ctx (Codegen.for_remap ctx.com v it loop e.epos)
 	| TSwitch (en,cases,def) ->
 		let rt = to_type ctx e.etype in
 		let r = alloc_tmp ctx rt in

+ 1 - 17
src/optimization/analyzerTexpr.ml

@@ -217,22 +217,6 @@ let dynarray_mapi f d =
 	- TFor is rewritten to TWhile
 *)
 module TexprFilter = struct
-
-	let for_remap com v e1 e2 p =
-		let v' = alloc_var v.v_name e1.etype e1.epos in
-		let ev' = mk (TLocal v') e1.etype e1.epos in
-		let t1 = (Abstract.follow_with_abstracts e1.etype) in
-		let ehasnext = mk (TField(ev',quick_field t1 "hasNext")) (tfun [] com.basic.tbool) e1.epos in
-		let ehasnext = mk (TCall(ehasnext,[])) com.basic.tbool ehasnext.epos in
-		let enext = mk (TField(ev',quick_field t1 "next")) (tfun [] v.v_type) e1.epos in
-		let enext = mk (TCall(enext,[])) v.v_type e1.epos in
-		let eassign = mk (TVar(v,Some enext)) com.basic.tvoid p in
-		let ebody = Type.concat eassign e2 in
-		mk (TBlock [
-			mk (TVar (v',Some e1)) com.basic.tvoid e1.epos;
-			mk (TWhile((mk (TParenthesis ehasnext) ehasnext.etype ehasnext.epos),ebody,NormalWhile)) com.basic.tvoid e1.epos;
-		]) com.basic.tvoid p
-
 	let apply com e =
 		let rec loop e = match e.eexpr with
 		| TBinop(OpBoolAnd | OpBoolOr as op,e1,e2) ->
@@ -280,7 +264,7 @@ module TexprFilter = struct
 			let e = mk (TWhile(Codegen.mk_parent e_true,e_block,NormalWhile)) e.etype p in
 			loop e
 		| TFor(v,e1,e2) ->
-			let e = for_remap com v e1 e2 e.epos in
+			let e = Codegen.for_remap com v e1 e2 e.epos in
 			loop e
 		| _ ->
 			Type.map_expr loop e