Procházet zdrojové kódy

Fixed some array casting issues.
Handle variable type usage better.

woollybah před 11 roky
rodič
revize
187c2b0435
3 změnil soubory, kde provedl 35 přidání a 0 odebrání
  1. 9 0
      ctranslator.bmx
  2. 22 0
      expr.bmx
  3. 4 0
      parser.bmx

+ 9 - 0
ctranslator.bmx

@@ -1034,6 +1034,15 @@ t:+"NULLNULLNULL"
 				If TNumericType( src ) Return Bra("(BBINT**)"+t)
 			End If
 		Else If TArrayType( dst )
+			If TArrayType( src ) Then
+				If TObjectType( TArrayType( dst ).elemType ) And TObjectType( TArrayType( dst ).elemType ).classDecl.ident = "Object" Then
+					' if we are casting to Object[], don't actually cast.
+					Return Bra(t)
+				Else
+					Return "bbArrayCastFromObject" + Bra(t + "," + TransArrayType(TArrayType( dst ).elemType))
+				End If
+			End If
+			
 			If TObjectType( src) And (TObjectType( src ).classDecl.ident = "Array" Or TObjectType( src ).classDecl.ident = "Object") Then
 				Return "bbArrayCastFromObject" + Bra(t + "," + TransArrayType(TArrayType( dst ).elemType))
 			End If

+ 22 - 0
expr.bmx

@@ -155,6 +155,18 @@ Type TExpr
 		End If
 		If lhs.ExtendsType( rhs ) Return rhs
 		If rhs.ExtendsType( lhs ) Return lhs
+		' balance arrays - only for objects... to the lowest common denominator.
+		' either Object or superclass (TODO)
+		If TArrayType( lhs ) And TArrayType( rhs ) Then
+			' lhs = Object[]
+			If TObjectType(TArrayType( lhs ).elemType) And TObjectType(TArrayType( lhs ).elemType).classDecl.ident = "Object" Then
+				Return lhs
+			End If
+			' rhs = Object[]
+			If TObjectType(TArrayType( rhs ).elemType) And TObjectType(TArrayType( rhs ).elemType).classDecl.ident = "Object" Then
+				Return rhs
+			End If
+		End If
 		Err "Can't balance types "+lhs.ToString()+" and "+rhs.ToString()+"."
 	End Method
 
@@ -867,6 +879,16 @@ Type TCastExpr Extends TExpr
 			Return Self
 		End If
 		
+		' cast from "some kind of object" array to Object[]
+		If TArrayType(ty) And TArrayType(src)
+			If (TObjectType(TArrayType(src).elemType) Or TStringType(TArrayType(src).elemType) Or TArrayType(TArrayType(src).elemType)) And TObjectType(TArrayType(ty).elemType) Then
+				If TObjectType(TArrayType(ty).elemType).classDecl.ident = "Object" Then
+					exprType = ty
+					Return Self
+				End If
+			End If
+		End If
+		
 		If TArrayType(ty) And TObjectType(src) 
 			If TObjectType(src).classDecl.ident = "Array" Then
 				exprType = ty

+ 4 - 0
parser.bmx

@@ -1262,6 +1262,10 @@ Type TParser
 		Else
 			varlocal=False
 			varid=ParseIdent()
+
+			' eat any type stuff
+			ParseConstNumberType()
+
 			Parse "="
 		EndIf