2
0
Mark Sibly 8 жил өмнө
parent
commit
d72d2c86cb

+ 6 - 0
src/mx2cc/builder.monkey2

@@ -393,6 +393,7 @@ Class BuilderInstance
 				Local vvar:=Cast<VarValue>( inst )
 				Local func:=Cast<FuncValue>( inst )
 				Local ctype:=TCast<ClassType>( inst )
+				Local etype:=TCast<EnumType>( inst )
 				
 				If vvar
 					transFile=vvar.transFile
@@ -400,6 +401,8 @@ Class BuilderInstance
 					transFile=func.transFile
 				Else If ctype
 					transFile=ctype.transFile
+				Else If etype
+					transFile=etype.transFile
 				Endif
 				
 				If Not transFile Or transFile.module=module Continue
@@ -441,6 +444,9 @@ Class BuilderInstance
 				Else If ctype
 					ctype.transFile=transFile
 					transFile.classes.Push( ctype )
+				Else If etype
+					etype.transFile=transFile
+					transFile.enums.Push( etype )
 				Endif
 				
 			Next

+ 3 - 2
src/mx2cc/class.monkey2

@@ -227,9 +227,10 @@ Class ClassType Extends Type
 		Else
 		
 			If IsGenInstance
+				
 				SemantMembers()
-				Local module:=Builder.semantingModule 
-				module.genInstances.Push( Self )
+				
+				Builder.semantingModule.genInstances.Push( Self )
 			Else
 				Builder.semantMembers.AddLast( Self )
 			Endif

+ 3 - 1
src/mx2cc/enum.monkey2

@@ -74,8 +74,10 @@ Class EnumType Extends Type
 		Next
 		
 		If Not edecl.IsExtern And Not scope.IsGeneric
+			
+			If scope.IsInstanceOf Builder.semantingModule.genInstances.Add( Self )
 	
-			scope.FindFile().fdecl.enums.Push( Self )
+			transFile.enums.Push( Self )
 		
 		Endif
 		

+ 5 - 5
src/mx2cc/func.monkey2

@@ -409,15 +409,14 @@ Class FuncValue Extends Value
 		
 		If fdecl.kind="function" Or IsExtension
 		
-			transFile.functions.Push( Self )
-			
 			If fdecl.kind="function" And Not cscope And fdecl.ident="Main"
 			
 				If Not TCast<VoidType>( ftype.retType ) Or ftype.argTypes
 					Throw New SemantEx( "Function 'Main' must be of type Void()" )
 				Endif
 
-				Local module:=scope.FindFile().fdecl.module
+				Local module:=transFile.module'.FindFile().fdecl.module
+				
 				If module.main Throw New SemantEx( "Duplicate declaration of 'Main'" )
 				
 				module.main=Self
@@ -425,11 +424,12 @@ Class FuncValue Extends Value
 			
 			If instanceOf Or IsExtension Or (cscope And cscope.ctype.instanceOf)
 			
-				Local module:=Builder.semantingModule
-				module.genInstances.Push( Self )
+				Builder.semantingModule.genInstances.Push( Self )
 				
 			Endif
 
+			transFile.functions.Push( Self )
+			
 		Else
 		
 			If IsCtor Or IsMethod

+ 0 - 1
src/mx2cc/mx2cc.monkey2

@@ -1,7 +1,6 @@
 
 Namespace mx2cc
 
-
 #Import "<std>"
 
 #Import "mx2"

+ 37 - 24
src/mx2cc/test.monkey2

@@ -1,37 +1,50 @@
 
-#Import "<std>"
-#Import "<mojo>"
-
-Using std..
-Using mojo..
-
-Global f:void()
+Class C
+	Field x:Int,y:Int
+End
 
-Function Test2()
+Enum E
+	A,B,C
 End
 
-Function Test2( x:Int )
+Function F2:Int( n:Int )
+	Local i:=n*2
+	Return i
 End
 
-Class C
-	
-	Method New()
-		f=Test
-	End
-	
-	Method Test()
-		print "Here!"
-	End
-	
-	Method Test( x:Int )
-	End
+Function F1:Int( n:Int )
+	Local i:=F2(n*2)
+	Return i
 End
 
 Function Main()
+
+	Local e:E
+	Local c:=New C
+	Local c2:C
+	Local t:=New C[20]
+	t[5]=c
 	
-	New C
-	
-	f()
+	DebugStop()
+
+	Print "HERE!"
 	
+	Local i:=0
+	While i<10
+		Print "i="+i
+		i+=1
+	Wend
+
+	For Local i:=0 Until 10
+		If i<5
+			Print "i<5"
+		Else If i<7
+			Print "i<7"
+		Else
+			Print "i"
+		endif
+		Print F1(i)
+	Next
 	
+	Print "HERE!"
 End

+ 4 - 2
src/mx2cc/translator.monkey2

@@ -360,10 +360,12 @@ Class Translator
 			
 			Local etype:=TCast<EnumType>( type )
 			If etype
