Browse Source

Various fixes for GC issues with non-GC ptr types.

Mark Sibly 9 years ago
parent
commit
f767a89a77
2 changed files with 38 additions and 35 deletions
  1. 24 2
      src/mx2new/translator.monkey2
  2. 14 33
      src/mx2new/translator_cpp.monkey2

+ 24 - 2
src/mx2new/translator.monkey2

@@ -28,6 +28,18 @@ Function IsGCType:Bool( type:Type )
 	Return False
 	Return False
 End
 End
 
 
+
+Function IsGCPtrType:Bool( type:Type )
+
+	Local ctype:=TCast<ClassType>( type )
+	If ctype Return Not ctype.IsVoid And Not ctype.IsStruct
+	
+	Local atype:=TCast<ArrayType>( type )
+	If atype Return True
+	
+	Return False
+End
+
 'Visitor that looks for gc params on LHS of an assignment.
 'Visitor that looks for gc params on LHS of an assignment.
 '
 '
 Class AssignedGCParamsVisitor Extends StmtVisitor
 Class AssignedGCParamsVisitor Extends StmtVisitor
@@ -196,12 +208,22 @@ Class Translator
 
 
 			For Local vvar:=Eachin _gcframe.vars.Values
 			For Local vvar:=Eachin _gcframe.vars.Values
 				Uses( vvar.type )
 				Uses( vvar.type )
-				Emit( "bbGCMark("+VarName( vvar )+");" )
+				If IsGCPtrType( vvar.type )
+					Emit( "bbGCMarkPtr("+VarName( vvar )+");" )
+				Else
+					Emit( "bbGCMark("+VarName( vvar )+");" )
+				Endif
+'				Emit( "bbGCMark("+VarName( vvar )+");" )
 			Next
 			Next
 			
 			
 			For Local tmp:=Eachin _gcframe.tmps
 			For Local tmp:=Eachin _gcframe.tmps
 				Uses( tmp.type )
 				Uses( tmp.type )
-				Emit( "bbGCMark("+tmp.ident+");" )
+				If IsGCPtrType( tmp.type )
+					Emit( "bbGCMarkPtr("+tmp.ident+");" )
+				Else
+					Emit( "bbGCMark("+tmp.ident+");" )
+				Endif
+'				Emit( "bbGCMark("+tmp.ident+");" )
 			Next
 			Next
 			
 			
 			Emit( "}" )
 			Emit( "}" )

+ 14 - 33
src/mx2new/translator_cpp.monkey2

@@ -367,9 +367,7 @@ Class Translator_CPP Extends Translator
 		Local needsMark:=False
 		Local needsMark:=False
 
 
 		EmitBr()		
 		EmitBr()		
-		For Local node:=Eachin ctype.fields
-			Local vvar:=Cast<VarValue>( node )
-			If Not vvar Continue
+		For Local vvar:=Eachin ctype.fields
 
 
 			#rem			
 			#rem			
 			If cdecl.kind="struct"
 			If cdecl.kind="struct"
@@ -515,9 +513,7 @@ Class Translator_CPP Extends Translator
 		Local needsMark:=False
 		Local needsMark:=False
 
 
 		EmitBr()		
 		EmitBr()		
-		For Local node:=Eachin ctype.fields
-			Local vvar:=Cast<VarValue>( node )
-			If Not vvar Continue
+		For Local vvar:=Eachin ctype.fields
 			
 			
 			If IsGCType( vvar.type ) needsMark=True
 			If IsGCType( vvar.type ) needsMark=True
 			
 			
@@ -535,9 +531,8 @@ Class Translator_CPP Extends Translator
 			
 			
 			BeginGCFrame()
 			BeginGCFrame()
 			
 			
-			For Local node:=Eachin ctype.fields
-				Local vvar:=Cast<VarValue>( node )
-				If Not vvar Or Not vvar.init Or Not vvar.init.HasSideEffects Continue
+			For Local vvar:=Eachin ctype.fields
+				If Not vvar.init Or Not vvar.init.HasSideEffects Continue
 
 
 				Emit( Trans( vvar )+"="+Trans( vvar.init )+";" )
 				Emit( Trans( vvar )+"="+Trans( vvar.init )+";" )
 			Next
 			Next
