Browse Source

Simplified format (unification of parameters and variables)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6709 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 years ago
parent
commit
4de38c56a4
2 changed files with 85 additions and 159 deletions
  1. 36 26
      source/FoxIntermediateBackend.Mod
  2. 49 133
      source/Generic.Reflection.Mod

+ 36 - 26
source/FoxIntermediateBackend.Mod

@@ -11684,21 +11684,22 @@ TYPE
 				sfTypeMathTensor = 28X;
 				sfTypeDelegate = 29X;
 				sfTypeENUM = 2AX; 
-				sfTypeCellType = 2BX;
-				sfTypePortType = 2CX;
+				sfTypeCELL = 2BX;
+				sfTypePORT = 2CX;
 				
-				sfInPort = 0X;
-				sfOutPort = 1X;
-				sfValPar = 0X;
-				sfVarPar = 1X;
-				sfConstPar = 2X; 
+				sfIN = 0X;
+				sfOUT = 1X;
+				
+				(* variable / parameter addressing modes *)
+				sfAbsolute = 0X; (* global vars *)
+				sfRelative = 1X; (* variables, value parameters *)
+				sfIndirect = 2X; (* var parameters *) 
 
 				sfScopeBegin = 0F0X;
 				sfScopeEnd = 0F1X; 
 				sfProcedure = 0F2X; 
 				sfVariable = 	0F3X;
-				sfParameter = 0F4X;
-				sfTypeDeclaration = 0F5X;
+				sfTypeDeclaration = 0F4X;
 
 				RefInfo = TRUE;
 