-			
 				If Included( etype.transFile ) Continue
 				
-				Emit( "enum class "+EnumName( etype )+";" )
+				Local ename:=EnumName( etype )
+				Emit( "enum class "+ename+";" )
+				Emit( "bbString bbDBType("+ename+"*);" )
+				Emit( "bbString bbDBValue("+ename+"*);" )
 				
 				Continue
 			Endif

+ 45 - 16
src/mx2cc/translator_cpp.monkey2

@@ -7,11 +7,13 @@ Class Translator_CPP Extends Translator
 	Field _module:Module
 	Field _lambdaId:Int
 	Field _gctmps:=0
+	Field _dbline:=-1
 	
 	Method Reset() Override
 		Super.Reset()
 		_lambdaId=0
 		_gctmps=0
+		_dbline=-1
 	End
 	
 	Method TranslateModule:Bool( module:Module )
@@ -148,7 +150,10 @@ Class Translator_CPP Extends Translator
 
 		EmitBr()
 		For Local etype:=Eachin fdecl.enums
-			Emit( "enum class "+EnumName( etype )+";" )
+			Local ename:=EnumName( etype )
+			Emit( "enum class "+ename+";" )
+			Emit( "bbString bbDBType("+ename+"*);" )
+			Emit( "bbString bbDBValue("+ename+"*);" )
 		Next
 		
 		EmitBr()
@@ -184,7 +189,6 @@ Class Translator_CPP Extends Translator
 			EmitClassProto( ctype,fdecl,emitted )
 		Next
 		
-		
 		EmitBr()		
 		Emit( "#endif" )
 		EmitBr()
@@ -198,6 +202,21 @@ Class Translator_CPP Extends Translator
 		EmitBr()
 		Emit( "#include ~q"+MakeIncludePath( fdecl.hfile,ExtractDir( fdecl.cfile ) )+"~q" )
 		EmitBr()
+
+		'debug enums!		
+		EmitBr()
+		For Local etype:=Eachin fdecl.enums
+			
+			Local ename:=EnumName( etype )
+			
+			Emit( "bbString bbDBType("+ename+"*p){" )
+			Emit( "~treturn ~q"+etype.Name+"~q;" )
+			Emit( "}" )
+			Emit( "bbString bbDBValue("+ename+"*p){" )
+			Emit( "~treturn bbString( *(int*)p );" )
+			Emit( "}" )
+		Next
+		
 		
 		BeginDeps()
 		
@@ -1201,15 +1220,35 @@ Class Translator_CPP Extends Translator
 	
 	'***** Block *****
 	
+	Method DebugInfo:String( stmt:Stmt )
+		
+		If _debug And stmt.pnode Return "bbDBStmt("+stmt.pnode.srcpos+")"
+		
+		Return ""
+	End
+	
+	Method EmitDebugInfo( stmt:Stmt )
+		
+		Local db:=DebugInfo( stmt )
+		If Not db Return
+		
+		If stmt.pnode.srcpos Shr 12=_dbline Return 
+
+		_dbline=stmt.pnode.srcpos Shr 12
+		
+		Emit( db+";" )
+	End
+	
 	Method BeginBlock()
 
 		BeginGCFrame()
+		
 		If _debug Emit( "bbDBBlock db_blk;" )
 
 	End
 	
 	Method EmitStmts( block:Block )
-
+		
 		For Local stmt:=Eachin block.stmts
 			EmitStmt( stmt )
 			FreeGCTmps()
@@ -1265,16 +1304,6 @@ Class Translator_CPP Extends Translator
 	
 	'***** Stmt *****
 	
-	Method DebugInfo:String( stmt:Stmt )
-		If _debug And stmt.pnode Return "bbDBStmt("+stmt.pnode.srcpos+")"
-		Return ""
-	End
-	
-	Method EmitDebugInfo( stmt:Stmt )
-		Local db:=DebugInfo( stmt )
-		If db Emit( db+";" )
-	End
-	
 	Method EmitStmt( stmt:Stmt )
 	
 		If Not stmt Return
@@ -1302,6 +1331,9 @@ Class Translator_CPP Extends Translator
 		Local ifStmt:=Cast<IfStmt>( stmt )
 		If ifStmt EmitStmt( ifStmt ) ; Return
 		
+		Local forStmt:=Cast<ForStmt>( stmt )
+		If forStmt EmitStmt( forStmt ) ; Return
+		
 		Local whileStmt:=Cast<WhileStmt>( stmt )
 		If whileStmt EmitStmt( whileStmt ) ; Return
 		
@@ -1311,9 +1343,6 @@ Class Translator_CPP Extends Translator
 		Local selectStmt:=Cast<SelectStmt>( stmt )
 		If selectStmt EmitStmt( selectStmt ) ; Return
 		
-		Local forStmt:=Cast<ForStmt>( stmt )
-		If forStmt EmitStmt( forStmt ) ; Return
-		
 		Local tryStmt:=Cast<TryStmt>( stmt )
 		If tryStmt EmitStmt( tryStmt ) ; Return