Browse Source

minor optimization

Dan Korostelev 8 years ago
parent
commit
6ba328fcfc
2 changed files with 14 additions and 7 deletions
  1. 7 3
      src/syntax/ast.ml
  2. 7 4
      std/haxe/macro/ExprTools.hx

+ 7 - 3
src/syntax/ast.ml

@@ -601,9 +601,13 @@ let map_expr loop (e,p) =
 			| FmtRaw _ -> p
 			| FmtIdent i ->
 				let fake_expr = (EConst (Ident i),snd p) in
-				(match loop fake_expr with
-				| (EConst (Ident i),new_pos) -> (FmtIdent i,new_pos)
-				| (_,new_pos) as expr -> (FmtExpr expr,new_pos))
+				let new_expr = loop fake_expr in
+				if new_expr == fake_expr then
+					p
+				else
+					(match new_expr with
+					| (EConst (Ident i),new_pos) -> (FmtIdent i,new_pos)
+					| (_,new_pos) as expr -> (FmtExpr expr,new_pos))
 			| FmtExpr e -> (FmtExpr (loop e), snd p)
 		) parts in
 		EFormat parts

+ 7 - 4
std/haxe/macro/ExprTools.hx

@@ -218,10 +218,13 @@ class ExprTools {
 				EFormat([for (part in parts) switch part.kind {
 					case FRaw(_): part;
 					case FIdent(i):
-						var e = f({pos: part.pos, expr: EConst(CIdent(i))});
-						switch e.expr {
-							case EConst(CIdent(i)): {kind: FIdent(i), pos: e.pos};
-							case _: {kind: FExpr(e), pos: e.pos};
+						var efake = {pos: part.pos, expr: EConst(CIdent(i))};
+						var enew = f(efake);
+						if (enew == efake)
+							part
+						else switch enew.expr {
+							case EConst(CIdent(i)): {kind: FIdent(i), pos: enew.pos};
+							case _: {kind: FExpr(enew), pos: enew.pos};
 						}
 					case FExpr(e): {kind: FExpr(f(e)), pos: part.pos};
 				}]);