瀏覽代碼

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 年之前
父節點
當前提交
4de38c56a4
共有 2 個文件被更改,包括 85 次插入159 次删除
  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;
 				sfTypeMathTensor = 28X;
 				sfTypeDelegate = 29X;
 				sfTypeDelegate = 29X;
 				sfTypeENUM = 2AX; 
 				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;
 				sfScopeBegin = 0F0X;
 				sfScopeEnd = 0F1X; 
 				sfScopeEnd = 0F1X; 
 				sfProcedure = 0F2X; 
 				sfProcedure = 0F2X; 
 				sfVariable = 	0F3X;
 				sfVariable = 	0F3X;
-				sfParameter = 0F4X;
-				sfTypeDeclaration = 0F5X;
+				sfTypeDeclaration = 0F4X;
 
 
 				RefInfo = TRUE;
 				RefInfo = TRUE;
 
 
@@ -11719,8 +11720,7 @@ TYPE
 			(*
 			(*
 					Scope = sfScopeBegin {Variable} {Procedure} {TypeDeclaration} sfScopeEnd.
 					Scope = sfScopeBegin {Variable} {Procedure} {TypeDeclaration} sfScopeEnd.
 					Procedure = sfProcedure prevSymbol:SIZE name:STRING from:ADDRESS to:ADDRESS {Parameter} returnType:Type Scope.
 					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.
 					TypeDeclaration = sfTypeDeclaration prevSymbol:SIZE name:STRING td:ADDRESS Scope.
 					Type = 
 					Type = 
 						sfTypePointerToRecord 
 						sfTypePointerToRecord 
@@ -11733,6 +11733,7 @@ TYPE
 						| sfTypeMathTensor Type
 						| sfTypeMathTensor Type
 						| sfTypeRecord tdAdr:ADDRESS 
 						| sfTypeRecord tdAdr:ADDRESS 
 						| sfTypeDelegate {Parameter} return:Type
 						| sfTypeDelegate {Parameter} return:Type
+						| sfTypePort (sfIN | sfOUT)
 						| sfTypeBOOLEAN
 						| sfTypeBOOLEAN
 						| sfTypeCHAR | sfTypeCHAR8 | sfTypeCHAR16 | sfTypeCHAR32
 						| sfTypeCHAR | sfTypeCHAR8 | sfTypeCHAR16 | sfTypeCHAR32
 						| sfTypeSHORTINT | sfTypeINTEGER | sfTypeLONGINT | sfTypeHUGEINT
 						| sfTypeSHORTINT | sfTypeINTEGER | sfTypeLONGINT | sfTypeHUGEINT
@@ -11833,11 +11834,11 @@ TYPE
 									Address(section, 0);
 									Address(section, 0);
 								END;
 								END;
 						| type: SyntaxTree.PortType DO
 						| type: SyntaxTree.PortType DO
-							Char(section, sfTypePortType);
+							Char(section, sfTypePORT);
 							IF type.direction = SyntaxTree.OutPort THEN
 							IF type.direction = SyntaxTree.OutPort THEN
-								Char(section, sfOutPort)
+								Char(section, sfOUT)
 							ELSE
 							ELSE
-								Char(section, sfInPort)
+								Char(section, sfIN)
 							END;
 							END;
 						| type: SyntaxTree.ProcedureType DO
 						| type: SyntaxTree.ProcedureType DO
 								Char(section, sfTypeDelegate);
 								Char(section, sfTypeDelegate);
@@ -11971,23 +11972,30 @@ TYPE
 				END NType;
 				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);
 				PROCEDURE NParameter(parameter: SyntaxTree.Parameter; procOffset: LONGINT);
-				VAR pos: LONGINT; 
+				VAR pos: LONGINT; type: SyntaxTree.Type;
 				BEGIN
 				BEGIN
 					IF RefInfo THEN Info(section, "Parameter") END;
 					IF RefInfo THEN Info(section, "Parameter") END;
-					Char(section, sfParameter);
+					Char(section, sfVariable);
 					Size(section, procOffset);
 					Size(section, procOffset);
 					String0(section, parameter.name);
 					String0(section, parameter.name);
-					Size(section, ToMemoryUnits(module.system,parameter.offsetInBits));
+					type := parameter.type.resolved;
 					IF parameter.kind = SyntaxTree.VarParameter THEN
 					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
 					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
 					ELSE
-						Char(section, sfValPar);
+						Char(section, sfRelative);
 					END;
 					END;
+					Size(section, ToMemoryUnits(module.system,parameter.offsetInBits));
 					NType(parameter.type);
 					NType(parameter.type);
 				END NParameter;
 				END NParameter;
 
 
@@ -12018,7 +12026,7 @@ TYPE
 					IF RefInfo THEN Info(section, "Parameters") END;
 					IF RefInfo THEN Info(section, "Parameters") END;
 					parameter := procedureType.firstParameter;
 					parameter := procedureType.firstParameter;
 					WHILE(parameter # NIL) DO
 					WHILE(parameter # NIL) DO
-						NParameter(parameter, pos); (*!treat  exceptions !*)
+						NParameter(parameter, pos);
 						parameter := parameter.nextParameter;
 						parameter := parameter.nextParameter;
 					END;
 					END;
 					IF RefInfo THEN Info(section, "ReturnType") END;
 					IF RefInfo THEN Info(section, "ReturnType") END;
@@ -12028,7 +12036,7 @@ TYPE
 				END NProcedure;
 				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);
 				PROCEDURE NVariable(variable: SyntaxTree.Variable; scopeOffset: LONGINT);
 				VAR s: Sections.Section; sn: Basic.SegmentedName; pos: LONGINT; 
 				VAR s: Sections.Section; sn: Basic.SegmentedName; pos: LONGINT; 
@@ -12039,9 +12047,11 @@ TYPE
 					Size(section, scopeOffset); 
 					Size(section, scopeOffset); 
 					String0(section, variable.name);
 					String0(section, variable.name);
 					IF (variable.scope # NIL) & (variable.scope IS SyntaxTree.ModuleScope) THEN
 					IF (variable.scope # NIL) & (variable.scope IS SyntaxTree.ModuleScope) THEN
+						Char(section, sfAbsolute);
 						implementationVisitor.GetCodeSectionNameForSymbol(variable, sn);
 						implementationVisitor.GetCodeSectionNameForSymbol(variable, sn);
 						NamedSymbol(section, sn,variable, 0,0);
 						NamedSymbol(section, sn,variable, 0,0);
 					ELSE
 					ELSE
+						Char(section, sfRelative);
 						Size(section, ToMemoryUnits(module.system,variable.offsetInBits));
 						Size(section, ToMemoryUnits(module.system,variable.offsetInBits));
 					END;
 					END;
 					NType(variable.type);
 					NType(variable.type);
@@ -14067,13 +14077,13 @@ END FoxIntermediateBackend.
 
 
 Compiler.Compile FoxIntermediateBackend.Mod ~
 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 ~
 FSTools.CloseFiles A2H.exe ~
 
 
 SystemTools.FreeDownTo FoxIntermediateBackend ~
 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 
 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 
 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 
 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;
 	sfTypeMathTensor* = 28X;
 	sfTypeDelegate* = 29X; 
 	sfTypeDelegate* = 29X; 
 	sfTypeENUM* = 2AX;
 	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;
 	sfScopeBegin* = 0F0X;
 	sfScopeEnd* = 0F1X; 
 	sfScopeEnd* = 0F1X; 
 	sfProcedure* = 0F2X; 
 	sfProcedure* = 0F2X; 
 	sfVariable* = 	0F3X;
 	sfVariable* = 	0F3X;
-	sfParameter* = 0F4X;
-	sfTypeDeclaration* = 0F5X;
+	sfTypeDeclaration* = 0F4X;
 
 
 	(*
 	(*
 		References section format: 
 		References section format: 
 		
 		
 		Scope = sfScopeBegin {variable:Variable} {procedure:Procedure} {typeDecl:TypeDeclaration} sfScopeEnd
 		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
 		TypeDeclaration = sfTypeDeclaration prevSymbolOffset:SIZE name:String typeInfo:ADR Scope
 	*)
 	*)
 
 
@@ -191,7 +190,7 @@ CONST
 		BEGIN
 		BEGIN
 			IF offset >= 0 THEN
 			IF offset >= 0 THEN
 				c := GetChar(refs, offset);
 				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));
 					Traverse(GetSize(refs, offset));
 				END;
 				END;
 				IF (n > 0) & (n<LEN(name)) THEN name[n] := "."; INC(n); END;
 				IF (n > 0) & (n<LEN(name)) THEN name[n] := "."; INC(n); END;
@@ -266,7 +265,6 @@ CONST
 			END
 			END
 		ELSE
 		ELSE
 			w.String(mod.name);
 			w.String(mod.name);
-			TRACE(pc);
 			refs := mod.refs;
 			refs := mod.refs;
 			IF FindByAdr(refs, refpos, pc) THEN
 			IF FindByAdr(refs, refpos, pc) THEN
 				offset := refpos;
 				offset := refpos;
@@ -402,7 +400,7 @@ CONST
 			SYSTEM.GET(adr, sz); Signed(sz); w.String("["); Unsigned(sz, SIZEOF(SIZE)); w.String("]");
 			SYSTEM.GET(adr, sz); Signed(sz); w.String("["); Unsigned(sz, SIZEOF(SIZE)); w.String("]");
 		| sfTypeENUM:
 		| sfTypeENUM:
 			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));
 		ELSE
 		ELSE
 			w.String("UNKOWN TYPE "); Unsigned(ORD(type),1);
 			w.String("UNKOWN TYPE "); Unsigned(ORD(type),1);