@@ -559,9 +554,8 @@ Class Translator_CPP Extends Translator
 					Emit( ClassName( ctype.superType )+"::gcMark();" )
 					Emit( ClassName( ctype.superType )+"::gcMark();" )
 				End
 				End
 			
 			
-				For Local node:=Eachin ctype.fields
-					Local vvar:=Cast<VarValue>( node )
-					If Not vvar Or Not IsGCType( vvar.type ) Continue
+				For Local vvar:=Eachin ctype.fields
+					If Not IsGCType( vvar.type ) Continue
 					
 					
 					Uses( vvar.type )
 					Uses( vvar.type )
 					Emit( "bbGCMark("+VarName( vvar )+");" )
 					Emit( "bbGCMark("+VarName( vvar )+");" )
@@ -647,19 +641,6 @@ Class Translator_CPP Extends Translator
 			
 			
 				Emit( "return bbDBStructValue(p);" )
 				Emit( "return bbDBStructValue(p);" )
 			End
 			End
-			
-				#rem				
-			
-				Emit( "bbString t=~q{~q;" )
-				
-				For Local vvar:=Eachin ctype.fields
-					Local v:="&p->"+VarName( vvar )
-					Emit( "t+=BB_T(~q"+vvar.vdecl.ident+"~q)+~q:~q+bbDBType("+v+")+~q=~q+bbDBValue("+v+")+~q;~q;" )
-				Next
-				
-				Emit( "return t+~q}~q;" )
-				
-				#end
 				
 				
 			Emit( "}" )
 			Emit( "}" )
 				
 				
@@ -672,9 +653,7 @@ Class Translator_CPP Extends Translator
 			If Not hasCmp
 			If Not hasCmp
 				EmitBr()
 				EmitBr()
 				Emit( "int bbCompare(const "+cname+"&x,const "+cname+"&y){" )
 				Emit( "int bbCompare(const "+cname+"&x,const "+cname+"&y){" )
-				For Local node:=Eachin ctype.fields
-					Local vvar:=Cast<VarValue>( node )
-					If Not vvar Continue
+				For Local vvar:=Eachin ctype.fields
 					Local vname:=VarName( vvar )
 					Local vname:=VarName( vvar )
 					Emit( "if(int t=bbCompare(x."+vname+",y."+vname+")) return t;" )
 					Emit( "if(int t=bbCompare(x."+vname+",y."+vname+")) return t;" )
 				Next
 				Next
@@ -691,9 +670,8 @@ Class Translator_CPP Extends Translator
 					Emit( "bbGCMark(("+ClassName( ctype.superType )+"&)t);" )
 					Emit( "bbGCMark(("+ClassName( ctype.superType )+"&)t);" )
 				Endif
 				Endif
 	
 	
-				For Local node:=Eachin ctype.fields
-					Local vvar:=Cast<VarValue>( node )
-					If Not vvar Or Not IsGCType( vvar.type ) Continue
+				For Local vvar:=Eachin ctype.fields
+					If Not IsGCType( vvar.type ) Continue
 					
 					
 					Uses( vvar.type )
 					Uses( vvar.type )
 					Emit( "bbGCMark(t."+VarName( vvar )+");" )
 					Emit( "bbGCMark(t."+VarName( vvar )+");" )
@@ -808,8 +786,11 @@ Class Translator_CPP Extends Translator
 
 
 		Emit( "void gcMark(){" )
 		Emit( "void gcMark(){" )
 		For Local vvar:=Eachin func.captures
 		For Local vvar:=Eachin func.captures
-			If IsGCType( vvar.type ) 
-				Uses( vvar.type )
+			If Not IsGCType( vvar.type ) Continue
+			Uses( vvar.type )
+			If IsGCPtrType( vvar.type )
+				Emit( "bbGCMarkPtr("+VarName( vvar )+");" )
+			Else
 				Emit( "bbGCMark("+VarName( vvar )+");" )
 				Emit( "bbGCMark("+VarName( vvar )+");" )
 			Endif
 			Endif
 		Next
 		Next