slcom/slangc/model/clauses/Arguments.sauce

82 lines
3.2 KiB
Plaintext
Raw Normal View History

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());
}
}
}
}