Przeglądaj źródła

Added port properties (e.g. for port grouping)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6353 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 lat temu
rodzic
commit
f1b06ccbb9
2 zmienionych plików z 59 dodań i 10 usunięć
  1. 57 9
      source/FoxIntermediateBackend.Mod
  2. 2 1
      source/FoxSemanticChecker.Mod

+ 57 - 9
source/FoxIntermediateBackend.Mod

@@ -6582,6 +6582,51 @@ TYPE
 				END;
 			END Parameter;
 			
+			PROCEDURE AddPortProperty(port: SyntaxTree.Variable; modifier: SyntaxTree.Modifier; value: SyntaxTree.Expression);
+		VAR par: ActiveCells.Parameter; name: ARRAY 256 OF CHAR; op: Operand;  left, d: SyntaxTree.Designator;
+		BEGIN
+				Field(variable, op);
+				(*left := SyntaxTree.NewSymbolDesignator(-1,left,cell); left.SetType(system.anyType);
+				left := SyntaxTree.NewDereferenceDesignator(-1, left); left.SetType(x);
+				d := SyntaxTree.NewSymbolDesignator(-1, left, variable); d.SetType(variable.type);
+				Designate(d, op);*)
+				ToMemory(op.op,addressType,0);
+				Emit(Push(-1, op.op));
+				ReleaseOperand(op);			
+					
+				Basic.GetString(modifier.identifier, name);
+				PushConstString(name);
+
+				IF SemanticChecker.IsStringType(modifier.expression.type) THEN 
+					ASSERT(SemanticChecker.IsStringType(value.type));
+					Designate(value, op);
+					Emit(Push(modifier.position, op.tag));
+					Emit(Push(modifier.position, op.op));
+					ReleaseOperand(op);
+					CallThis(position,"ActiveCellsRuntime","AddPortStringProperty",5);
+				ELSIF (modifier.expression.type.resolved IS SyntaxTree.IntegerType) THEN
+					ASSERT(value.type.resolved IS SyntaxTree.IntegerType);
+					Evaluate(value, op); 
+					Emit(Push(modifier.position, op.op));
+					ReleaseOperand(op);
+					CallThis(position,"ActiveCellsRuntime","AddPortIntegerProperty",4);
+				ELSE
+					CallThis(position,"ActiveCellsRuntime","AddPortFlagProperty",3);
+				END;
+		END AddPortProperty;
+		
+		PROCEDURE AddPortProperties(variable: SyntaxTree.Variable);
+		VAR modifier: SyntaxTree.Modifier;
+		BEGIN
+			modifier := variable.modifiers;
+			WHILE modifier # NIL DO
+				AddPortProperty(variable,modifier, modifier.expression);
+				modifier := modifier.nextModifier;
+			END;
+		END AddPortProperties;
+		
+
+			
 			PROCEDURE Variable(name: ARRAY OF CHAR; variable: SyntaxTree.Variable);
 			VAR op : Operand; portType: SyntaxTree.PortType; d, left: SyntaxTree.Designator; baseType: SyntaxTree.Type; prevScope: SyntaxTree.Scope;
 				size, reg: IntermediateCode.Operand; dim: LONGINT;
@@ -6637,6 +6682,7 @@ TYPE
 				
 				IF variable.type IS SyntaxTree.PortType THEN
 					CallThis(variable.position,"ActiveCellsRuntime","AddPort",6);
+					AddPortProperties(variable);
 				ELSIF variable.type IS SyntaxTree.ArrayType THEN
 					IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 					size :=  IntermediateCode.Immediate(addressType, ToMemoryUnits(system,6*addressType.sizeInBits));
@@ -6792,6 +6838,8 @@ TYPE
 				END;
 		END AddProperty;
 		
+
+		
 		
 		PROCEDURE AddProperties(cellType: SyntaxTree.CellType; cell: SyntaxTree.Symbol; property: SyntaxTree.Property);
 		BEGIN
@@ -8038,17 +8086,17 @@ TYPE
 						ReleaseIntermediateOperand(pointer);*)
 					END;
 					
+					Symbol(temporaryVariable,l); (*Designate(temporaryVariable,l)*)
+					ToMemory(l.op, addressType, 0);
+					Designate(p0,s0);
+					ToMemory(s0.op,addressType,0);
+					Emit(Mov(position,s0.op,l.op));
+					ReleaseOperand(l);
+					ReleaseOperand(s0);
+					result.tag := emptyOperand;					
+
 					(* start *)
 					IF baseType(SyntaxTree.CellType).cellScope.bodyProcedure # NIL THEN
-						Symbol(temporaryVariable,l); (*Designate(temporaryVariable,l)*)
-						ToMemory(l.op, addressType, 0);
-						Designate(p0,s0);
-						ToMemory(s0.op,addressType,0);
-						Emit(Mov(position,s0.op,l.op));
-						ReleaseOperand(l);
-						ReleaseOperand(s0);
-						result.tag := emptyOperand;					
-						
 						(* push cell *)
 						Symbol(temporaryVariable, l);
 						ToMemory(l.op,addressType,0);

+ 2 - 1
source/FoxSemanticChecker.Mod

@@ -6485,7 +6485,7 @@ TYPE
 					IF HasValue(modifiers, Global.NameCodeMemorySize, position, value) THEN END;
 					IF HasValue(modifiers, Global.NameDataMemorySize, position, value) THEN END;
 				END;
-				CheckModifiers(modifiers, ~InCellNetScope(variable.scope) & ~(variable.type.resolved IS SyntaxTree.CellType));
+				CheckModifiers(modifiers, ~InCellNetScope(variable.scope) & ~(variable.type.resolved IS SyntaxTree.CellType) & ~(variable.type.resolved IS SyntaxTree.PortType));
 				IF variable.initializer # NIL THEN
 					variable.SetInitializer (CompatibleConversion (variable.initializer.position, ConstantExpression(variable.initializer), variable.type));
 				END;
@@ -8031,6 +8031,7 @@ TYPE
 					variable := SyntaxTree.NewVariable(parameter.position, parameter.name);
 					variable.SetType(parameter.type);
 					variable.SetAccess(SyntaxTree.Hidden);
+					variable.SetModifiers(parameter.modifiers);
 					currentScope.PushVariable(variable);
 					(*
 					Register(parameter,scope, FALSE);