package zinara.ast.expression;
import zinara.code_generator.*;
import java.util.ArrayList;
import java.io.IOException;
import zinara.ast.type.BoolType;
import zinara.ast.type.TupleType;
import zinara.ast.type.Type;
import zinara.exceptions.TypeClashException;
import zinara.exceptions.InvalidCodeException;
// invariant: value is at least 2 long
public class TupleExp extends Expression {
public ArrayList value; // arraylist of expressions
public TupleExp(ArrayList v) { value = v; }
public TupleExp() { value = new ArrayList(); }
public Type getType() throws TypeClashException {
if (type != null) return type;
ArrayList types = new ArrayList();
for (int i = 0; i < value.size(); i++)
types.add(((Expression)value.get(i)).getType());
type = new TupleType(types);
return type;
}
public String toString() {
String ret = "(";
for (int i = 0; i < value.size(); i++)
ret += (Expression)value.get(i) + ", ";
return ret.substring(0, ret.length()-2) + ")";
}
public void tox86(Genx86 generator)
throws IOException, InvalidCodeException{
Expression expr;
String reg;
String regAddr = generator.addrRegName(register);
for (int i = value.size()-1; i >= 0 ; i--) {
//Se genera el valor
expr = (Expression)value.get(i);
expr.register = register;
reg = generator.regName(register, expr.type);
if (expr.type.equals(new BoolType())){
String ret = generator.newLabel();
boolValue(generator,expr,ret,reg);
generator.writeLabel(ret);
}
else
expr.tox86(generator);
//Se pushea en la pila
if (!(expr instanceof ListExp)&&
!(expr instanceof DictExp)&&
!(expr instanceof TupleExp)&&
!(expr instanceof StringExp))
generator.write(generator.push(reg, expr.type.size()));
}
//Por ultimo, devuelvo la direccion donde comienza la lista
generator.write(generator.mov(regAddr,generator.stack_pointer()));
}
public boolean isStaticallyKnown() {
boolean isk = true;
Expression v;
for (int i = 0; i < value.size(); i++) {
v = (Expression)value.get(i);
isk = isk && v.isStaticallyKnown();
}
return isk;
}
public Object staticValue() {
ArrayList result = new ArrayList();
for (int i = 0; i < value.size(); i++)
result.add(((Expression)value.get(i)).staticValue());
return result;
}
}