@@ -11719,8 +11720,7 @@ TYPE
 			(*
 					Scope = sfScopeBegin {Variable} {Procedure} {TypeDeclaration} sfScopeEnd.
 					Procedure = sfProcedure prevSymbol:SIZE name:STRING from:ADDRESS to:ADDRESS {Parameter} returnType:Type Scope.
-					Variable = sfVariable prevSymbol:SIZE name:STRING (address:ADDRESS|offset:SIZE) Type.
-					Parameter = sfParameter prevSymbol:SIZE name:STRING offset:SIZE (sfVarPar|sfConstPar|sfValPar) Type.
+					Variable = sfVariable prevSymbol:SIZE name:STRING (sfAbsolute address:ADDRESS| sfIndirect offset:SIZE | sfRelative offset:SIZE) Type.
 					TypeDeclaration = sfTypeDeclaration prevSymbol:SIZE name:STRING td:ADDRESS Scope.
 					Type = 
 						sfTypePointerToRecord 
@@ -11733,6 +11733,7 @@ TYPE
 						| sfTypeMathTensor Type
 						| sfTypeRecord tdAdr:ADDRESS 
 						| sfTypeDelegate {Parameter} return:Type
+						| sfTypePort (sfIN | sfOUT)
 						| sfTypeBOOLEAN
 						| sfTypeCHAR | sfTypeCHAR8 | sfTypeCHAR16 | sfTypeCHAR32
 						| sfTypeSHORTINT | sfTypeINTEGER | sfTypeLONGINT | sfTypeHUGEINT
@@ -11833,11 +11834,11 @@ TYPE
 									Address(section, 0);
 								END;
 						| type: SyntaxTree.PortType DO
-							Char(section, sfTypePortType);
+							Char(section, sfTypePORT);
 							IF type.direction = SyntaxTree.OutPort THEN
-								Char(section, sfOutPort)
+								Char(section, sfOUT)
 							ELSE
-								Char(section, sfInPort)
+								Char(section, sfIN)
 							END;
 						| type: SyntaxTree.ProcedureType DO
 								Char(section, sfTypeDelegate);
@@ -11971,23 +11972,30 @@ TYPE
 				END NType;
 				
 				(*
-					Parameter = sfParameter prevSymbol:SIZE name:STRING offset:SIZE (sfVarPar|sfConstPar|sfValPar) Type.
+					Parameter = sfVariable prevSymbol:SIZE name:STRING (sfIndirec|sfRelative) offset:SIZE Type.
 				*)
 				PROCEDURE NParameter(parameter: SyntaxTree.Parameter; procOffset: LONGINT);
-				VAR pos: LONGINT; 
+				VAR pos: LONGINT; type: SyntaxTree.Type;
 				BEGIN
 					IF RefInfo THEN Info(section, "Parameter") END;
-					Char(section, sfParameter);
+					Char(section, sfVariable);
 					Size(section, procOffset);
 					String0(section, parameter.name);
-					Size(section, ToMemoryUnits(module.system,parameter.offsetInBits));
+					type := parameter.type.resolved;
 					IF parameter.kind = SyntaxTree.VarParameter THEN
-						Char(section, sfVarPar);
+						IF IsOpenArray(type) THEN Char(section, sfRelative)
+						ELSE Char(section, sfIndirect)
+						END;
 					ELSIF parameter.kind = SyntaxTree.ConstParameter THEN
-						Char(section, sfConstPar);
+						IF (type IS SyntaxTree.RecordType) OR IsStaticArray(type) THEN 
+							Char(section, sfIndirect);
+						ELSE
+							Char(section, sfRelative);
+						END;
 					ELSE
-						Char(section, sfValPar);
+						Char(section, sfRelative);
 					END;
+					Size(section, ToMemoryUnits(module.system,parameter.offsetInBits));
 					NType(parameter.type);
 				END NParameter;
 
@@ -12018,7 +12026,7 @@ TYPE
 					IF RefInfo THEN Info(section, "Parameters") END;
 					parameter := procedureType.firstParameter;
 					WHILE(parameter # NIL) DO
-						NParameter(parameter, pos); (*!treat  exceptions !*)
+						NParameter(parameter, pos);
 						parameter := parameter.nextParameter;
 					END;
 					IF RefInfo THEN Info(section, "ReturnType") END;
@@ -12028,7 +12036,7 @@ TYPE
 				END NProcedure;
 				
 				(*
-					Variable = sfVariable prevSymbol:SIZE name:STRING (address:ADDRESS|offset:SIZE) Type.
+					Variable = sfVariable prevSymbol:SIZE name:STRING (sfAbsolute address:ADDRESS| sfRelative offset:SIZE) Type.
 				*)
 				PROCEDURE NVariable(variable: SyntaxTree.Variable; scopeOffset: LONGINT);
 				VAR s: Sections.Section; sn: Basic.SegmentedName; pos: LONGINT; 
@@ -12039,9 +12047,11 @@ TYPE
 					Size(section, scopeOffset); 
 					String0(section, variable.name);
 					IF (variable.scope # NIL) & (variable.scope IS SyntaxTree.ModuleScope) THEN
+						Char(section, sfAbsolute);
 						implementationVisitor.GetCodeSectionNameForSymbol(variable, sn);
 						NamedSymbol(section, sn,variable, 0,0);
 					ELSE
+						Char(section, sfRelative);
 						Size(section, ToMemoryUnits(module.system,variable.offsetInBits));
 					END;
 					NType(variable.type);
@@ -14067,13 +14077,13 @@ END FoxIntermediateBackend.
 
 Compiler.Compile FoxIntermediateBackend.Mod ~
 
-#	Release.Build --path="/temp/obh/" WinAosNewObjectFile ~
-#	StaticLinker.Link --fileFormat=PE32 --fileName=A2H.exe --extension=GofW --displacement=401000H --path="/temp/obh/" Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~
+#	Release.Build --path="/temp/obg/" WinAosNewObjectFile ~
+#	StaticLinker.Link --fileFormat=PE32 --fileName=A2H.exe --extension=GofW --displacement=401000H --path="/temp/obg/" Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~
 FSTools.CloseFiles A2H.exe ~
 
 SystemTools.FreeDownTo FoxIntermediateBackend ~
 
-Compiler.Compile -p=Win32G  --destPath=/temp/obh/
+Compiler.Compile -p=Win32G  --destPath=/temp/obg/
 Runtime.Mod Trace.Mod Generic.Win32.Kernel32.Mod Win32.Machine.Mod Heaps.Mod 
 Generic.Modules.Mod Win32.Objects.Mod Win32.Kernel.Mod KernelLog.Mod Plugins.Mod Streams.Mod Pipes.Mod 
 Commands.Mod I386.Reals.Mod Generic.Reflection.Mod TrapWriters.Mod CRC.Mod SystemVersion.Mod 

+ 49 - 133
source/Generic.Reflection.Mod

@@ -58,30 +58,29 @@ CONST
 	sfTypeMathTensor* = 28X;
 	sfTypeDelegate* = 29X; 
 	sfTypeENUM* = 2AX;
-	sfTypeCell = 2BX;
-	sfTypePort = 2CX;
+	sfTypeCELL = 2BX;
+	sfTypePORT = 2CX;
 	
-	sfInPort = 0X;
-	sfOutPort = 1X;
-
-	sfValPar* = 0X;
-	sfVarPar* = 1X;
-	sfConstPar* = 2X; 
+	sfIN = 0X;
+	sfOUT = 1X;
+	
+	(* variable / parameter addressing modes *)
+	sfAbsolute = 0X; (* global vars *)
+	sfRelative = 1X; (* variables, value parameters *)
+	sfIndirect = 2X; (* var parameters *) 
 
 	sfScopeBegin* = 0F0X;
 	sfScopeEnd* = 0F1X; 
 	sfProcedure* = 0F2X; 
 	sfVariable* = 	0F3X;
-	sfParameter* = 0F4X;
-	sfTypeDeclaration* = 0F5X;
+	sfTypeDeclaration* = 0F4X;
 
 	(*
 		References section format: 
 		
 		Scope = sfScopeBegin {variable:Variable} {procedure:Procedure} {typeDecl:TypeDeclaration} sfScopeEnd
-		Procedure = sfProcedure prevSymbolOffset:SIZE name:String start:ADR end:ADR returnType:Type {parameter:Parameter} Scope
-		Variable = sfVariable prevSymbolOffset:SIZE name:String (address:ADDRESS | offset:SIZE) type:Type 
-		Parameter = sfParameter prevSymbolOffset:SIZE name:String (rfVar | rfConst | rfVal) offset:SIZE type:Type  
+		Procedure = sfProcedure prevSymbolOffset:SIZE name:String start:ADR end:ADR returnType:Type {parameter:Variable} Scope
+		Variable = sfVariable prevSymbolOffset:SIZE name:String (sfRelative offset: SIZE | sfIndirec offset: SIZE | sfAbsolute address:ADDRESS) type:Type 
 		TypeDeclaration = sfTypeDeclaration prevSymbolOffset:SIZE name:String typeInfo:ADR Scope
 	*)
 
@@ -191,7 +190,7 @@ CONST
 		BEGIN
 			IF offset >= 0 THEN
 				c := GetChar(refs, offset);
-				IF (c = sfProcedure) OR (c=sfVariable) OR (c=sfParameter) OR (c=sfTypeDeclaration) THEN
+				IF (c = sfProcedure) OR (c=sfVariable) OR (c=sfTypeDeclaration) THEN
 					Traverse(GetSize(refs, offset));
 				END;
 				IF (n > 0) & (n<LEN(name)) THEN name[n] := "."; INC(n); END;
@@ -266,7 +265,6 @@ CONST
 			END
 		ELSE
 			w.String(mod.name);
-			TRACE(pc);
 			refs := mod.refs;
 			IF FindByAdr(refs, refpos, pc) THEN
 				offset := refpos;
@@ -402,7 +400,7 @@ CONST
 			SYSTEM.GET(adr, sz); Signed(sz); w.String("["); Unsigned(sz, SIZEOF(SIZE)); w.String("]");
 		| sfTypeENUM:
 			SYSTEM.GET(adr, word); Signed(word);
-		| sfTypePort:
+		| sfTypePORT:
 			SYSTEM.GET(adr, a); Unsigned(a, SIZEOF(ADDRESS));
 		ELSE
 			w.String("UNKOWN TYPE "); Unsigned(ORD(type),1);
@@ -480,9 +478,9 @@ CONST
 			WriteType(w,a);
 			w.String(")");
 		| sfTypeDelegate: 
-			WHILE refs[offset] = sfParameter DO SkipParameter(refs, offset) END;
+			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset); 
-		| sfTypePort:
+		| sfTypePORT:
 			WriteBasicValue(w, type, adr, size);
 			SkipChar(offset);
 		ELSE
@@ -492,32 +490,25 @@ CONST
 	END WriteValue;
 		
 	PROCEDURE WriteVariable*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT;  base: ADDRESS);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT;  prevScope: SIZE;
+	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT;  prevScope: SIZE; c: CHAR;
 	BEGIN
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		prevScope := GetSize(refs, offset);
 		GetString(refs, offset, name); 
 		w.String(Sep); w.String(name); w.Char("=");
-		adr := GetSize(refs, offset);
-		IF prevScope <0 THEN (* module scope *)
-			base := 0
+		c := GetChar(refs, offset); 
+		IF c = sfRelative THEN
+			adr := base + GetSize(refs, offset)
+		ELSIF c = sfIndirect THEN
+			adr := base + GetSize(refs, offset);
+			w.Address(adr); w.String("->"); 
+			SYSTEM.GET(adr, adr);
+		ELSE (* absolute *)
+			adr := GetAddress(refs, offset);
 		END;
-		WriteValue(w, refs, offset, adr+base); 
+		WriteValue(w, refs, offset, adr); 
 	END WriteVariable; 
 	
-	PROCEDURE WriteParameter*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT;  base: ADDRESS);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT;  prevScope: SIZE; c: CHAR;
-	BEGIN
-		IF ~Expect(GetChar(refs, offset) = sfParameter) THEN RETURN END;
-		prevScope := GetSize(refs, offset);
-		GetString(refs, offset, name); 
-		w.String(Sep); w.String(name); w.Char("=");
-		adr := GetSize(refs, offset);
-		c := GetChar(refs, offset); (*! check for varpar *)
-		WriteValue(w, refs, offset, adr+base); 
-	END WriteParameter; 
-	
-
 	(* write variables taking meta information from stream in stream at offset, potentially stored at base address
 	 *)
 	PROCEDURE WriteVariables*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; base: ADDRESS);
