소스 검색

bugfix: prevent renaming a local var that might mutate an existing shader

ncannasse 6 년 전
부모
커밋
4caaf04937
1개의 변경된 파일24개의 추가작업 그리고 2개의 파일을 삭제
  1. 24 2
      hxsl/Splitter.hx

+ 24 - 2
hxsl/Splitter.hx

@@ -27,6 +27,7 @@ class Splitter {
 		var vfun = null, vvars = new Map();
 		var ffun = null, fvars = new Map();
 		varNames = new Map();
+		varMap = new Map();
 		for( f in s.funs )
 			switch( f.kind ) {
 			case Vertex:
@@ -40,7 +41,6 @@ class Splitter {
 			default:
 				throw "assert";
 			}
-		varMap = new Map();
 		for( inf in Lambda.array(vvars) ) {
 			var v = inf.v;
 			switch( v.kind ) {
@@ -198,6 +198,12 @@ class Splitter {
 		case TVar(v):
 			var v2 = varMap.get(v);
 			v2 == null ? e : { e : TVar(v2), t : e.t, p : e.p };
+		case TVarDecl(v, init):
+			var v2 = varMap.get(v);
+			v2 == null ? e.map(mapVars) : { e : TVarDecl(v2,mapVars(init)), t : e.t, p : e.p };
+		case TFor(v, it, loop):
+			var v2 = varMap.get(v);
+			v2 == null ? e.map(mapVars) : { e : TFor(v2,mapVars(it),mapVars(loop)), t : e.t, p : e.p };
 		default:
 			e.map(mapVars);
 		}
@@ -206,9 +212,25 @@ class Splitter {
 	function get( v : TVar ) {
 		var i = vars.get(v.id);
 		if( i == null ) {
+			var v2 = varMap.get(v);
+			if( v2 != null )
+				return get(v2);
+			var oldName = v.name;
+			uniqueName(v);
+			if( v.kind == Local && oldName != v.name ) {
+				// variable renamed : restore its name and create a new one
+				var nv = {
+					id : Tools.allocVarId(),
+					name : v.name,
+					kind : v.kind,
+					type : v.type,
+				};
+				varMap.set(v,nv);
+				v.name = oldName;
+				v = nv;
+			}
 			i = new VarProps(v);
 			vars.set(v.id, i);
-			uniqueName(v);
 		}
 		return i;
 	}