@@ -480,9 +478,9 @@ CONST
 			WriteType(w,a);
 			WriteType(w,a);
 			w.String(")");
 			w.String(")");
 		| sfTypeDelegate: 
 		| sfTypeDelegate: 
-			WHILE refs[offset] = sfParameter DO SkipParameter(refs, offset) END;
+			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset); 
 			SkipType(refs, offset); 
-		| sfTypePort:
+		| sfTypePORT:
 			WriteBasicValue(w, type, adr, size);
 			WriteBasicValue(w, type, adr, size);
 			SkipChar(offset);
 			SkipChar(offset);
 		ELSE
 		ELSE
@@ -492,32 +490,25 @@ CONST
 	END WriteValue;
 	END WriteValue;
 		
 		
 	PROCEDURE WriteVariable*(w: Streams.Writer; refs: Modules.Bytes; VAR offset: LONGINT;  base: ADDRESS);
 	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
 	BEGIN
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		prevScope := GetSize(refs, offset);
 		prevScope := GetSize(refs, offset);
 		GetString(refs, offset, name); 
 		GetString(refs, offset, name); 
 		w.String(Sep); w.String(name); w.Char("=");
 		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;
 		END;
-		WriteValue(w, refs, offset, adr+base); 
+		WriteValue(w, refs, offset, adr); 
 	END WriteVariable; 
 	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
 	(* 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);
 	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;
 		IF count > 0 THEN w.Ln; Wait(w); END;
 	END WriteVariables;
 	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 *)
 	(* skip type metadata in stream *)
 	PROCEDURE SkipType*(refs: Modules.Bytes; VAR offset: LONGINT);
 	PROCEDURE SkipType*(refs: Modules.Bytes; VAR offset: LONGINT);
 	VAR size: SIZE;  adr: LONGINT; c: CHAR;
 	VAR size: SIZE;  adr: LONGINT; c: CHAR;
