From 487cf1a71444066be91f9ee3b94f6a7fde5aca79 Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Sun, 26 Apr 2009 04:22:42 +0000 Subject: [PATCH] * net/loveruby/cflat/compiler/Simplifier.java (SuffixOp): too few deref. * net/loveruby/cflat/compiler/Simplifier.java (MemberNode): should set type. * net/loveruby/cflat/compiler/Simplifier.java (PtrMemberNode): should set type. * net/loveruby/cflat/compiler/Simplifier.java (Deref, Addr): should compile child expr. * net/loveruby/cflat/ast/BinaryOpNode.java (ctor): accept type. * net/loveruby/cflat/ast/TypeNode.java (location): do not raise exception when no typeRef exist. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4144 1b9489fe-b721-0410-924e-b54b9192deb8 --- ChangeLog | 19 ++++++++++++++ net/loveruby/cflat/ast/BinaryOpNode.java | 8 ++++++ net/loveruby/cflat/ast/TypeNode.java | 2 +- net/loveruby/cflat/compiler/Simplifier.java | 28 +++++++++++++++------ 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1f6e00b..de23eb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +Sun Apr 26 13:22:39 2009 Minero Aoki + + * net/loveruby/cflat/compiler/Simplifier.java (SuffixOp): too few + deref. + + * net/loveruby/cflat/compiler/Simplifier.java (MemberNode): should + set type. + + * net/loveruby/cflat/compiler/Simplifier.java (PtrMemberNode): + should set type. + + * net/loveruby/cflat/compiler/Simplifier.java (Deref, Addr): + should compile child expr. + + * net/loveruby/cflat/ast/BinaryOpNode.java (ctor): accept type. + + * net/loveruby/cflat/ast/TypeNode.java (location): do not raise + exception when no typeRef exist. + Sun Apr 26 12:17:51 2009 Minero Aoki * net/loveruby/cflat/asm/PeepholeOptimizer.java: fix bad operator diff --git a/net/loveruby/cflat/ast/BinaryOpNode.java b/net/loveruby/cflat/ast/BinaryOpNode.java index 179cdbf..8ea2426 100644 --- a/net/loveruby/cflat/ast/BinaryOpNode.java +++ b/net/loveruby/cflat/ast/BinaryOpNode.java @@ -13,6 +13,14 @@ public class BinaryOpNode extends ExprNode { this.right = right; } + public BinaryOpNode(Type t, ExprNode left, String op, ExprNode right) { + super(); + this.operator = op; + this.left = left; + this.right = right; + this.type = t; + } + public String operator() { return operator; } diff --git a/net/loveruby/cflat/ast/TypeNode.java b/net/loveruby/cflat/ast/TypeNode.java index 3609dae..60f817b 100644 --- a/net/loveruby/cflat/ast/TypeNode.java +++ b/net/loveruby/cflat/ast/TypeNode.java @@ -34,7 +34,7 @@ public class TypeNode extends Node { } public Location location() { - return typeRef.location(); + return typeRef == null ? null : typeRef.location(); } protected void _dump(Dumper d) { diff --git a/net/loveruby/cflat/compiler/Simplifier.java b/net/loveruby/cflat/compiler/Simplifier.java index 92424c9..ec15f71 100644 --- a/net/loveruby/cflat/compiler/Simplifier.java +++ b/net/loveruby/cflat/compiler/Simplifier.java @@ -490,7 +490,7 @@ class Simplifier implements ASTVisitor { DefinedVariable tmp = tmpVar(addr.type()); String op = binOp(node.operator()); assignBeforeStmt(ref(tmp), addr); - ExprNode lhs = transformOpAssign(ref(tmp), op, intValue(1)); + ExprNode lhs = transformOpAssign(deref(tmp), op, intValue(1)); ExprNode rhs = expandPointerArithmetic(intValue(1), op, lhs); return binaryOp(lhs, invert(op), rhs); } @@ -573,24 +573,28 @@ class Simplifier implements ASTVisitor { // #@@} public ExprNode visit(MemberNode node) { - ExprNode addr = binaryOp(addressOf(transform(node.expr())), - "+", intValue(node.offset())); + ExprNode addr = binaryOp(pointerTo(node.type()), + addressOf(transform(node.expr())), + "+", + intValue(node.offset())); return node.shouldEvaluatedToAddress() ? addr : deref(addr); } public ExprNode visit(PtrMemberNode node) { - ExprNode addr = binaryOp(transform(node.expr()), - "+", intValue(node.offset())); + ExprNode addr = binaryOp(pointerTo(node.type()), + transform(node.expr()), + "+", + intValue(node.offset())); return node.shouldEvaluatedToAddress() ? addr : deref(addr); } public ExprNode visit(DereferenceNode node) { - node.setExpr(node.expr()); + node.setExpr(transform(node.expr())); return node; } public ExprNode visit(AddressNode node) { - node.setExpr(node.expr()); + node.setExpr(transform(node.expr())); return node; } @@ -640,7 +644,7 @@ class Simplifier implements ASTVisitor { else { AddressNode n = new AddressNode(expr); Type base = expr.type(); - n.setType(expr.shouldEvaluatedToAddress() ? base : typeTable.pointerTo(base)); + n.setType(expr.shouldEvaluatedToAddress() ? base : pointerTo(base)); return n; } } @@ -659,10 +663,18 @@ class Simplifier implements ASTVisitor { return new DereferenceNode(expr); } + private Type pointerTo(Type t) { + return typeTable.pointerTo(t); + } + private BinaryOpNode binaryOp(ExprNode left, String op, ExprNode right) { return new BinaryOpNode(left, op, right); } + private BinaryOpNode binaryOp(Type t, ExprNode left, String op, ExprNode right) { + return new BinaryOpNode(t, left, op, right); + } + private IntegerLiteralNode intValue(long n) { // FIXME?: location return ptrDiff(n, null);