* net/loveruby/cflat/compiler/IRGenerator.java: use ExprNode#shouldEvalutedToAddress again, it contains complex condition.

git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4158 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-04-26 14:54:52 +00:00
parent 82586f9184
commit a5eb1024f9
2 changed files with 14 additions and 11 deletions

View File

@ -1,3 +1,9 @@
Sun Apr 26 23:54:47 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/IRGenerator.java: use
ExprNode#shouldEvalutedToAddress again, it contains complex
condition.
Sun Apr 26 23:39:56 2009 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/ir/Expr.java: show Expr type on dump.

View File

@ -616,14 +616,14 @@ class IRGenerator implements ASTVisitor<Void, Expr> {
Expr addr = new Bin(pointerTo(node.type()), Op.ADD,
addressOf(transform(node.expr())),
intValue(node.offset()));
return isImplicitPointer(node) ? addr : deref(addr);
return node.shouldEvaluatedToAddress() ? addr : deref(addr);
}
public Expr visit(PtrMemberNode node) {
Expr addr = new Bin(pointerTo(node.type()), Op.ADD,
transform(node.expr()),
intValue(node.offset()));
return isImplicitPointer(node) ? addr : deref(addr);
return node.shouldEvaluatedToAddress() ? addr : deref(addr);
}
public Expr visit(DereferenceNode node) {
@ -632,7 +632,7 @@ class IRGenerator implements ASTVisitor<Void, Expr> {
public Expr visit(AddressNode node) {
Expr e = transform(node.expr());
if (isImplicitPointer(e) && (e instanceof Addr)) {
if (node.expr().shouldEvaluatedToAddress() && (e instanceof Addr)) {
return e;
}
else {
@ -659,7 +659,7 @@ class IRGenerator implements ASTVisitor<Void, Expr> {
public Expr visit(VariableNode node) {
Var var = new Var(node.entity());
return isImplicitPointer(var) ? addressOf(var) : var;
return node.shouldEvaluatedToAddress() ? addressOf(var) : var;
}
public Expr visit(IntegerLiteralNode node) {
@ -686,17 +686,14 @@ class IRGenerator implements ASTVisitor<Void, Expr> {
}
else {
Type base = expr.type();
Type t = isImplicitPointer(expr) ? base : pointerTo(base);
Type t = shouldEvalutedToAddress(expr) ? base : pointerTo(base);
return new Addr(t, expr);
}
}
private boolean isImplicitPointer(ExprNode node) {
return node.shouldEvaluatedToAddress();
}
private boolean isImplicitPointer(Expr expr) {
return expr.type().isArray();
private boolean shouldEvalutedToAddress(Expr expr) {
return expr.type().isArray()
|| ((expr instanceof Var) && ((Var)expr).entity().cannotLoad());
}
private Var ref(DefinedVariable var) {