@@ -560,10 +538,10 @@ CONST
 		| sfTypeMathTensor: SkipType(refs, offset); 
 		| sfTypeMathTensor: SkipType(refs, offset); 
 		| sfTypeRecord: SkipSize(offset);
 		| sfTypeRecord: SkipSize(offset);
 		| sfTypeDelegate: 
 		| sfTypeDelegate: 
-			WHILE refs[offset] = sfParameter DO SkipParameter(refs, offset) END;
+			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset);
 			SkipType(refs, offset);
 		| sfTypeENUM:
 		| sfTypeENUM:
-		| sfTypePort: SkipChar(offset);
+		| sfTypePORT: SkipChar(offset);
 		ELSE (* ?? *)
 		ELSE (* ?? *)
 		END;
 		END;
 	END SkipType;
 	END SkipType;
@@ -576,22 +554,11 @@ CONST
 		SkipString(refs, offset);
 		SkipString(refs, offset);
 		SkipAddress(offset);
 		SkipAddress(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); 
 		SkipType(refs, offset); 
 		SkipScope(refs, offset);
 		SkipScope(refs, offset);
 	END SkipProcedure;
 	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 *)
 	(* skip variable metadata in stream *)
 	PROCEDURE SkipVariable*(refs: Modules.Bytes; VAR offset: LONGINT);
 	PROCEDURE SkipVariable*(refs: Modules.Bytes; VAR offset: LONGINT);
@@ -599,7 +566,8 @@ CONST
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;
 		SkipSize(offset);
 		SkipSize(offset);
 		SkipString(refs, offset); 
 		SkipString(refs, offset); 
