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

Add port properties in CONNECT statement.

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

+ 34 - 11
source/FoxIntermediateBackend.Mod

@@ -7261,6 +7261,38 @@ TYPE
 			END;
 		END AppendCellTypeModifiers;
 		
+		PROCEDURE AddPortProperty(modifier: SyntaxTree.Modifier; value: SyntaxTree.Expression);
+		VAR name: ARRAY 256 OF CHAR; op: Operand; 
+		BEGIN
+			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);
+				CallThisChecked(position,"ActiveCellsRuntime","AddPortStringProperty",4,FALSE);
+			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);
+				CallThisChecked(position,"ActiveCellsRuntime","AddPortIntegerProperty",3,FALSE);
+			ELSE
+				CallThisChecked(position,"ActiveCellsRuntime","AddPortFlagProperty",2,FALSE);
+			END;
+		END AddPortProperty;
+		
+		PROCEDURE AddPortProperties(modifier: SyntaxTree.Modifier);
+		BEGIN
+			WHILE modifier # NIL DO
+				AddPortProperty(modifier, modifier.expression);
+				modifier := modifier.nextModifier;
+			END;
+		END AddPortProperties;
+
 		
 		PROCEDURE PushPort(p: SyntaxTree.Expression);
 		VAR op: Operand;
@@ -7268,18 +7300,9 @@ TYPE
 			Evaluate(p, op);
 			Emit(Push(p.position, op.op));
 			ReleaseOperand(op);
-			(*
-			WHILE (p # NIL) & ~(p.type.resolved IS SyntaxTree.CellType) DO
-				p := p(SyntaxTree.Designator).left;
+			IF p IS SyntaxTree.Designator THEN
+			AddPortProperties(p(SyntaxTree.Designator).modifiers)
 			END;
-			IF p # NIL THEN
-				Evaluate(p, op);
-				Emit(Push(p.position, op.op));
-				ReleaseOperand(op);
-			ELSE
-				Emit(Push(-1, nil));
-			END;
-			*)
 		END PushPort;