From a5eb1024f9683fe2ba7fcaba44f8ea569c28fc32 Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Sun, 26 Apr 2009 14:54:52 +0000 Subject: [PATCH] * 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 --- ChangeLog | 6 ++++++ net/loveruby/cflat/compiler/IRGenerator.java | 19 ++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index c8241d5..0fd195d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Apr 26 23:54:47 2009 Minero Aoki + + * net/loveruby/cflat/compiler/IRGenerator.java: use + ExprNode#shouldEvalutedToAddress again, it contains complex + condition. + Sun Apr 26 23:39:56 2009 Minero Aoki * net/loveruby/cflat/ir/Expr.java: show Expr type on dump. diff --git a/net/loveruby/cflat/compiler/IRGenerator.java b/net/loveruby/cflat/compiler/IRGenerator.java index 834b395..0d9d16a 100644 --- a/net/loveruby/cflat/compiler/IRGenerator.java +++ b/net/loveruby/cflat/compiler/IRGenerator.java @@ -616,14 +616,14 @@ class IRGenerator implements ASTVisitor { 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 { 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 { 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 { } 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) {