-		SkipSize(offset);
+		SkipChar(offset);
+		SkipAddress(offset);
 		SkipType(refs, offset); 	
 		SkipType(refs, offset); 	
 	END SkipVariable;
 	END SkipVariable;
 
 
@@ -657,7 +625,6 @@ CONST
 	PROCEDURE FindInProcedure(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	PROCEDURE FindInProcedure(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  start, end, pos: LONGINT; 
 	VAR name: ARRAY 128 OF CHAR;  start, end, pos: LONGINT; 
 	BEGIN
 	BEGIN
-		TRACE(offset);
 		pos := offset; 
 		pos := offset; 
 		IF ~Expect(GetChar(refs, offset) = sfProcedure) THEN RETURN END; 	
 		IF ~Expect(GetChar(refs, offset) = sfProcedure) THEN RETURN END; 	
 		SkipSize(offset);
 		SkipSize(offset);
@@ -669,41 +636,22 @@ CONST
 			find.pos := pos; 
 			find.pos := pos; 
 			RETURN; 
 			RETURN; 
 		END;
 		END;
-		WHILE (refs[offset] = sfParameter) DO
+		WHILE (refs[offset] = sfVariable) DO
 			IF find.minLevel <= level THEN
 			IF find.minLevel <= level THEN
-				FindInParameter(refs, offset, level+1, find);
+				FindInVariable(refs, offset, level+1, find);
 				IF find.found THEN RETURN END;
 				IF find.found THEN RETURN END;
 			ELSE
 			ELSE
-				SkipParameter(refs, offset)
+				SkipVariable(refs, offset)
 			END;
 			END;
 		END;
 		END;
 		SkipType(refs, offset); 
 		SkipType(refs, offset); 
 		FindInScope(refs, offset, level+1, find);
 		FindInScope(refs, offset, level+1, find);
 	END FindInProcedure;
 	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 *)
 	(* 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);
 	PROCEDURE FindInVariable(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  pos: LONGINT; 
 	VAR name: ARRAY 128 OF CHAR;  pos: LONGINT; 
 	BEGIN
 	BEGIN
-		TRACE(offset);
 		pos := offset; 
 		pos := offset; 
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;  	
 		IF ~Expect(GetChar(refs, offset) = sfVariable) THEN RETURN END;  	
 		SkipSize(offset);
 		SkipSize(offset);
@@ -712,6 +660,7 @@ CONST
 			find.pos := pos; 
 			find.pos := pos; 
 			RETURN;
 			RETURN;
 		END; 
 		END; 
+		SkipChar(offset);
 		SkipSize(offset);
 		SkipSize(offset);
 		SkipType(refs, offset); 
 		SkipType(refs, offset); 
 	END FindInVariable; 
 	END FindInVariable; 
@@ -720,7 +669,6 @@ CONST
 	PROCEDURE FindInTypeDeclaration(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	PROCEDURE FindInTypeDeclaration(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR name: ARRAY 128 OF CHAR;  adr, pos: LONGINT; 
 	VAR name: ARRAY 128 OF CHAR;  adr, pos: LONGINT; 
 	BEGIN
 	BEGIN
-		TRACE(offset);
 		pos := offset;
 		pos := offset;
 		IF ~Expect(GetChar(refs, offset) = sfTypeDeclaration) THEN RETURN END;
 		IF ~Expect(GetChar(refs, offset) = sfTypeDeclaration) THEN RETURN END;
 		SkipSize(offset);
 		SkipSize(offset);
@@ -737,7 +685,6 @@ CONST
 	PROCEDURE FindInScope(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	PROCEDURE FindInScope(refs: Modules.Bytes; VAR offset: LONGINT; level: LONGINT; VAR find: Search);
 	VAR no,i: LONGINT;
 	VAR no,i: LONGINT;
 	BEGIN
 	BEGIN
-		TRACE(offset);
 		IF ~Expect(GetChar(refs, offset) = sfScopeBegin) THEN RETURN END;
 		IF ~Expect(GetChar(refs, offset) = sfScopeBegin) THEN RETURN END;
 		WHILE ~find.found &(refs[offset] = sfVariable) &  (find.minLevel <= level) DO (* Variable *)
 		WHILE ~find.found &(refs[offset] = sfVariable) &  (find.minLevel <= level) DO (* Variable *)
 			FindInVariable(refs, offset, level, find); 
 			FindInVariable(refs, offset, level, find); 
@@ -818,11 +765,10 @@ CONST
 			m := Modules.ThisModuleByAdr0(pc);
 			m := Modules.ThisModuleByAdr0(pc);
 			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= stacklow) & (bp <= stackhigh) THEN
 			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= stacklow) & (bp <= stackhigh) THEN
 				IF CheckHeapAddress( pc ) THEN
 				IF CheckHeapAddress( pc ) THEN
-					TRACE(pc);
 					WriteProc0(w, m, pc, bp, refs, offset, base); w.Ln;Wait(w); w.Update;
 					WriteProc0(w, m, pc, bp, refs, offset, base); w.Ln;Wait(w); w.Update;
 					IF long & (~overflow OR (count > 0)) THEN	(* show variables *)
 					IF long & (~overflow OR (count > 0)) THEN	(* show variables *)
 						IF offset >= 0 THEN 
 						IF offset >= 0 THEN 
-							WriteParameters(w,refs,offset, base); 
+							WriteVariables(w,refs,offset, base); 
 							SkipType(refs, offset);
 							SkipType(refs, offset);
 							IF Expect(GetChar(refs, offset) = sfScopeBegin) THEN
 							IF Expect(GetChar(refs, offset) = sfScopeBegin) THEN
 								WriteVariables(w,refs,offset, base); 
 								WriteVariables(w,refs,offset, base); 
@@ -933,7 +879,7 @@ TYPE
 		| sfTypeRecord: w.String("RECORD ");  w.Address(GetAddress(refs, offset)); 
 		| sfTypeRecord: w.String("RECORD ");  w.Address(GetAddress(refs, offset)); 
 		| sfTypeDelegate: 
 		| sfTypeDelegate: 
 			w.String("PROCEDURE ("); 	
 			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); 
 			w.String("):"); ReportType(w, refs, offset); 
 		| sfTypeBOOLEAN: w.String("BOOLEAN"); 
 		| sfTypeBOOLEAN: w.String("BOOLEAN"); 
 		| sfTypeCHAR: w.String("CHAR"); 
 		| sfTypeCHAR: w.String("CHAR"); 
@@ -965,7 +911,7 @@ TYPE
 		| sfTypeRANGE: w.String("RANGE"); 
 		| sfTypeRANGE: w.String("RANGE"); 
 		| sfTypeADDRESS: w.String("ADDRESS"); 
 		| sfTypeADDRESS: w.String("ADDRESS"); 
 		| sfTypeSIZE: w.String("SIZE"); 
 		| 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 ?????");
 		ELSE w.String("????? TYPE ?????");
 		END;
 		END;
 	END ReportType;
 	END ReportType;
@@ -982,8 +928,8 @@ TYPE
 		start := GetAddress(refs, offset);
 		start := GetAddress(refs, offset);
 		end := GetAddress(refs, offset);
 		end := GetAddress(refs, offset);
 		w.String("("); 
 		w.String("("); 
-		WHILE refs[offset] = sfParameter DO
-			ReportParameter(w, refs, offset);
+		WHILE refs[offset] = sfVariable DO
+			ReportVariable(w, refs, offset);
 		END;
 		END;
 		w.String(")"); 
 		w.String(")"); 
 		w.String(":"); 
 		w.String(":"); 
@@ -993,32 +939,9 @@ TYPE
 		ReportScope(w, refs, offset);
 		ReportScope(w, refs, offset);
 	END ReportProcedure;
 	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);
 	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
 	BEGIN
 		w.Int(offset,1); w.String(":");
 		w.Int(offset,1); w.String(":");
 		w.String("VAR "); 
 		w.String("VAR "); 
@@ -1026,10 +949,15 @@ TYPE
 		SkipSize(offset);
 		SkipSize(offset);
 		GetString(refs, offset, name); 
 		GetString(refs, offset, name); 
 		w.String(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(":"); 
 		w.String(":"); 
 		ReportType(w, refs, offset); 
 		ReportType(w, refs, offset); 
-		w.String("[@"); w.Int(offset,1); w.String("]");
 		w.Ln;
 		w.Ln;
 	END ReportVariable; 
 	END ReportVariable; 
 
 
@@ -1078,15 +1006,3 @@ TYPE
 BEGIN
 BEGIN
 	modes := " rdy run awl awc awe rip";   (* 4 characters per mode from Objects.Ready to Objects.Terminated *)
 	modes := " rdy run awl awc awe rip";   (* 4 characters per mode from Objects.Ready to Objects.Terminated *)
 END Reflection.
 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 ~
-