@@ -530,19 +521,6 @@ CONST
 		IF count > 0 THEN w.Ln; Wait(w); END;
 	END WriteVariables;
 
-	(* write variables taking meta information from stream in stream at offset, potentially stored at base address
-	 *)
-	PROCEDURE WriteParameters*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT; base: ADDRESS);
-	VAR count: LONGINT; 
-	BEGIN
-		WHILE refs[offset] = sfParameter DO
-			WriteParameter(w, refs, offset, base); w.Ln;
-			(*INC(count); *)
-		END; 
-		IF count > 0 THEN w.Ln; Wait(w); END;
-	END WriteParameters;
-
-
 	(* skip type metadata in stream *)
 	PROCEDURE SkipType*(refs: Modules.Bytes; VAR offset: LONGINT);
 	VAR size: SIZE;  adr: LONGINT; c: CHAR;
@@ -560,10 +538,10 @@ CONST
 		| sfTypeMathTensor: SkipType(refs, offset); 
 		| sfTypeRecord: SkipSize(offset);
 		| sfTypeDelegate: 
-			WHILE refs[offset] = sfParameter DO SkipParameter(refs, offset) END;
+			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset);
 		| sfTypeENUM:
-		| sfTypePort: SkipChar(offset);
+		| sfTypePORT: SkipChar(offset);
 		ELSE (* ?? *)
 		END;
 	END SkipType;
