Browse Source

Minimal improvement - not yet working for complex return type in inlined procedure

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7005 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 years ago
parent
commit
bcb1f961ba
1 changed files with 8 additions and 5 deletions
  1. 8 5
      source/FoxIntermediateBackend.Mod

+ 8 - 5
source/FoxIntermediateBackend.Mod

@@ -10630,8 +10630,8 @@ TYPE
 					statement := x.outRules.GetStatement(i);
 					IF statement IS SyntaxTree.StatementBlock THEN statement := statement(SyntaxTree.StatementBlock).statements.GetStatement(0) END;
 					WITH statement: SyntaxTree.Assignment DO
-						Evaluate(statement.left, operand); (*?? or designate *)
-						result := operand.op;
+						Designate(statement.left, operand); 
+						MakeMemory(result, operand.op, IntermediateCode.GetType(system,statement.left.type) , 0);
 						NEW(str, 64);
 						Basic.GetString(statement.right(SyntaxTree.IdentifierDesignator).identifier, str^);
 						out[i] := result; IntermediateCode.SetString(out[i], str);
@@ -10641,8 +10641,10 @@ TYPE
 						Basic.GetString(statement.returnValue(SyntaxTree.IdentifierDesignator).identifier, str^);
 						IF currentIsInline THEN
 							map := currentMapper.Get(NIL);
-							Evaluate(map.to, operand);
-							out[i] := operand.op;
+							Designate(map.to, operand); 
+							MakeMemory(result, operand.op, IntermediateCode.GetType(system,map.to.type) , 0);
+							(*Evaluate(map.to, operand);*)
+							out[i] := result;
 						ELSE
 							out[i] :=NewRegisterOperand(IntermediateCode.GetType(system, procedureType.returnType));
 						END;
@@ -10664,10 +10666,11 @@ TYPE
 				FOR i := 0 TO LEN(out)-1 DO
 					WITH statement: SyntaxTree.Assignment DO
 						ReleaseIntermediateOperand(out[i]);
-					ELSE
+					|statement: SyntaxTree.ReturnStatement DO
 						IF currentIsInline THEN
 							ReleaseIntermediateOperand(out[i]);
 						END;
+					ELSE
 					END;
 					statement := x.outRules.GetStatement(i);
 				END;