diff --git a/sources/zweic/Generator.scala b/sources/zweic/Generator.scala index 0cc6089..94e5492 100644 --- a/sources/zweic/Generator.scala +++ b/sources/zweic/Generator.scala @@ -101,9 +101,9 @@ emitLoadConstant(classHeader, cname.sym.offset); for ( val m <- cname.sym.asInstanceOf[ClassSymbol].allMethods ) { //TODO: why use LNK here? don't we use a normal register??? - emitLoadConstant(LNK, m.address); + emitLoadConstant(LNK, m.address-4); //TODO: this +4 could be somewhere else.... - code.emit(STW, LNK, classHeader, m.offset-4, + code.emit(STW, LNK, classHeader, m.offset, cname.name + "::" + m.name); } } @@ -132,17 +132,19 @@ genLoad(body, RES); // fs = params + this + lnk + ... code.freeRegister(RES); - code.emit(SUBI, SP, SP, code.getFrameSize() - (4+4+4*params.length) ); - code.decFrameSize(code.getFrameSize()); // fs = 0 - code.incFrameSize(4+4+4*params.length); // fs = params + this + lnk + //code.emit(SUBI, SP, SP, code.getFrameSize() - (4+4+4*params.length) ); + //code.decFrameSize(code.getFrameSize()); // fs = 0 + //code.incFrameSize(4+4+4*params.length); // fs = params + this + lnk - code.emit(POP, LNK, SP, 4); - code.decFrameSize(4); // fs = params + this + //code.emit(POP, LNK, SP, 4); + //code.decFrameSize(4); // fs = params + this - code.emit(SUBI, SP, SP, params.length*4+4); + //code.emit(SUBI, SP, SP, params.length*4+4); + code.emit(POP, LNK, SP, code.getFrameSize()-params.length); + code.decFrameSize(code.getFrameSize()); // fs = 0 code.incFrameSize(oldFrameSize); // fs = oldframesize - + code.emit(RET, LNK, "end -- " + method.self + "::" + name); @@ -297,9 +299,10 @@ case Ident(name) => if ( name.name == "this" ) { - code.emit(LDW, targetReg, SP, code.getFrameSize(), name.name); + code.emit(LDW, targetReg, SP, code.getFrameSize()/4, name.name + " FS:" + code.getFrameSize()); } else { - code.emit(LDW, targetReg, SP, code.getFrameSize()-(name.sym.offset), name.name); + code.emit(LDW, targetReg, SP, code.getFrameSize()/4-(name.sym.offset), + name.name + "offset"+ name.sym.offset + " FS:" + code.getFrameSize()); } case New(name, args) => @@ -363,24 +366,24 @@ code.emit(PSH, thisReg, SP, 4); code.incFrameSize(4); - // put args on stack - genTmp { tmpReg => - for ( val a <- args ) { - genLoad(a, tmpReg); - code.emit(PSH, tmpReg, SP, 4); - code.incFrameSize(4); - } - } - - - //TODO: bizarr: twice method.sym.offset.... + //TODO: //load vmt pos - code.emit(LDW, thisReg, thisReg, method.sym.offset); + code.emit(LDW, thisReg, thisReg, 0); //load method address code.emit(LDW, targetReg, thisReg, method.sym.offset); } + // put args on stack + genTmp { tmpReg => + for ( val a <- args ) { + genLoad(a, tmpReg); + code.emit(PSH, tmpReg, SP, 4); + code.incFrameSize(4); + } + } + + // //TODO // // check receiver.method() != null @@ -392,8 +395,8 @@ //call function code.emit(RET, targetReg); -// //TODO store return value -// code.emit(ADD, targetReg, ZERO, RES, "store return value to target reg"); + //TODO store return value + code.emit(ADDI, targetReg, RES, 0, "store return value to target reg"); code.decFrameSize(args.length*4+4); // fs = oldframesize - params - this