@@ -576,22 +554,11 @@ CONST
 		SkipString(refs, offset);
 		SkipAddress(offset);
 		SkipAddress(offset);
-		WHILE (refs[offset] = sfParameter)  DO	SkipParameter(refs, offset) END;
+		WHILE (refs[offset] = sfVariable)  DO	SkipVariable(refs, offset) END;
 		SkipType(refs, offset); 
 		SkipScope(refs, offset);
 	END SkipProcedure;
 
-	(* skip parameter meta data in stream *)
-	PROCEDURE SkipParameter*(refs: Modules.Bytes; VAR offset: LONGINT);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT; c: CHAR;
-	BEGIN
-		IF ~Expect(GetChar(refs, offset) = sfParameter) THEN RETURN END; 	
-		SkipSize(offset);
-		SkipString(refs, offset); 
-		SkipSize(offset);
-		SkipChar(offset);
-		SkipType(refs, offset); 
-	END SkipParameter; 
 
 	(* skip variable metadata in stream *)
 	PROCEDURE SkipVariable*(refs: Modules.Bytes; VAR offset: LONGINT);
@@ -599,7 +566,8 @@ CONST
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		SkipSize(offset);
 		SkipString(refs, offset); 
-		SkipSize(offset);
+		SkipChar(offset);
+		SkipAddress(offset);
 		SkipType(refs, offset); 	
 	END SkipVariable;
 
