package slangc.model.clauses; import slangc.api.BytecodeInstructionWriter; import slangc.bytecode.MethodSignature; import slangc.bytecode.TypeSignature; import slangc.model.ExpressionModel; import slangc.model.ExpressionOwner; import slangc.model.InnerTypeScope; import slangc.model.MemberModel; import slangc.model.MethodModel; import slangc.model.ParameterSet; import slangc.model.StatementOwner; import slangc.model.TypeModel; import slangc.parser.Branch; import slangc.parser.Node; public class Arguments extends Expressions implements ExpressionOwner { public Arguments(ExpressionOwner owner, Branch source) { super(owner, (Branch)source.getSubnode(1)); // TODO Auto-generated constructor stub } @Override public InnerTypeScope getTypeScope() { return getOwner().getTypeScope(); } @Override public TypeModel resolveType(Node subnode) { return getOwner().resolveType(subnode); } @Override public MemberModel getMethodOrField() { return getOwner().getMethodOrField(); } public void generate(BytecodeInstructionWriter w, MethodModel method, boolean allowVarargs) { ParameterSet params = method.getParameters(); for (int i = 0; i < params.countNonVarargParameters(); i++) { ExpressionModel e = getExpression(i); TypeSignature et = e.generate(w); if (!et.mappableEquals(params.getParameter(i).getStorageType().getTypeSignature())) { w.genConvert(et, params.getParameter(i).getStorageType().getTypeSignature()); } } if (!allowVarargs || (params.isVarargs() && params.countParameters() == countExpressions() && getExpression(params.countNonVarargParameters()).getResult() .getValueTypeWithNullType(params.getVarargsParameter().getStorageType()).getTypeSignature() == params.getVarargsParameter().getStorageType().getTypeSignature())) { ExpressionModel e = getExpression(params.countNonVarargParameters()); TypeSignature et = e.generate(w); if (!et.mappableEquals(params.getParameter(params.countNonVarargParameters()).getStorageType().getTypeSignature())) { w.genConvert(et, params.getParameter(params.countNonVarargParameters()).getStorageType().getTypeSignature()); } } else if (allowVarargs && params.isVarargs()) { TypeSignature arrtype = params.getVarargsParameter().getStorageType().getTypeSignature(); w.genConst(w.getTarget().getHeap().getConstInt32("" + (countExpressions() - params.countNonVarargParameters()))); w.genNewArray(arrtype); for (int i = params.countNonVarargParameters(); i < countExpressions(); i++) { w.genDup(arrtype); ExpressionModel e = getExpression(i); TypeSignature et = e.generate(w); if (!et.mappableEquals(params.getVarargsElementType().getTypeSignature())) { w.genConvert(et, params.getVarargsElementType().getTypeSignature()); et = params.getVarargsElementType().getTypeSignature(); } w.genSwap(et, arrtype); w.genConst(w.getTarget().getHeap().getConstInt32("" + (i - params.countNonVarargParameters()))); //w.genSwap(getSystem().getDefaultInt32Type().getTypeSignature(), getResult().getValueType().getTypeSignature()); w.genArrayStore(params.getVarargsElementType().getTypeSignature()); } } } }