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