Browse Source

Activate Heaps.NewArray

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7196 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 năm trước cách đây
mục cha
commit
3539a5dc6e
1 tập tin đã thay đổi với 20 bổ sung11 xóa
  1. 20 11
      source/FoxIntermediateBackend.Mod

+ 20 - 11
source/FoxIntermediateBackend.Mod

@@ -8031,22 +8031,24 @@ TYPE
 					END;
 					END;
 				ELSIF (type IS SyntaxTree.PointerType) & (type(SyntaxTree.PointerType).pointerBase.resolved IS SyntaxTree.ArrayType)  THEN
 				ELSIF (type IS SyntaxTree.PointerType) & (type(SyntaxTree.PointerType).pointerBase.resolved IS SyntaxTree.ArrayType)  THEN
 					type := type(SyntaxTree.PointerType).pointerBase.resolved;
 					type := type(SyntaxTree.PointerType).pointerBase.resolved;
-					IF FALSE THEN  (* simpler version *)
+					IF TRUE THEN  (* simpler version *)
 						(* 
 						(* 
 						 	push len0
 						 	push len0
 						 	push len1
 						 	push len1
 						 	push len2
 						 	push len2
-						 	
-						 	push size
+						 	push len_size
 						 	push len_adr
 						 	push len_adr
-						 	push element_size
-						 	push tag
+
+							push tag
+						 	push static elements
+						 	push element size
 						 	push adr
 						 	push adr
 						*)
 						*)
 
 
 						dim := 0;
 						dim := 0;
 
 
 						FOR i := x.parameters.Length()-1 TO firstPar BY -1 DO
 						FOR i := x.parameters.Length()-1 TO firstPar BY -1 DO
+							type := type(SyntaxTree.ArrayType).arrayBase.resolved;
 							parameter := x.parameters.GetExpression(i);
 							parameter := x.parameters.GetExpression(i);
 							Evaluate(parameter,r);
 							Evaluate(parameter,r);
 							IF (r.op.mode # IntermediateCode.ModeImmediate) & ~isUnchecked THEN
 							IF (r.op.mode # IntermediateCode.ModeImmediate) & ~isUnchecked THEN
@@ -8066,12 +8068,16 @@ TYPE
 
 
 						openDim := dim;
 						openDim := dim;
 
 
-						baseType := SemanticChecker.ArrayBase(type,openDim);
-						staticLength := ToMemoryUnits(system,system.AlignedSizeOf(baseType));
-						Emit(Push(position, IntermediateCode.Immediate(sizeType, staticLength)));
 
 
-						IF SemanticChecker.ContainsPointer(baseType) THEN
-							tmp := TypeDescriptorAdr(baseType);
+						staticLength := 1;
+						IF type IS SyntaxTree.ArrayType THEN
+							WHILE (type IS SyntaxTree.ArrayType) DO (* static array *)
+								staticLength := staticLength * type(SyntaxTree.ArrayType).staticLength;
+								type := type(SyntaxTree.ArrayType).arrayBase.resolved;
+							END;
+						END;
+						IF SemanticChecker.ContainsPointer(type) THEN
+							tmp := TypeDescriptorAdr(type);
 							IF ~newObjectFile THEN
 							IF ~newObjectFile THEN
 								IntermediateCode.MakeMemory(tmp,addressType);
 								IntermediateCode.MakeMemory(tmp,addressType);
 							END;
 							END;
@@ -8079,13 +8085,16 @@ TYPE
 							tmp := nil;
 							tmp := nil;
 						END;
 						END;
 						Emit(Push(position,tmp)); (* type descriptor *)
 						Emit(Push(position,tmp)); (* type descriptor *)
+						Emit(Push(position, IntermediateCode.Immediate(sizeType, staticLength))); (* static length *)
+						staticLength := ToMemoryUnits(system,system.AlignedSizeOf(type));
+						Emit(Push(position, IntermediateCode.Immediate(sizeType, staticLength))); (* element size *)
 
 
 						
 						
 						Designate(p0,l);
 						Designate(p0,l);
 						Emit(Push(position,l.op)); (* address *)
 						Emit(Push(position,l.op)); (* address *)
 						ReleaseOperand(l);
 						ReleaseOperand(l);
 
 
-						CallThis(position,"Heaps","NewArray", 5);
+						CallThis(position,"Heaps","NewArray", 6);
 						
 						
 						tmp := IntermediateCode.Immediate(addressType,ToMemoryUnits(system,dim*system.addressSize));
 						tmp := IntermediateCode.Immediate(addressType,ToMemoryUnits(system,dim*system.addressSize));
 						Emit(Add(position,sp,sp,tmp));
 						Emit(Add(position,sp,sp,tmp));