Browse Source

TFor handling in genhl - only in macro

Nicolas Cannasse 8 years ago
parent
commit
1a21ec8116
4 changed files with 22 additions and 17 deletions
  1. 2 2
      Makefile
  2. 2 2
      src/generators/genhl.ml
  3. 17 13
      src/optimization/analyzerTexpr.ml
  4. 1 0
      std/haxe/macro/Context.hl.hx

+ 2 - 2
Makefile

@@ -59,10 +59,10 @@ MODULES=json version globals path context/meta syntax/ast display/displayTypes t
 	syntax/parser typing/abstract typing/typecore display/display optimization/optimizerTexpr \
 	optimization/optimizer typing/overloads typing/typeload generators/codegen generators/gencommon generators/genas3 \
 	generators/gencpp generators/genjs generators/genneko generators/genphp generators/genswf9 \
-	generators/genswf generators/genjava generators/gencs generators/genpy macro/macroApi macro/interp generators/hlcode generators/hlopt generators/hlinterp generators/hl2c generators/genhl \
+	generators/genswf generators/genjava generators/gencs generators/genpy macro/macroApi macro/interp generators/hlcode generators/hlopt generators/hlinterp generators/hl2c \
 	generators/genlua \
 	optimization/dce optimization/analyzerConfig optimization/analyzerTypes optimization/analyzerTexpr \
-	optimization/analyzerTexprTransformer optimization/analyzer \
+	optimization/analyzerTexprTransformer optimization/analyzer generators/genhl \
 	optimization/filters macro/hlmacro macro/macroContext typing/typer typing/matcher display/displayOutput server main
 
 ADD_REVISION?=0

+ 2 - 2
src/generators/genhl.ml

@@ -2376,8 +2376,8 @@ and eval_expr ctx e =
 			assert false)
 	| TMeta (_,e) ->
 		eval_expr ctx e
-	| TFor _ ->
-		assert false (* eliminated by analyzer *)
+	| TFor (v,it,loop) ->
+		eval_expr ctx (AnalyzerTexpr.TexprFilter.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

+ 17 - 13
src/optimization/analyzerTexpr.ml

@@ -217,6 +217,22 @@ 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) ->
@@ -264,19 +280,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 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 e.epos in
-			let ebody = Type.concat eassign e2 in
-			let e = 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 e.epos in
+			let e = for_remap com v e1 e2 e.epos in
 			loop e
 		| _ ->
 			Type.map_expr loop e

+ 1 - 0
std/haxe/macro/Context.hl.hx

@@ -235,6 +235,7 @@ class Context {
 	}
 
 	private static function sExpr( e : TypedExpr, pretty : Bool ) : String {
+		return null;
 	}
 
 #end