Browse Source

Added proper reflection of procedure variables

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7974 8c9fc860-2736-0410-a75d-ab315db34111
negelef 7 years ago
parent
commit
2e484d2f6e
2 changed files with 32 additions and 15 deletions
  1. 11 5
      source/FoxIntermediateBackend.Mod
  2. 21 10
      source/Reflection.Mod

+ 11 - 5
source/FoxIntermediateBackend.Mod

@@ -12176,10 +12176,11 @@ TYPE
 				sfTypeMathStaticArray = 26X;
 				sfTypeMathStaticArray = 26X;
 				sfTypeMathOpenArray = 27X;
 				sfTypeMathOpenArray = 27X;
 				sfTypeMathTensor = 28X;
 				sfTypeMathTensor = 28X;
-				sfTypeDelegate = 29X;
-				sfTypeENUM = 2AX; 
-				sfTypeCELL = 2BX;
-				sfTypePORT = 2CX;
+				sfTypeProcedure = 29X;
+				sfTypeDelegate = 2AX;
+				sfTypeENUM = 2BX; 
+				sfTypeCELL = 2CX;
+				sfTypePORT = 2DX;
 				
 				
 				sfIN = 0X;
 				sfIN = 0X;
 				sfOUT = 1X;
 				sfOUT = 1X;
@@ -12233,6 +12234,7 @@ TYPE
 						| sfTypeMathStaticArray length:SIZE Type
 						| sfTypeMathStaticArray length:SIZE Type
 						| sfTypeMathTensor Type
 						| sfTypeMathTensor Type
 						| sfTypeRecord tdAdr:ADDRESS 
 						| sfTypeRecord tdAdr:ADDRESS 
+						| sfTypeProcedure {Parameter} return:Type
 						| sfTypeDelegate {Parameter} return:Type
 						| sfTypeDelegate {Parameter} return:Type
 						| sfTypePort (sfIN | sfOUT)
 						| sfTypePort (sfIN | sfOUT)
 						| sfTypeBOOLEAN
 						| sfTypeBOOLEAN
@@ -12367,7 +12369,11 @@ TYPE
 							END;
 							END;
 						| type: SyntaxTree.ProcedureType DO
 						| type: SyntaxTree.ProcedureType DO
 								IF ~Indirect(type) THEN
 								IF ~Indirect(type) THEN
