Memory Fixes
This commit is contained in:
parent
a0cad251cd
commit
89c84d2cb5
@ -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<Mem.RelAccess> debugVars = new Vector<>();
|
||||
}
|
||||
|
||||
@ -230,12 +230,7 @@ public class Memory {
|
||||
int parOffset = 4; // +SL
|
||||
Vector<Mem.RelAccess> debugPars = new Vector<>();
|
||||
for (AST.ParDef parDef : funDef.pars) {
|
||||
Vector<Integer> 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<Integer> 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<Integer> 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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user