82 lines
3.2 KiB
Plaintext
82 lines
3.2 KiB
Plaintext
|
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());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|