From 4d889a25881b6c49bcee202ffa35dbfa2d56f282 Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Sun, 24 May 2009 11:23:29 +0000 Subject: [PATCH] r4907@macbookpro: aamine | 2009-05-24 20:23:14 +0900 * net/loveruby/cflat/compiler/IRGenerator.java (Dereference): do not generate Mem for unloadable object (implicit address generation handling). * net/loveruby/cflat/ast: dump #type for LHS nodes. * net/loveruby/cflat/ast/AddressNode.java: do not inherit UnaryOpNode. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4241 1b9489fe-b721-0410-924e-b54b9192deb8 --- ChangeLog | 11 ++++++++ net/loveruby/cflat/ast/AddressNode.java | 28 +++++++++++++++----- net/loveruby/cflat/ast/ArefNode.java | 3 +++ net/loveruby/cflat/ast/DereferenceNode.java | 3 +++ net/loveruby/cflat/ast/MemberNode.java | 3 +++ net/loveruby/cflat/ast/PtrMemberNode.java | 3 +++ net/loveruby/cflat/compiler/IRGenerator.java | 3 ++- test/implicitaddr.cb | 26 ++++++++++++++++++ test/test_cbc.sh | 1 + 9 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 test/implicitaddr.cb diff --git a/ChangeLog b/ChangeLog index e7f7070..4410e54 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Sun May 24 20:24:01 2009 Minero Aoki + + * net/loveruby/cflat/compiler/IRGenerator.java (Dereference): do + not generate Mem for unloadable object (implicit address + generation handling). + + * net/loveruby/cflat/ast: dump #type for LHS nodes. + + * net/loveruby/cflat/ast/AddressNode.java: do not inherit + UnaryOpNode. + Sun May 24 19:23:28 2009 Minero Aoki * net/loveruby/cflat/compiler/TypeResolver.java: now 3 pathes diff --git a/net/loveruby/cflat/ast/AddressNode.java b/net/loveruby/cflat/ast/AddressNode.java index fa1f5c1..75a8eeb 100644 --- a/net/loveruby/cflat/ast/AddressNode.java +++ b/net/loveruby/cflat/ast/AddressNode.java @@ -1,11 +1,16 @@ package net.loveruby.cflat.ast; -import net.loveruby.cflat.type.*; +import net.loveruby.cflat.type.Type; -public class AddressNode extends UnaryOpNode { - protected Type type; +public class AddressNode extends ExprNode { + final ExprNode expr; + Type type; - public AddressNode(ExprNode n) { - super("&", n); + public AddressNode(ExprNode expr) { + this.expr = expr; + } + + public ExprNode expr() { + return expr; } public Type type() { @@ -14,12 +19,23 @@ public class AddressNode extends UnaryOpNode { } /** Decides type of this node. - * This method is called in TypeChecker. */ + * This method is called from DereferenceChecker. */ public void setType(Type type) { if (this.type != null) throw new Error("type set twice"); this.type = type; } + public Location location() { + return expr.location(); + } + + protected void _dump(Dumper d) { + if (type != null) { + d.printMember("type", type); + } + d.printMember("expr", expr); + } + public E accept(ASTVisitor visitor) { return visitor.visit(this); } diff --git a/net/loveruby/cflat/ast/ArefNode.java b/net/loveruby/cflat/ast/ArefNode.java index 282a8f1..6a921a7 100644 --- a/net/loveruby/cflat/ast/ArefNode.java +++ b/net/loveruby/cflat/ast/ArefNode.java @@ -45,6 +45,9 @@ public class ArefNode extends LHSNode { } protected void _dump(Dumper d) { + if (type != null) { + d.printMember("type", type); + } d.printMember("expr", expr); d.printMember("index", index); } diff --git a/net/loveruby/cflat/ast/DereferenceNode.java b/net/loveruby/cflat/ast/DereferenceNode.java index 2a974e0..4ed7e7d 100644 --- a/net/loveruby/cflat/ast/DereferenceNode.java +++ b/net/loveruby/cflat/ast/DereferenceNode.java @@ -27,6 +27,9 @@ public class DereferenceNode extends LHSNode { } protected void _dump(Dumper d) { + if (type != null) { + d.printMember("type", type); + } d.printMember("expr", expr); } diff --git a/net/loveruby/cflat/ast/MemberNode.java b/net/loveruby/cflat/ast/MemberNode.java index e6c2cac..cd36f9c 100644 --- a/net/loveruby/cflat/ast/MemberNode.java +++ b/net/loveruby/cflat/ast/MemberNode.java @@ -44,6 +44,9 @@ public class MemberNode extends LHSNode { } protected void _dump(Dumper d) { + if (type != null) { + d.printMember("type", type); + } d.printMember("expr", expr); d.printMember("member", member); } diff --git a/net/loveruby/cflat/ast/PtrMemberNode.java b/net/loveruby/cflat/ast/PtrMemberNode.java index d62d070..093d0bd 100644 --- a/net/loveruby/cflat/ast/PtrMemberNode.java +++ b/net/loveruby/cflat/ast/PtrMemberNode.java @@ -56,6 +56,9 @@ public class PtrMemberNode extends LHSNode { } protected void _dump(Dumper d) { + if (type != null) { + d.printMember("type", type); + } d.printMember("expr", expr); d.printMember("member", member); } diff --git a/net/loveruby/cflat/compiler/IRGenerator.java b/net/loveruby/cflat/compiler/IRGenerator.java index 8624e6e..70f9a10 100644 --- a/net/loveruby/cflat/compiler/IRGenerator.java +++ b/net/loveruby/cflat/compiler/IRGenerator.java @@ -707,7 +707,8 @@ class IRGenerator implements ASTVisitor { // #@@range/Dereference{ public Expr visit(DereferenceNode node) { - return new Mem(asmType(node.type()), transformExpr(node.expr())); + Expr addr = transformExpr(node.expr()); + return node.isLoadable() ? mem(addr, node.type()) : addr; } // #@@} diff --git a/test/implicitaddr.cb b/test/implicitaddr.cb new file mode 100644 index 0000000..a3e88c4 --- /dev/null +++ b/test/implicitaddr.cb @@ -0,0 +1,26 @@ +import stdio; + +int +main(int argc, char** argv) +{ + void *p = &printf; + + check(printf, p); + check(*printf, p); + check(**printf, p); + check(***printf, p); + check(****printf, p); + puts(""); + return 0; +} + +static void +check(void* f, void* p) +{ + if (f == p) { + printf(";OK"); + } + else { + printf(";NG"); + } +} diff --git a/test/test_cbc.sh b/test/test_cbc.sh index 3c6ba89..f78574d 100644 --- a/test/test_cbc.sh +++ b/test/test_cbc.sh @@ -246,6 +246,7 @@ test_25_block() { test_26_funcptr() { assert_out "OK;OK;OK;OK" ./funcptr + assert_out ";OK;OK;OK;OK;OK" ./implicitaddr assert_compile_error defun-semcheck.cb assert_compile_error defun-semcheck2.cb assert_compile_error defun-semcheck3.cb