Преглед на файлове

improved reflection

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6788 8c9fc860-2736-0410-a75d-ab315db34111
felixf преди 9 години
родител
ревизия
43cd42d212
променени са 3 файла, в които са добавени 24 реда и са изтрити 13 реда
  1. BIN
      WinAos/A2.exe
  2. 0 1
      source/FoxCompiler.Mod
  3. 24 12
      source/Generic.Reflection.Mod

BIN
WinAos/A2.exe


+ 0 - 1
source/FoxCompiler.Mod

@@ -94,7 +94,6 @@ TYPE
 		printer: Printout.Printer;
 		system: Global.System;
 		generatedModule: Formats.GeneratedModule;
-		name: SyntaxTree.IdentifierString;
 		split: Strings.StringArray;
 		sectionOffset: LONGINT;
 		flags: SET;

+ 24 - 12
source/Generic.Reflection.Mod

@@ -423,7 +423,8 @@ CONST
 		IF maxLen > MaxString THEN maxLen := MaxString END; 
 		w.Char('"');
 		LOOP
-			IF (maxLen <= 0) OR ~OnHeapOrStack(adr, low, high) THEN EXIT END;
+			IF (maxLen <= 0) OR ~OnHeapOrStack(adr, low, high) THEN
+			 EXIT END;
 			SYSTEM.GET(adr, ch);
 			IF (ch < " ") OR (ch > "~") THEN EXIT END;
 			w.Char(ch);
@@ -439,43 +440,52 @@ CONST
 		type := GetChar(refs, offset);
 		CASE type OF
 			sfTypeNone:
+			w.String("NONE");
 		| sfTypePointerToRecord, sfTypeANY, sfTypeOBJECT:
 			WriteBasicValue(w,type, adr, size);
 			SYSTEM.GET(adr, a);
-			IF CheckHeapAddress(a) THEN
+			IF a = 0 THEN
+				w.String("NIL");
+			ELSIF CheckHeapAddress(a) THEN
 				SYSTEM.GET(a + Heaps.TypeDescOffset, a);
 				w.String(" (");
 				WriteType(w,a);
 				w.String(")");
+			ELSE
+				w.String("(UNKNOWN)");
 			END;
 		| sfTypePointerToArray: 
 			WriteBasicValue(w, sfTypeANY, adr, size);
-			w.String("->");
 			SYSTEM.GET(adr, a);
-			WriteValue(w,refs,offset, a, low,high);
-			(*SkipType(refs, offset);*)
+			IF ~OnHeapOrStack(a,low,high) THEN w.String(" (INVALID)") END;
+			SkipType(refs, offset)
 		| sfTypeOpenArray: 
-			IF refs[offset] = sfTypeCHAR THEN (* ARRAY OF CHAR *)
-				WriteValueString(w, adr, MaxString, low, high);
+			IF (refs[offset] = sfTypeCHAR) OR (refs[offset] = sfTypeCHAR8)  THEN (* ARRAY OF CHAR *)
+				SYSTEM.GET(adr, a);
+				WriteValueString(w, a, MaxString, low, high);
+			ELSE
+				w.String("... (NO STRING)")
 			END;
 			SkipType(refs, offset);
 		| sfTypeStaticArray: 
 			len := GetSize(refs, offset); 
-			IF refs[offset] = sfTypeCHAR THEN (* ARRAY x OF CHAR *)
+			IF (refs[offset] = sfTypeCHAR)  OR (refs[offset] = sfTypeCHAR8) THEN (* ARRAY x OF CHAR *)
 				WriteValueString(w, adr, len, low, high);
+			ELSE
+				w.String("... (NO STRING)");
 			END;
 			SkipType(refs, offset);
 		| sfTypeDynamicArray: 
-			w.String("...");
+			w.String("... (DYNAMIC ARRAY)");
 			SkipType(refs, offset); 
 		| sfTypeMathOpenArray: 
-			w.String("...");
+			w.String("... (MATH OPEN ARRAY)");
 			SkipType(refs, offset);
 		| sfTypeMathStaticArray: 
-			w.String("...");
+			w.String("... (MATH STATIC ARRAY)");
 			SkipSize(offset); SkipType(refs, offset);
 		| sfTypeMathTensor: 
-			w.String("...");
+			w.String("...(MATH TENSOR)");
 			SkipType(refs, offset); 
 		| sfTypeRecord: 
 			w.String("...");
@@ -484,6 +494,7 @@ CONST
 			WriteType(w,a);
 			w.String(")");
 		| sfTypeDelegate: 
+			w.String("(DELEGATE)");
 			WHILE refs[offset] = sfVariable DO SkipVariable(refs, offset) END;
 			SkipType(refs, offset); 
 		| sfTypePORT:
@@ -1097,3 +1108,4 @@ BEGIN
 END Reflection.
 
 
+StaticLinker.Link --fileFormat=PE32 --fileName=A2.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 ~