Explorar el Código

added support for static arrays of ports in ActiveCells3

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6519 8c9fc860-2736-0410-a75d-ab315db34111
felixf hace 9 años
padre
commit
5d63ddb4a0
Se han modificado 2 ficheros con 20 adiciones y 6 borrados
  1. 16 4
      source/FoxIntermediateBackend.Mod
  2. 4 2
      source/FoxSemanticChecker.Mod

+ 16 - 4
source/FoxIntermediateBackend.Mod

@@ -6741,16 +6741,20 @@ TYPE
 			
 			PROCEDURE Variable(name: ARRAY OF CHAR; variable: SyntaxTree.Variable);
 			VAR op : Operand; portType: SyntaxTree.PortType; baseType: SyntaxTree.Type; 
-				size, reg: IntermediateCode.Operand; dim: LONGINT;
+				size, reg: IntermediateCode.Operand; dim, len: LONGINT;
 				
 				PROCEDURE PushLens(type: SyntaxTree.Type);
 				BEGIN
-					IF type IS SyntaxTree.ArrayType THEN
+					IF IsSemiDynamicArray(type) THEN
 						PushLens(type(SyntaxTree.ArrayType).arrayBase.resolved);
 						Evaluate(type(SyntaxTree.ArrayType).length, op);
 						Emit(Push(-1, op.op));
 						ReleaseOperand(op);
 						INC(dim);
+					ELSIF IsStaticArray(type) THEN
+						len := len * type(SyntaxTree.ArrayType).staticLength;
+						PushLens(type(SyntaxTree.ArrayType).arrayBase.resolved);
+						INC(dim);
 					ELSE
 						baseType := type;
 					END;
@@ -6761,6 +6765,7 @@ TYPE
 					IF variable.type IS SyntaxTree.ArrayType THEN
 						type := variable.type;
 						dim := 0; 
+						len := 1;
 						PushLens(type);
 						portType := baseType.resolved(SyntaxTree.PortType);
 					ELSE
@@ -6768,7 +6773,10 @@ TYPE
 					END;
 					
 					PushSelfPointer();
-				(* port *)
+				(* port / array of ports *)
+					IF IsStaticArray(type) THEN
+						PushConstInteger(len);
+					END;
 					Field(variable, op);
 					(*left := SyntaxTree.NewSymbolDesignator(-1,left,cell); left.SetType(system.anyType);
 					left := SyntaxTree.NewDereferenceDesignator(-1, left); left.SetType(x);
@@ -6786,7 +6794,9 @@ TYPE
 				IF variable.type IS SyntaxTree.PortType THEN
 					CallThis(variable.position,"ActiveCellsRuntime","AddPort",6);
 					AddPortProperties(variable);
-				ELSIF variable.type IS SyntaxTree.ArrayType THEN
+				ELSIF IsStaticArray(type)THEN
+					CallThis(variable.position,"ActiveCellsRuntime","AddStaticPortArray",7);
+				ELSIF IsSemiDynamicArray(type) THEN
 					IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 					size :=  IntermediateCode.Immediate(addressType, ToMemoryUnits(system,6*addressType.sizeInBits));
 					Emit(Add(position,reg, sp, size));
@@ -6798,6 +6808,8 @@ TYPE
 					CallThis(position,"ActiveCellsRuntime","AddPortArray",8);
 					size :=  IntermediateCode.Immediate(addressType, ToMemoryUnits(system,dim*addressType.sizeInBits));
 					Emit(Add(position, sp,sp, size));
+				ELSE
+					HALT(100);
 				END;
 			END Variable;
 			

+ 4 - 2
source/FoxSemanticChecker.Mod

@@ -1142,9 +1142,11 @@ TYPE
 					type := parameter.type.resolved;
 					IF ~(type IS SyntaxTree.PortType) THEN
 						WHILE IsStaticArray(type, type, len) DO
-
+							IF IsDynamicArray(type, type) THEN Error(parameter.position, Diagnostics.Invalid, "invalid mixture of dynamic and static array of ports") END;
+						END;
+						WHILE IsDynamicArray(type, type) DO 
+							IF IsStaticArray(type, type, len) THEN Error(parameter.position, Diagnostics.Invalid, "invalid mixture of dynamic and static array of ports") END;
 						END;
-						WHILE IsDynamicArray(type, type) DO END;
 						IF (* ~IsStaticArray(type,type,len) OR*)  ~(type IS SyntaxTree.PortType) THEN
 							Error(parameter.position, Diagnostics.Invalid, "invalid type, must be port or static array of port ");
 						END;