Kaynağa Gözat

Added FieldOffset builtin.

Brucey 5 yıl önce
ebeveyn
işleme
7ddd0a4e47
6 değiştirilmiş dosya ile 79 ekleme ve 2 silme
  1. 12 0
      ctranslator.bmx
  2. 43 0
      expr.bmx
  3. 1 1
      options.bmx
  4. 18 0
      parser.bmx
  5. 1 1
      toker.bmx
  6. 4 0
      translator.bmx

+ 12 - 0
ctranslator.bmx

@@ -1631,6 +1631,18 @@ t:+"NULLNULLNULL"
 	Method TransStackAllocExpr:String(expr:TStackAllocExpr)
 	Method TransStackAllocExpr:String(expr:TStackAllocExpr)
 		Return "bbStackAlloc" + Bra(expr.expr.Trans())
 		Return "bbStackAlloc" + Bra(expr.expr.Trans())
 	End Method
 	End Method
+	
+	Method TransFieldOffsetExpr:String(expr:TFieldOffsetExpr)
+		Local t:String = "offsetof("
+		
+		Local cdecl:TClassDecl = TIdentTypeExpr(expr.typeExpr).cdecl
+		t :+ "struct " + cdecl.munged
+		If Not cdecl.IsStruct() Then
+			t :+ "_obj"
+		End If
+		
+		Return t + ", " + TVarExpr(expr.fieldExpr).decl.munged + ")"
+	End Method
 
 
 	'***** Expressions *****
 	'***** Expressions *****
 
 

+ 43 - 0
expr.bmx

@@ -3537,3 +3537,46 @@ Type TStackAllocExpr Extends TBuiltinExpr
 	End Method
 	End Method
 
 
 End Type
 End Type
+
+Type TFieldOffsetExpr Extends TBuiltinExpr
+
+	Field typeExpr:TExpr
+	Field fieldExpr:TExpr
+
+	Method Create:TFieldOffsetExpr( typeExpr:TExpr, fieldExpr:TExpr )
+		Self.id="fieldoffset"
+		Self.typeExpr=typeExpr
+		Self.fieldExpr = fieldExpr
+		Return Self
+	End Method
+
+	Method Semant:TExpr(options:Int = 0)
+		If exprType Return Self
+		
+		' validate type and field
+		typeExpr = typeExpr.Semant()
+		
+		If Not TIdentTypeExpr(typeExpr) Then
+			Err "Expecting Type or Struct"
+		End If
+		
+		TIdentExpr(fieldExpr).scope = TIdentTypeExpr(typeExpr).cdecl
+
+		fieldExpr = fieldExpr.Semant()
+		
+		If Not TVarExpr(fieldExpr) Or Not TFieldDecl(TVarExpr(fieldExpr).decl) Then
+			Err "Expecting Field"
+		End If
+		
+		exprType = New TSizeTType
+		Return Self
+	End Method
+
+	Method Copy:TExpr()
+		Return New TFieldOffsetExpr.Create( typeExpr, fieldExpr )
+	End Method
+
+	Method ToString$()
+		Return "TFieldOffsetExpr("+typeExpr.ToString()+"," + fieldExpr.ToString() + ")"
+	End Method
+End Type

+ 1 - 1
options.bmx

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

+ 18 - 0
parser.bmx

@@ -1351,6 +1351,24 @@ Type TParser Extends TGenProcessor
 				expr=ParseExpr()
 				expr=ParseExpr()
 				expr=New TStackAllocExpr.Create( expr )
 				expr=New TStackAllocExpr.Create( expr )
 			EndIf
 			EndIf
+		Case "fieldoffset"
+			NextToke
+			
+			Local withBrackets:Int
+			
+			If CParse("(")
+				withBrackets = True
+			End If
+			
+			Local typeExpr:TExpr = ParseExpr()
+			Parse ","
+			Local fieldExpr:TExpr = ParseExpr()
+			
+			If withBrackets Then
+				Parse(")")
+			End If
+			
+			expr=New TFieldOffsetExpr.Create( typeExpr, fieldExpr )
 		Default
 		Default
 			Select _tokeType
 			Select _tokeType
 			Case TOKE_IDENT
 			Case TOKE_IDENT

+ 1 - 1
toker.bmx

@@ -50,7 +50,7 @@ Type TToker
 		"next,return,alias,rem,endrem,throw,assert,try,catch,finally,nodebug,incbin,endselect,endmethod," + ..
 		"next,return,alias,rem,endrem,throw,assert,try,catch,finally,nodebug,incbin,endselect,endmethod," + ..
 		"endfunction,endtype,endextern,endtry,endwhile,pi,release,defdata,readdata,restoredata,interface," + ..
 		"endfunction,endtype,endextern,endtry,endwhile,pi,release,defdata,readdata,restoredata,interface," + ..
 		"endinterface,implements,size_t,uint,ulong,struct,endstruct,operator,where,readonly,export,override," + ..
 		"endinterface,implements,size_t,uint,ulong,struct,endstruct,operator,where,readonly,export,override," + ..
-		"enum,endenum,stackalloc,inline"
+		"enum,endenum,stackalloc,inline,fieldoffset"
 	Global _keywords:TMap
 	Global _keywords:TMap
 
 
 	Field _path$
 	Field _path$

+ 4 - 0
translator.bmx

@@ -1338,6 +1338,7 @@ End Rem
 		If TLenExpr(expr) Return TransLenExpr(TLenExpr(expr))
 		If TLenExpr(expr) Return TransLenExpr(TLenExpr(expr))
 		If TSizeOfExpr(expr) Return TransSizeOfExpr(TSizeOfExpr(expr))
 		If TSizeOfExpr(expr) Return TransSizeOfExpr(TSizeOfExpr(expr))
 		If TStackAllocExpr(expr) Return TransStackAllocExpr(TStackAllocExpr(expr))
 		If TStackAllocExpr(expr) Return TransStackAllocExpr(TStackAllocExpr(expr))
+		If TFieldOffsetExpr(expr) Return TransFieldOffsetExpr(TFieldOffsetExpr(expr))
 		Err "TODO : TransBuiltinExpr()"
 		Err "TODO : TransBuiltinExpr()"
 	End Method
 	End Method
 	
 	
@@ -1355,6 +1356,9 @@ End Rem
 
 
 	Method TransStackAllocExpr:String(expr:TStackAllocExpr)
 	Method TransStackAllocExpr:String(expr:TStackAllocExpr)
 	End Method
 	End Method
+
+	Method TransFieldOffsetExpr:String(expr:TFieldOffsetExpr)
+	End Method
 	
 	
 	Method TransIdentTypeExpr:String(expr:TIdentTypeExpr) Abstract
 	Method TransIdentTypeExpr:String(expr:TIdentTypeExpr) Abstract