Browse Source

Don't dereference Var variables when passing as Var. Fixes #81.
Can only pass matching types as Var.

woollybah 10 years ago
parent
commit
fd3861f670
4 changed files with 29 additions and 10 deletions
  1. 11 2
      ctranslator.bmx
  2. 4 0
      expr.bmx
  3. 1 1
      options.bmx
  4. 13 7
      type.bmx

+ 11 - 2
ctranslator.bmx

@@ -310,11 +310,11 @@ Type TCTranslator Extends TTranslator
 						t:+ "&"
 					End If
 				Else If TArrayType(ty) And (ty._flags & TType.T_VAR) Then
-					If TVarExpr(args[i]) And TArrayType(TVarExpr(args[i]).exprType) Then
+					If TVarExpr(args[i]) And TArrayType(TVarExpr(args[i]).exprType) And Not (args[i].exprType._flags & TType.T_VAR) Then
 						t:+ "&"
 					End If
 				Else If TObjectType(ty) And (ty._flags & TType.T_VAR) Then
-					If TVarExpr(args[i]) And TObjectType(TVarExpr(args[i]).exprType) Then
+					If TVarExpr(args[i]) And TObjectType(TVarExpr(args[i]).exprType) And Not (args[i].exprType._flags & TType.T_VAR) Then
 						t:+ "&"
 					End If
 				Else If TFunctionPtrType(ty) Or IsPointerType(ty, TType.T_BYTE) Then
@@ -627,6 +627,15 @@ t:+"NULLNULLNULL"
 
 	Method TransTemplateCast$( ty:TType,src:TType,expr$ )
 
+		' *sigh*
+		' if var is going to var, remove any leading dereference character.
+		' rather hacky. Would be better to cast variable to varptr during semanting (well done if you can work out where!)
+		If src.EqualsType( ty.ActualType() ) And (ty._flags & TType.T_VAR) And (src._flags & TType.T_VAR) Then
+			If expr.startswith("*") Then
+				expr = expr[1..]
+			End If
+		End If
+
 		If ty=src Return expr
 
 		ty=ty.ActualType()

+ 4 - 0
expr.bmx

@@ -137,6 +137,10 @@ Type TExpr
 				If (TConstExpr(args[i]) Or TBinaryExpr(args[i])) And (funcDecl.argDecls[i].ty._flags & TType.T_VAR) Then
 					Err "Expression for 'Var' parameter must be a variable"
 				End If
+				
+				If (funcDecl.argDecls[i].ty._flags & TType.T_VAR) And Not (funcDecl.argDecls[i].ty.EqualsType(args[i].exprType)) Then
+					err "Variable for 'Var' parameter is not of matching type"
+				End If
 
 				args[i]=args[i].Cast( funcDecl.argDecls[i].ty )
 			Else If funcDecl.argDecls[i].init

+ 1 - 1
options.bmx

@@ -25,7 +25,7 @@ SuperStrict
 
 Import "base.configmap.bmx"
 
-Const version:String = "0.41"
+Const version:String = "0.42"
 
 Const BUILDTYPE_APP:Int = 0
 Const BUILDTYPE_MODULE:Int = 1

+ 13 - 7
type.bmx

@@ -360,7 +360,8 @@ End Type
 Type TIntType Extends TNumericType
 	
 	Method EqualsType:Int( ty:TType )
-		Return TIntType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TIntType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -390,7 +391,8 @@ End Type
 Type TByteType Extends TNumericType
 	
 	Method EqualsType:Int( ty:TType )
-		Return TByteType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TByteType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -420,7 +422,8 @@ End Type
 Type TShortType Extends TNumericType
 
 	Method EqualsType:Int( ty:TType )
-		Return TShortType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TShortType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -450,7 +453,8 @@ End Type
 Type TLongType Extends TNumericType ' BaH Long
 	
 	Method EqualsType:Int( ty:TType )
-		Return TLongType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TLongType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -478,7 +482,8 @@ End Type
 Type TFloatType Extends TDecimalType
 	
 	Method EqualsType:Int( ty:TType )
-		Return TFloatType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TFloatType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -508,7 +513,8 @@ End Type
 Type TDoubleType Extends TDecimalType
 	
 	Method EqualsType:Int( ty:TType )
-		Return TDoubleType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR)) ' varptr = ptr
+		Return TDoubleType( ty )<>Null And (_flags = ty._flags Or ..
+			(_flags & T_VARPTR And ty._flags & T_PTR) Or (ty._flags & T_VARPTR And _flags & T_PTR) Or (_flags & T_VAR))
 	End Method
 	
 	Method ExtendsType:Int( ty:TType )
@@ -536,7 +542,7 @@ Type TStringType Extends TType
 	Field cdecl:TClassDecl
 
 	Method EqualsType:Int( ty:TType )
-		Return TStringType( ty )<>Null And _flags = ty._flags
+		Return TStringType( ty )<>Null And (_flags = ty._flags Or (_flags & T_VAR))
 	End Method
 
 	Method ExtendsType:Int( ty:TType )