From 89c84d2cb55fd8585d6ebc8393d21726985bc636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Fri, 9 May 2025 11:44:56 +0200 Subject: [PATCH] Memory Fixes --- src/pins25/phase/Memory.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/pins25/phase/Memory.java b/src/pins25/phase/Memory.java index a2d4dc3..3eef7ed 100644 --- a/src/pins25/phase/Memory.java +++ b/src/pins25/phase/Memory.java @@ -206,8 +206,8 @@ public class Memory { } static private class FrameBuilder { - int depth = 0; - int varOffset = 8; // FP + RA + int depth = 1; + int varOffset = -8; // FP + RA Vector debugVars = new Vector<>(); } @@ -230,12 +230,7 @@ public class Memory { int parOffset = 4; // +SL Vector debugPars = new Vector<>(); for (AST.ParDef parDef : funDef.pars) { - Vector inits = new Vector<>(); - inits.add(1); - inits.add(1); - inits.add(1); - inits.add(0); - Mem.RelAccess access = new Mem.RelAccess(parOffset, frameBuilder.depth, 4, inits, parDef.name); + Mem.RelAccess access = new Mem.RelAccess(parOffset, frameBuilder.depth, 4, null, parDef.name); parOffset += access.size; debugPars.add(access); attrAST.attrParAccess.put(parDef, access); @@ -247,7 +242,7 @@ public class Memory { funDef.name, frameBuilder.depth, parOffset, - frameBuilder.varOffset, + -frameBuilder.varOffset, debugPars, frameBuilder.debugVars ); @@ -260,35 +255,40 @@ public class Memory { public FrameBuilder visit(AST.VarDef varDef, FrameBuilder frameBuilder) { Vector inits = new Vector<>(); inits.add(varDef.inits.size()); + int size = 0; for (AST.Init init : varDef.inits) { Report.Locatable valLoc = attrAST.attrLoc.get(init.value); Report.Locatable numLoc = attrAST.attrLoc.get(init.num); - inits.add(decodeIntConst(init.num, numLoc)); + int num = decodeIntConst(init.num, numLoc); + inits.add(num); switch (init.value.type) { case INTCONST: inits.add(1); inits.add(decodeIntConst(init.value, valLoc)); + size += 4 * num; break; case CHRCONST: inits.add(1); inits.add(decodeChrConst(init.value, valLoc)); + size += 4 * num; break; case STRCONST: Vector str = decodeStrConst(init.value, valLoc); inits.add(str.size()); inits.addAll(str); + size += 4 * str.size() * num; break; } } if (frameBuilder == null) { - Mem.AbsAccess access = new Mem.AbsAccess(varDef.name, inits.size(), inits); + Mem.AbsAccess access = new Mem.AbsAccess(varDef.name, size, inits); attrAST.attrVarAccess.put(varDef, access); } else { - Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset, frameBuilder.depth, inits.size(), inits, varDef.name); - frameBuilder.varOffset += inits.size(); + Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset - size, frameBuilder.depth, size, inits, varDef.name); + frameBuilder.varOffset -= inits.size(); frameBuilder.debugVars.add(access); attrAST.attrVarAccess.put(varDef, access); }