Преглед изворни кода

Added more casts for code generation.

Brucey пре 5 месеци
родитељ
комит
093bbe9a4c
3 измењених фајлова са 68 додато и 13 уклоњено
  1. 40 3
      ctranslator.bmx
  2. 27 0
      decl.bmx
  3. 1 10
      parser.bmx

+ 40 - 3
ctranslator.bmx

@@ -557,7 +557,7 @@ Type TCTranslator Extends TTranslator
 					End If
 				End If
 			End If
-			If TFunctionPtrType( ty) Return Bra(TransType(ty, "*")) + "(&brl_blitz_NullFunctionError)"
+			If TFunctionPtrType( ty) Return Bra(TransType(ty, "")) + "(&brl_blitz_NullFunctionError)"
 			If TEnumType( ty ) Then
 				If TEnumType( ty ).decl.isFlags Then
 					Return "0"
@@ -593,7 +593,7 @@ Type TCTranslator Extends TTranslator
 				Local arg:TExpr = args[i]
 				
 				' object cast to match param type
-				If TObjectType(ty) And Not TObjectType(ty).classDecl.IsStruct() Then
+				If TObjectType(ty) And Not TObjectType(ty).classDecl.IsStruct() And Not argDecl.castTo Then
 					Local fdecl:TFuncDecl = decl
 					If TClassDecl(decl.scope) Then
 						fdecl = TClassDecl(decl.scope).GetOriginalFuncDecl(decl)
@@ -671,6 +671,12 @@ Type TCTranslator Extends TTranslator
 						Continue
 					End If
 
+					If TCastExpr(arg) And TVarExpr(TCastExpr(arg).expr) Then
+						t:+ varRef
+						t:+ TransCast(TFunctionPtrType(ty)) + Bra(arg.Trans())
+						Continue
+					End If
+
 					' Object -> Byte Ptr
 					If IsPointerType(ty, TType.T_BYTE) And TObjectType(arg.exprType) Then
 						t:+ varRef + Bra("bbObjectToFieldOffset" + Bra("(BBObject*)" + arg.Trans()))
@@ -745,6 +751,30 @@ t:+"NULLNULLNULL"
 		Return Bra(t)
 	End Method
 
+	' translate to C cast
+	Method TransCast:String(funcPtr:TFunctionPtrType)
+		If Not funcPtr Then
+			Return ""
+		End If
+
+		Local s:String = "("
+		s:+ TransType(funcPtr.func.retType, "")
+		s:+ "(*)("
+
+		For Local i:Int=0 Until funcPtr.func.argDecls.Length
+			If i Then
+				s:+ ","
+			End If
+
+			s:+ TransType(funcPtr.func.argDecls[i].ty, "")
+
+		Next
+
+		s:+ ")"
+		s:+ ")"
+		Return s
+	End Method
+
 	Method TransArgsTypes$( args:TExpr[],declArgTypes:TType[])
 		Local t$
 		For Local i:Int=0 Until args.Length
@@ -3152,11 +3182,18 @@ t:+"NULLNULLNULL"
 				s :+ lhs+TransAssignOp( stmt.op )+cast+rhs
 			End If
 		Else If (TFunctionPtrType(stmt.lhs.exprType) <> Null Or IsPointerType(stmt.lhs.exprType, TType.T_BYTE)) And TInvokeExpr(stmt.rhs) And Not TInvokeExpr(stmt.rhs).invokedWithBraces Then
+
+			If Not cast And TFunctionPtrType(stmt.lhs.exprType) Then
+				Local fp:TFunctionPtrType = TFunctionPtrType(stmt.lhs.exprType)
+				If fp.func.cdets Then
+					cast = fp.func.cdets.TransCast()
+				End If
+			End If
 			rhs = TInvokeExpr(stmt.rhs).decl.munged
 			s :+ lhs+TransAssignOp( stmt.op )+cast+rhs
 		Else If TObjectType(stmt.lhs.exprType) And TObjectType(stmt.lhs.exprType).classDecl.IsStruct() And rhs = "&bbNullObject" Then
 			s :+ lhs+TransAssignOp( stmt.op )+cast+"{}"
-		Else 
+		Else
 			s :+ lhs+TransAssignOp( stmt.op )+cast+rhs
 		End If
 

+ 27 - 0
decl.bmx

@@ -1928,6 +1928,7 @@ Type TFuncDecl Extends TBlockDecl
 	
 	Field castTo:String
 	Field noCastGen:Int
+	Field cdets:TCastDets
 	
 	Field maybeFunctionPtr:Int
 	
@@ -4479,3 +4480,29 @@ Type TGenProcessor Abstract
 	End Method
 	
 End Type
+
+Type TCastDets
+
+	Field name:String
+	Field retType:String
+	Field noGen:Int
+	Field args:String[0]
+	Field api:String
+
+	Method TransCast:String()
+		Local s:String = "(" + retType + " (*)"
+
+		s :+ "("
+		For Local i:Int = 0 Until args.length
+			s :+ args[i]
+			If i < args.length - 1 Then
+				s :+ ","
+			End If
+		Next
+		s :+ ")"
+
+		s :+ ")"
+		Return s
+	End Method
+	
+End Type

+ 1 - 10
parser.bmx

@@ -2704,6 +2704,7 @@ End Rem
 					End If
 					
 					If cdets Then
+						TFunctionPtrType(ty).func.cdets = cdets
 						TFunctionPtrType(ty).func.castTo = cdets.retType
 						If cdets.noGen Then
 							TFunctionPtrType(ty).func.noCastGen = True
@@ -4831,13 +4832,3 @@ Function EvalS$( source$,ty:TType )
 	
 	Return val
 End Function
-
-Type TCastDets
-
-	Field name:String
-	Field retType:String
-	Field noGen:Int
-	Field args:String[0]
-	Field api:String
-	
-End Type