ソースを参照

Fix infinite loop in pass. Occurred removing the shader being cached by selfShaders.

clementlandrin 2 年 前
コミット
d3cd019583
1 ファイル変更22 行追加1 行削除
  1. 22 1
      h3d/mat/Pass.hx

+ 22 - 1
h3d/mat/Pass.hx

@@ -214,6 +214,8 @@ class Pass {
 		var sl = shaders, prev = null;
 		while( sl != null ) {
 			if( sl.s == s ) {
+				if ( selfShadersCache == sl )
+					selfShadersCache = selfShadersCache.next;
 				if( prev == null )
 					shaders = sl.next;
 				else
@@ -227,6 +229,8 @@ class Pass {
 		prev = null;
 		while ( sl != null ) {
 			if ( sl.s == s ) {
+				if ( selfShadersCache == sl )
+					selfShadersCache = selfShadersCache.next;
 				if ( prev == null )
 					selfShaders = sl.next;
 				else
@@ -240,9 +244,12 @@ class Pass {
 	}
 
 	public function removeShaders< T:hxsl.Shader >(t:Class<T>) {
-		var sl = shaders, prev = null;
+		var sl = shaders;
+		var prev = null;
 		while( sl != null ) {
 			if( hxd.impl.Api.isOfType(sl.s, t) ) {
+				if ( selfShadersCache == sl )
+					selfShadersCache = selfShadersCache.next;
 				if( prev == null )
 					shaders = sl.next;
 				else
@@ -256,6 +263,8 @@ class Pass {
 		prev = null;
 		while( sl != null ) {
 			if( hxd.impl.Api.isOfType(sl.s, t) ) {
+				if ( selfShadersCache == sl )
+					selfShadersCache = selfShadersCache.next;
 				if( prev == null )
 					selfShaders = sl.next;
 				else
@@ -300,6 +309,18 @@ class Pass {
 		return shaders.iterateTo(parentShaders);
 	}
 
+	function checkInfiniteLoop() {
+		var shaderList = [];
+		var s = selfShaders;
+		while ( s != null ) {
+			for ( already in shaderList )
+				if ( already == s )
+					throw "infinite loop";
+			shaderList.push(s);
+			s = s.next;
+		}
+	}
+
 	function selfShadersRec(rebuild : Bool) {
 		if ( selfShaders == null )
 			return shaders;