@@ -657,7 +625,6 @@ CONST
 	PROCEDURE FindInProcedure(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  start, end, pos: LONGINT; 
 	BEGIN
-		TRACE(offset);
 		pos := offset; 
 		IF ~Expect(GetChar(refs, offset) = sfProcedure) THEN RETURN END; 	
 		SkipSize(offset);
@@ -669,41 +636,22 @@ CONST
 			find.pos := pos; 
 			RETURN; 
 		END;
-		WHILE (refs[offset] = sfParameter) DO
+		WHILE (refs[offset] = sfVariable) DO
 			IF find.minLevel <= level THEN
-				FindInParameter(refs, offset, level+1, find);
+				FindInVariable(refs, offset, level+1, find);
 				IF find.found THEN RETURN END;
 			ELSE
-				SkipParameter(refs, offset)
+				SkipVariable(refs, offset)
 			END;
 		END;
 		SkipType(refs, offset); 
 		FindInScope(refs, offset, level+1, find);
 	END FindInProcedure;
 
-	(* find a symbol by name or pc starting from the parameter stream section *)
-	PROCEDURE FindInParameter(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT; c: CHAR; pos: LONGINT;
-	BEGIN
-		TRACE(offset);
-		pos := offset;
-		IF ~Expect(GetChar(refs, offset) = sfParameter) THEN RETURN END; 	
-		SkipSize(offset);
-		FindString(refs, offset, level, find); 
-		IF find.found THEN 
-			find.pos := pos; 
-			RETURN;
-		END;
-		SkipSize(offset);
-		SkipChar(offset); 
-		SkipType(refs, offset); 
-	END FindInParameter; 
-
 	(* find a symbol by name or pc starting from the variable stream section *)
 	PROCEDURE FindInVariable(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  pos: LONGINT; 
 	BEGIN
-		TRACE(offset);
 		pos := offset; 
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;  	
 		SkipSize(offset);
@@ -712,6 +660,7 @@ CONST
 			find.pos := pos; 
 			RETURN;
 		END; 
+		SkipChar(offset);
 		SkipSize(offset);
 		SkipType(refs, offset); 
 	END FindInVariable; 
@@ -720,7 +669,6 @@ CONST
 	PROCEDURE FindInTypeDeclaration(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  adr, pos: LONGINT; 
 	BEGIN
-		TRACE(offset);
 		pos := offset;
 		IF ~Expect(GetChar(refs, offset) = sfTypeDeclaration) THEN RETURN END;
 		SkipSize(offset);
@@ -737,7 +685,6 @@ CONST
 	PROCEDURE FindInScope(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR no,i: LONGINT;
 	BEGIN
-		TRACE(offset);
 		IF ~Expect(GetChar(refs, offset) = sfScopeBegin) THEN RETURN END;
 		WHILE ~find.found &(refs[offset] = sfVariable) &  (find.minLevel <= level) DO (* Variable *)
 			FindInVariable(refs, offset, level, find); 
@@ -818,11 +765,10 @@ CONST
 			m := Modules.ThisModuleByAdr0(pc);
 			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= stacklow) & (bp <= stackhigh) THEN
 				IF CheckHeapAddress( pc ) THEN
-					TRACE(pc);
 					WriteProc0(w, m, pc, bp, refs, offset, base); w.Ln;Wait(w); w.Update;
 					IF long & (~overflow OR (count > 0)) THEN	(* show variables *)
 						IF offset >= 0 THEN 
-							WriteParameters(w,refs,offset, base); 
+							WriteVariables(w,refs,offset, base); 
 							SkipType(refs, offset);
 							IF Expect(GetChar(refs, offset) = sfScopeBegin) THEN
 								WriteVariables(w,refs,offset, base); 
@@ -933,7 +879,7 @@ TYPE
 		| sfTypeRecord: w.String("RECORD ");  w.Address(GetAddress(refs, offset)); 
 		| sfTypeDelegate: 
 			w.String("PROCEDURE ("); 	
-			WHILE refs[offset] = sfParameter DO ReportParameter(w, refs, offset) END;
+			WHILE refs[offset] = sfVariable DO ReportVariable(w, refs, offset) END;
 			w.String("):"); ReportType(w, refs, offset); 
 		| sfTypeBOOLEAN: w.String("BOOLEAN"); 
 		| sfTypeCHAR: w.String("CHAR"); 
@@ -965,7 +911,7 @@ TYPE
 		| sfTypeRANGE: w.String("RANGE"); 
 		| sfTypeADDRESS: w.String("ADDRESS"); 
 		| sfTypeSIZE: w.String("SIZE"); 
-		| sfTypePort: w.String("PORT"); IF GetChar(refs,offset) = sfInPort THEN w.String("IN") ELSE w.String("OUT") END;
+		| sfTypePORT: w.String("PORT"); IF GetChar(refs,offset) = sfIN THEN w.String("IN") ELSE w.String("OUT") END;
 		ELSE w.String("????? TYPE ?????");
 		END;
 	END ReportType;
@@ -982,8 +928,8 @@ TYPE
 		start := GetAddress(refs, offset);
 		end := GetAddress(refs, offset);
 		w.String("("); 
-		WHILE refs[offset] = sfParameter DO
-			ReportParameter(w, refs, offset);
+		WHILE refs[offset] = sfVariable DO
+			ReportVariable(w, refs, offset);
 		END;
 		w.String(")"); 
 		w.String(":"); 
@@ -993,32 +939,9 @@ TYPE
 		ReportScope(w, refs, offset);
 	END ReportProcedure;
 
-	PROCEDURE ReportParameter(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT; c: CHAR;
-	BEGIN
-		w.String(" "); 
-		IF ~Expect(GetChar(refs, offset) = sfParameter) THEN RETURN END; 	
-		SkipSize(offset);
-		GetString(refs, offset, name); 
-		w.String(name); 
-		adr := GetSize(refs, offset);
-		c := GetChar(refs, offset); 	
-		IF c = sfVarPar THEN
-			w.String(" VAR ")
-		ELSIF c = sfConstPar THEN
-			w.String(" CONST ")
-		ELSIF Expect(c = sfValPar) THEN
-		END;
-
-		w.String(":"); 
-		ReportType(w, refs, offset); 
-		w.String("[@"); w.Int(adr,1); w.String("]"); 
-		
-		w.String("; "); 
-	END ReportParameter; 
 
 	PROCEDURE ReportVariable(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT);
-	VAR name: ARRAY 128 OF CHAR;  adr: LONGINT; 
+	VAR name: ARRAY 128 OF CHAR;  adr: ADDRESS;  size: SIZE;
 	BEGIN
 		w.Int(offset,1); w.String(":");
 		w.String("VAR "); 
@@ -1026,10 +949,15 @@ TYPE
 		SkipSize(offset);
 		GetString(refs, offset, name); 
 		w.String(name); 
-		adr := GetSize(refs, offset);
+		IF GetChar(refs, offset) = sfRelative THEN
+			size := GetSize(refs, offset);
+			w.String("[@"); w.Int(size,1); w.String("]");
+		ELSE (* absolute *)
+			adr := GetAddress(refs, offset);
+			w.String("[@"); w.Address(adr); w.String("]");
+		END;
 		w.String(":"); 
 		ReportType(w, refs, offset); 
-		w.String("[@"); w.Int(offset,1); w.String("]");
 		w.Ln;
 	END ReportVariable; 
 
@@ -1078,15 +1006,3 @@ TYPE
 BEGIN
 	modes := " rdy run awl awc awe rip";   (* 4 characters per mode from Objects.Ready to Objects.Terminated *)
 END Reflection.
-
-SystemTools.Free TestReflection ~
-
-TestReflection.TrapMe ~
-TestReflection.Test
-TestReflection.Trace 09454F69H ~
-
-SystemTools.FreeDownTo FoxIntermediateBackend ~
-
-
-#	StaticLinker.Link --fileFormat=PE32 --fileName=A2H.exe --extension=GofW --displacement=401000H Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~
-