diff --git a/sources/zweic/Generator.scala b/sources/zweic/Generator.scala index b48b210..5c4fc26 100644 --- a/sources/zweic/Generator.scala +++ b/sources/zweic/Generator.scala @@ -38,10 +38,7 @@ code.emit(BEQ,ZERO,init); // go initialize the VMTs - // ... � compl�ter ... - val tmpLabel = code.getLabel(); - code.anchorLabel(tmpLabel); - var offset = tmpLabel.getAnchor(); + var offset = code.pc(); for ( val c <- classes ) { c.name.sym.offset = offset; offset = offset + c.name.sym.asInstanceOf[ClassSymbol].allMethods.length*4; @@ -110,31 +107,31 @@ case FieldDecl(_) => ; case method @ MethodDef(name, params, _, body) => - // TODO ? - // ... � compl�ter ... - val tmpLabel = code.getLabel(); - code.anchorLabel(tmpLabel); - name.sym.asInstanceOf[MethodSymbol].address = tmpLabel.getAnchor(); - - //TODO generato method code + val oldFrameSize = code.getFrameSize(); + code.decFrameSize(oldFrameSize); + code.incFrameSize(params.length*4+4); + code.emit(PSH, LNK, SP, 4); - //(emitLoadConstant(tmpReg, params.length*4); + code.incFrameSize(4); - //var regList = Nil; - //var offset = 0; - - //for ( val Formal(name, _) <- params ) { - // code.getRegister()::regList; - // code.emit(POP, regList.head, SP, 4); - // name.sym.offset = offset; - // offset += 4; - //} + name.sym.asInstanceOf[MethodSymbol].address = code.pc(); + gen(body); - //regList.foreach(code.freeRegister); + code.emit(SUBI, SP, SP, code.getFrameSize() - 4+4+4*params.length ); + code.decFrameSize(code.getFrameSize() - 4+4+4*params.length); + code.emit(POP, LNK, SP, 4); + code.decFrameSize(4); + + code.emit(SUBI, SP, SP, params.length*4+4); + code.decFrameSize(code.getFrameSize()); + code.incFrameSize(oldFrameSize); + code.decFrameSize(params.length*4+4); + code.emit(RET, LNK); + case While(cond, stats) => genTmp { tmpReg => @@ -257,20 +254,22 @@ } case Block(stats, main) => - //TODO: what about VarScope? + //TODO: is it really needed to do code.getFrameSize() and code.setFrameSize() + val fs = code.getFrameSize(); + code.freeRegister(targetReg); stats.foreach(gen); code.getRegister(targetReg); genLoad(main, targetReg); - code.emit(SUBI, SP, SP, code.getFrameSize()); - code.decFrameSize(code.getFrameSize()); + + code.emit(SUBI, SP, SP, code.getFrameSize()-fs); + code.decFrameSize(code.getFrameSize()-fs); case Ident(name) => if ( name.name == "this" ) { - //TODO - //code.emit(LDW, targetReg, SP, code.getFrameSize()-name.sym.offset); + code.emit(LDW, targetReg, SP, code.getFrameSize()); } else { - code.emit(LDW, targetReg, SP, code.getFrameSize()-name.sym.offset); + code.emit(LDW, targetReg, SP, code.getFrameSize()-(name.sym.offset)); } case New(name, args) => @@ -293,23 +292,30 @@ case Select(prefix, selector) => genTmp { tmpReg => genLoad(prefix, tmpReg); + // TODO check tmpReg != null code.emit(LDW, targetReg, tmpReg, selector.sym.offset+4); } case Call(receiver, method, args) => - genTmp { tmpReg => - for ( val a <- args ) { - genLoad(a, tmpReg); - code.emit(PSH, tmpReg, SP, 4); + genTmp { thisReg => + + genLoad(receiver, thisReg); + code.emit(PSH, thisReg, SP, 4); // this TODO + code.incFrameSize(4); + + genTmp { tmpReg => + for ( val a <- args ) { + genLoad(a, tmpReg); + code.emit(PSH, tmpReg, SP, 4); + code.incFrameSize(4); + } } - genLoad(receiver, tmpReg); - //TODO check tmpReg != null - code.emit(PSH, tmpReg, SP, 4); // this TODO - code.emit(LDW, tmpReg, tmpReg, method.sym.offset); - //TODO check tmpReg != null - code.emit(RET, tmpReg); + //TODO check thisReg != null + code.emit(LDW, thisReg, thisReg, method.sym.offset); + //TODO check thisReg != null + code.emit(RET, thisReg); } code.emit(ADDI, SP, SP, args.length*4);