-									Char(section, sfTypeDelegate);
+									IF type.isDelegate THEN
+										Char(section, sfTypeDelegate);
+									ELSE
+										Char(section, sfTypeProcedure);
+									END;
 									parameter := type.firstParameter;
 									parameter := type.firstParameter;
 									WHILE(parameter # NIL) DO
 									WHILE(parameter # NIL) DO
 										NParameter(parameter, -1);
 										NParameter(parameter, -1);

+ 21 - 10
source/Reflection.Mod

@@ -57,10 +57,11 @@ CONST
 	sfTypeMathStaticArray* = 26X;
 	sfTypeMathStaticArray* = 26X;
 	sfTypeMathOpenArray* = 27X;
 	sfTypeMathOpenArray* = 27X;
 	sfTypeMathTensor* = 28X;
 	sfTypeMathTensor* = 28X;
-	sfTypeDelegate* = 29X; 
-	sfTypeENUM* = 2AX;
-	sfTypeCELL* = 2BX;
-	sfTypePORT* = 2CX;
+	sfTypeProcedure* = 29X; 
+	sfTypeDelegate* = 2AX; 
+	sfTypeENUM* = 2BX;
+	sfTypeCELL* = 2CX;
+	sfTypePORT* = 2DX;
 
 
 	
 	
 	sfIN* = 0X;
 	sfIN* = 0X;
@@ -98,6 +99,7 @@ CONST
 			| sfTypeMathStaticArray length:SIZE Type
 			| sfTypeMathStaticArray length:SIZE Type
 			| sfTypeMathTensor Type
 			| sfTypeMathTensor Type
 			| sfTypeRecord tdAdr:ADDRESS 
 			| sfTypeRecord tdAdr:ADDRESS 
+			| sfTypeProcedure {Parameter} return:Type
 			| sfTypeDelegate {Parameter} return:Type
 			| sfTypeDelegate {Parameter} return:Type
 			| sfTypePort (sfIN | sfOUT)
 			| sfTypePort (sfIN | sfOUT)
 			| sfTypeBOOLEAN
 			| sfTypeBOOLEAN
@@ -347,7 +349,7 @@ CONST
 		b: BOOLEAN;
 		b: BOOLEAN;
 		c: CHAR; c8: CHAR8; c16: CHAR16; c32: CHAR32;
 		c: CHAR; c8: CHAR8; c16: CHAR16; c32: CHAR32;
 		s: SHORTINT; i: INTEGER; l: LONGINT; h: HUGEINT;
 		s: SHORTINT; i: INTEGER; l: LONGINT; h: HUGEINT;
-		sz: SIZE; a: ADDRESS;
+		sz: SIZE; a, pc: ADDRESS;
 		word: WORD; lword: LONGWORD;
 		word: WORD; lword: LONGWORD;
 		s8: SIGNED8; s16: SIGNED16; s32: SIGNED32; s64: SIGNED64;
 		s8: SIGNED8; s16: SIGNED16; s32: SIGNED32; s64: SIGNED64;
 		u8: UNSIGNED8; u16: UNSIGNED16; u32: UNSIGNED32; u64: UNSIGNED64;
 		u8: UNSIGNED8; u16: UNSIGNED16; u32: UNSIGNED32; u64: UNSIGNED64;
@@ -356,6 +358,7 @@ CONST
 		lcplx {UNTRACED}: POINTER {UNSAFE} TO RECORD re,im: LONGREAL END;
 		lcplx {UNTRACED}: POINTER {UNSAFE} TO RECORD re,im: LONGREAL END;
 		set: SET;
 		set: SET;
 		byte: SYSTEM.BYTE;
 		byte: SYSTEM.BYTE;
+		procedure: ARRAY 256 OF CHAR;
 
 
 		PROCEDURE Signed(i: HUGEINT);
 		PROCEDURE Signed(i: HUGEINT);
 		BEGIN
 		BEGIN
@@ -464,6 +467,14 @@ CONST
 			SYSTEM.GET(adr, word); Signed(word);
 			SYSTEM.GET(adr, word); Signed(word);
 		| sfTypePORT:
 		| sfTypePORT:
 			SYSTEM.GET(adr, a); Unsigned(a, SIZEOF(ADDRESS));
 			SYSTEM.GET(adr, a); Unsigned(a, SIZEOF(ADDRESS));
+		| sfTypeProcedure, sfTypeDelegate:
+			size := SIZE OF ADDRESS;
+			SYSTEM.GET(adr, a); pc := NIL; GetProcedureName(a, procedure, pc);
+			IF pc # NIL THEN w.String(procedure) ELSE Unsigned(a, SIZE OF ADDRESS) END;
+			IF type = sfTypeDelegate THEN
+				SYSTEM.GET(adr + size, a); INC(size, SIZE OF ADDRESS);
+				w.String(" {"); Unsigned(a, SIZE OF ADDRESS); w.String("}");
+			END;
 		ELSE
 		ELSE
 			w.String("UNKOWN TYPE "); Unsigned(ORD(type),1);
 			w.String("UNKOWN TYPE "); Unsigned(ORD(type),1);
 		END;
 		END;
@@ -607,8 +618,8 @@ CONST
 				a := GetAddress(refs, offset); 
 				a := GetAddress(refs, offset); 
 				WriteType(w,a);
 				WriteType(w,a);
 				w.String(")");
 				w.String(")");
-			| sfTypeDelegate: 
-				w.String(" (DELEGATE)");
+			| sfTypeProcedure, sfTypeDelegate: 
+				WriteBasicValue(w, type, adr, size);
 				WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 				WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 				SkipType(refs, offset); 
 				SkipType(refs, offset); 
 			| sfTypePORT:
 			| sfTypePORT:
@@ -674,7 +685,7 @@ CONST
 		| sfTypeMathStaticArray: SkipSize(offset); SkipType(refs, offset);
 		| sfTypeMathStaticArray: SkipSize(offset); SkipType(refs, offset);
 		| sfTypeMathTensor: SkipType(refs, offset); 
 		| sfTypeMathTensor: SkipType(refs, offset); 
 		| sfTypeRecord: SkipSize(offset);
 		| sfTypeRecord: SkipSize(offset);
-		| sfTypeDelegate: 
+		| sfTypeProcedure, sfTypeDelegate: 
 			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset);
 			SkipType(refs, offset);
 		| sfTypeENUM:
 		| sfTypeENUM:
@@ -1108,8 +1119,8 @@ TYPE
 		| sfTypeMathStaticArray: w.String("ARRAY ["); w.Int(GetSize(refs, offset),1); w.String("] OF "); ReportType(w, refs, offset);
 		| sfTypeMathStaticArray: w.String("ARRAY ["); w.Int(GetSize(refs, offset),1); w.String("] OF "); ReportType(w, refs, offset);
 		| sfTypeMathTensor: w.String("ARRAY [?] OF "); ReportType(w, refs, offset); 
 		| sfTypeMathTensor: w.String("ARRAY [?] OF "); ReportType(w, refs, offset); 
 		| sfTypeRecord: w.String("RECORD ");  w.Address(GetAddress(refs, offset)); 
 		| sfTypeRecord: w.String("RECORD ");  w.Address(GetAddress(refs, offset)); 
-		| sfTypeDelegate: 
-			w.String("PROCEDURE ("); 	
+		| sfTypeProcedure, sfTypeDelegate: 
+			w.String("PROCEDURE"); IF c = sfTypeDelegate THEN w.String(" {DELEGATE}") END; w.String(" (");
 			WHILE refs[offset] = sfVariable DO ReportVariable(w, refs, offset) END;
 			WHILE refs[offset] = sfVariable DO ReportVariable(w, refs, offset) END;
 			w.String("):"); ReportType(w, refs, offset); 
 			w.String("):"); ReportType(w, refs, offset); 
 		| sfTypeBOOLEAN: w.String("BOOLEAN"); 
 		| sfTypeBOOLEAN: w.String("BOOLEAN");