@Override public void VisitApplySymbolNode(GtApplySymbolNode Node) { /*local*/ int ParamSize = LibGreenTea.ListSize(Node.ParamList); /*local*/ int TargetReg = this.ReserveRegister(ParamSize + CallParameters); /*local*/ int CallReg = TargetReg - ReturnIndex + ThisIndex; for ( /*local*/ int i = 0; i < ParamSize; ++i) { Node.ParamList.get(i).Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + (CallReg + i + 1) + ", REG" + this.PopRegister() + "\n"); } /*local*/ int CallMethod = this.MethodPool.indexOf(Node.ResolvedFunc.GetNativeFuncName()); this.VisitingBuilder.Append( "NSET " + "REG" + (CallReg + MethodIndex) + ", METHOD" + CallMethod + "\n"); this.VisitingBuilder.Append("CALL " + "REG" + CallReg + ", " + ParamSize + "\n"); this.PushRegister(TargetReg); this.FreeRegister(TargetReg + 1); }
@Override public void VisitApplyFunctionObjectNode(GtApplyFunctionObjectNode Node) { /*FIXME*/ /*local*/ int ParamSize = LibGreenTea.ListSize(Node.ParamList); /*local*/ int TargetReg = this.ReserveRegister(ParamSize + CallParameters); /*local*/ int CallReg = TargetReg - ReturnIndex + ThisIndex; for ( /*local*/ int i = 0; i < ParamSize; ++i) { Node.ParamList.get(i).Accept(this); this.VisitingBuilder.Append( "NMOV " + "REG" + (CallReg + i + 1) + ", REG" + this.PopRegister() + "\n"); } Node.FuncNode.Accept(this); this.VisitingBuilder.Append("NMOV " + "REG" + CallReg + ", REG" + this.PopRegister() + "\n"); this.VisitingBuilder.Append("LOOPUP " + "REG" + CallReg + "\n"); this.VisitingBuilder.Append("CALL " + "REG" + CallReg + ", " + ParamSize + "\n"); this.PushRegister(TargetReg); this.FreeRegister(TargetReg + 1); }