Memory Fixes
This commit is contained in:
parent
a0cad251cd
commit
89c84d2cb5
@ -206,8 +206,8 @@ public class Memory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static private class FrameBuilder {
|
static private class FrameBuilder {
|
||||||
int depth = 0;
|
int depth = 1;
|
||||||
int varOffset = 8; // FP + RA
|
int varOffset = -8; // FP + RA
|
||||||
Vector<Mem.RelAccess> debugVars = new Vector<>();
|
Vector<Mem.RelAccess> debugVars = new Vector<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,12 +230,7 @@ public class Memory {
|
|||||||
int parOffset = 4; // +SL
|
int parOffset = 4; // +SL
|
||||||
Vector<Mem.RelAccess> debugPars = new Vector<>();
|
Vector<Mem.RelAccess> debugPars = new Vector<>();
|
||||||
for (AST.ParDef parDef : funDef.pars) {
|
for (AST.ParDef parDef : funDef.pars) {
|
||||||
Vector<Integer> inits = new Vector<>();
|
Mem.RelAccess access = new Mem.RelAccess(parOffset, frameBuilder.depth, 4, null, parDef.name);
|
||||||
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);
|
|
||||||
parOffset += access.size;
|
parOffset += access.size;
|
||||||
debugPars.add(access);
|
debugPars.add(access);
|
||||||
attrAST.attrParAccess.put(parDef, access);
|
attrAST.attrParAccess.put(parDef, access);
|
||||||
@ -247,7 +242,7 @@ public class Memory {
|
|||||||
funDef.name,
|
funDef.name,
|
||||||
frameBuilder.depth,
|
frameBuilder.depth,
|
||||||
parOffset,
|
parOffset,
|
||||||
frameBuilder.varOffset,
|
-frameBuilder.varOffset,
|
||||||
debugPars,
|
debugPars,
|
||||||
frameBuilder.debugVars
|
frameBuilder.debugVars
|
||||||
);
|
);
|
||||||
@ -260,35 +255,40 @@ public class Memory {
|
|||||||
public FrameBuilder visit(AST.VarDef varDef, FrameBuilder frameBuilder) {
|
public FrameBuilder visit(AST.VarDef varDef, FrameBuilder frameBuilder) {
|
||||||
Vector<Integer> inits = new Vector<>();
|
Vector<Integer> inits = new Vector<>();
|
||||||
inits.add(varDef.inits.size());
|
inits.add(varDef.inits.size());
|
||||||
|
int size = 0;
|
||||||
for (AST.Init init : varDef.inits) {
|
for (AST.Init init : varDef.inits) {
|
||||||
Report.Locatable valLoc = attrAST.attrLoc.get(init.value);
|
Report.Locatable valLoc = attrAST.attrLoc.get(init.value);
|
||||||
Report.Locatable numLoc = attrAST.attrLoc.get(init.num);
|
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) {
|
switch (init.value.type) {
|
||||||
case INTCONST:
|
case INTCONST:
|
||||||
inits.add(1);
|
inits.add(1);
|
||||||
inits.add(decodeIntConst(init.value, valLoc));
|
inits.add(decodeIntConst(init.value, valLoc));
|
||||||
|
size += 4 * num;
|
||||||
break;
|
break;
|
||||||
case CHRCONST:
|
case CHRCONST:
|
||||||
inits.add(1);
|
inits.add(1);
|
||||||
inits.add(decodeChrConst(init.value, valLoc));
|
inits.add(decodeChrConst(init.value, valLoc));
|
||||||
|
size += 4 * num;
|
||||||
break;
|
break;
|
||||||
case STRCONST:
|
case STRCONST:
|
||||||
Vector<Integer> str = decodeStrConst(init.value, valLoc);
|
Vector<Integer> str = decodeStrConst(init.value, valLoc);
|
||||||
inits.add(str.size());
|
inits.add(str.size());
|
||||||
inits.addAll(str);
|
inits.addAll(str);
|
||||||
|
size += 4 * str.size() * num;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frameBuilder == null) {
|
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);
|
attrAST.attrVarAccess.put(varDef, access);
|
||||||
} else {
|
} else {
|
||||||
Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset, frameBuilder.depth, inits.size(), inits, varDef.name);
|
Mem.RelAccess access = new Mem.RelAccess(frameBuilder.varOffset - size, frameBuilder.depth, size, inits, varDef.name);
|
||||||
frameBuilder.varOffset += inits.size();
|
frameBuilder.varOffset -= inits.size();
|
||||||
frameBuilder.debugVars.add(access);
|
frameBuilder.debugVars.add(access);
|
||||||
attrAST.attrVarAccess.put(varDef, access);
|
attrAST.attrVarAccess.put(varDef, access);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user