2
0
Эх сурвалжийг харах

Made sure that pointers in arrays of ports are registered (if cellsAreObjects)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6831 8c9fc860-2736-0410-a75d-ab315db34111
skoster 9 жил өмнө
parent
commit
5f1a319e3e

+ 4 - 8
source/FoxSemanticChecker.Mod

@@ -2,8 +2,8 @@
 MODULE FoxSemanticChecker; (* AUTHOR "fof & fn"; PURPOSE "Oberon Compiler: Semantic Checker"; *)
 (* (c) fof ETHZ 2009 *)
 
-IMPORT D := Debugging, Basic := FoxBasic, Scanner := FoxScanner, SyntaxTree := FoxSyntaxTree, Parser := FoxParser,
-Diagnostics, Global := FoxGlobal, Printout:= FoxPrintout, Formats := FoxFormats, SYSTEM, Streams, Strings;
+IMPORT D := Debugging, Basic := FoxBasic, Scanner := FoxScanner, SyntaxTree := FoxSyntaxTree, 
+Diagnostics, Global := FoxGlobal, Printout:= FoxPrintout, Formats := FoxFormats, SYSTEM, Strings;
 
 CONST
 	Trace = FALSE;
@@ -749,6 +749,7 @@ TYPE
 		VAR value: LONGINT;
 		BEGIN
 			IF TypeNeedsResolution(x) THEN
+				x.SetCellsAreObjects(cellsAreObjects);
 				x.SetSizeExpression(ResolveExpression(x.sizeExpression));
 				IF (x.sizeExpression # NIL) & CheckPositiveIntegerValue(x.sizeExpression,value,FALSE) THEN
 					x.SetSize(value)
@@ -1046,7 +1047,6 @@ TYPE
 			real: LONGREAL;
 			bool: BOOLEAN;
 			set: SET;
-			variable: SyntaxTree.Variable;
 			v: SyntaxTree.Expression;
 			str: Scanner.StringType;
 			atype: SyntaxTree.ArrayType;
@@ -6495,8 +6495,6 @@ TYPE
 			type: SyntaxTree.Type;
 			name: Basic.SegmentedName;
 			replacement: Replacement;
-			stringReader: Streams.StringReader;
-			scanner: Scanner.Scanner; parser: Parser.Parser;
 		BEGIN
 			IF Trace THEN D.Str("VisitConstant "); D.Str0(constant.name);  D.Ln;  END;
 			IF SymbolNeedsResolution(constant) THEN
@@ -8188,8 +8186,6 @@ TYPE
 			symbol: SyntaxTree.Symbol;
 			prevPhase: LONGINT;
 			prevError : BOOLEAN;
-			type: SyntaxTree.Type;
-			atype : SyntaxTree.ArrayType;
 			
 			PROCEDURE DeclareCell(type: SyntaxTree.CellType);
 			VAR baseType: SyntaxTree.Type; property, prop: SyntaxTree.Property; variable: SyntaxTree.Variable;
@@ -9384,7 +9380,7 @@ TYPE
 		RETURN expression.assignable;
 	END IsVariable;
 
-	PROCEDURE IsVariableParameter (symbol: SyntaxTree.Symbol): BOOLEAN;
+	PROCEDURE IsVariableParameter*(symbol: SyntaxTree.Symbol): BOOLEAN;
 	BEGIN 
 		IF (symbol IS SyntaxTree.Parameter) THEN
 			WITH symbol: SyntaxTree.Parameter DO

+ 15 - 5
source/FoxSyntaxTree.Mod

@@ -9,7 +9,7 @@ MODULE FoxSyntaxTree;   (**  AUTHOR "fof & fn"; PURPOSE "Oberon Compiler: Abstra
 **)
 
 IMPORT
-	Basic := FoxBasic, Scanner := FoxScanner, BitSets, Commands, StringPool, Strings(* , D := Debugging (* only for debuggging / counting *) *) ;
+	Basic := FoxBasic, Scanner := FoxScanner, BitSets, StringPool, Strings(* , D := Debugging (* only for debuggging / counting *) *) ;
 
 CONST
 	(** general flags: used in statements, procedure types and symbols
@@ -48,7 +48,7 @@ CONST
 	SemiDynamic*=4;
 
 	(** node states, important for checker to avoid cycles *)
-	Undefined*={}; BeingResolved*=1; Resolved*=2; FingerPrinted*=3; Warned*=4; RecursionFlag=31;
+	Undefined*={}; BeingResolved*=1; Resolved*=2; FingerPrinted*=3; Warned*=4;
 
 	(* context in which a range expression is used *)
 	ArrayIndex* = 0;
@@ -373,7 +373,6 @@ TYPE
 		END InitQualifiedIdentifier;
 
 		PROCEDURE GetName*(VAR name: Basic.SegmentedName);
-		VAR s: ARRAY 64 OF CHAR;
 		BEGIN
 			Basic.InitSegmentedName(name);
 			IF prefix # invalidIdentifier THEN Basic.SuffixSegmentedName(name, prefix) END;
@@ -1385,6 +1384,7 @@ TYPE
 			direction-: LONGINT;
 			sizeExpression-: Expression; (* generated by parser *)
 			sizeInBits-: LONGINT; (* computed by checker *)
+			cellsAreObjects-: BOOLEAN;
 
 		PROCEDURE & InitPortType(position: LONGINT; direction: LONGINT; sizeExpression: Expression; scope: Scope);
 		BEGIN
@@ -1392,6 +1392,7 @@ TYPE
 			SELF.sizeExpression := sizeExpression;
 			SELF.direction := direction;
 			SELF.scope := scope;
+			cellsAreObjects := FALSE;
 		END InitPortType;
 
 		PROCEDURE SetSize*(size: LONGINT);
@@ -1401,7 +1402,12 @@ TYPE
 		PROCEDURE SetSizeExpression*(sizeExpression: Expression);
 		BEGIN SELF.sizeExpression := sizeExpression
 		END SetSizeExpression;
-
+		
+		PROCEDURE SetCellsAreObjects*(b: BOOLEAN);
+		BEGIN
+			cellsAreObjects := b;
+			hasPointers := b;
+		END SetCellsAreObjects;
 
 		PROCEDURE SameType*(this: Type): BOOLEAN;
 		BEGIN RETURN (this IS PortType) & (this(PortType).direction = direction) & (this(PortType).sizeInBits = sizeInBits)
@@ -1410,6 +1416,10 @@ TYPE
 		PROCEDURE CompatibleTo*(to: Type): BOOLEAN;
 		BEGIN	RETURN SameType(to)
 		END CompatibleTo;
+		
+		PROCEDURE IsPointer(): BOOLEAN;
+		BEGIN RETURN cellsAreObjects;
+		END IsPointer;
 
 		PROCEDURE Accept*(v: Visitor);
 		VAR position: LONGINT;
@@ -4494,7 +4504,7 @@ TYPE
 
 		(** Enter a symbol in the scope, aplhabetically sorted, duplicate = TRUE if multiply identifier *)
 		PROCEDURE EnterSymbol*(symbol: Symbol; VAR duplicate: BOOLEAN);
-		VAR p,q: Symbol; name,nextname: Scanner.StringType;
+		VAR p,q: Symbol;
 		BEGIN
 			ASSERT(symbol.nextSymbol = NIL,101); (* symbol may only be present in one scope at a time ! *)
 			ASSERT(symbol.scope = NIL,102);