From 16a2210512c4932fa3c0cd49f444bd6fbf3ba5ef Mon Sep 17 00:00:00 2001 From: Minero Aoki Date: Wed, 2 Jan 2008 10:46:28 +0000 Subject: [PATCH] * net/loveruby/cflat/compiler/TypeChecker.java: check &expr is assignable. * net/loveruby/cflat/ast/Node.java: new generic method #isAssignable. * net/loveruby/cflat/ast/VariableNode.java: is assignable. * net/loveruby/cflat/ast/DereferenceNode.java: is assignable. * net/loveruby/cflat/ast/ArefNode.java: is assignable. * net/loveruby/cflat/ast/MemberNode.java: is assignable. * net/loveruby/cflat/ast/PtrMemberNode.java: is assignable. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@3772 1b9489fe-b721-0410-924e-b54b9192deb8 --- ChangeLog | 18 ++++++++++++++++++ ToDo | 6 ++---- net/loveruby/cflat/ast/ArefNode.java | 4 ++++ net/loveruby/cflat/ast/DereferenceNode.java | 6 ++++++ net/loveruby/cflat/ast/MemberNode.java | 6 ++++++ net/loveruby/cflat/ast/Node.java | 4 ++++ net/loveruby/cflat/ast/PtrMemberNode.java | 6 ++++++ net/loveruby/cflat/ast/VariableNode.java | 4 ++++ net/loveruby/cflat/compiler/TypeChecker.java | 4 +++- 9 files changed, 53 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index da97b31..0144eb9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Wed Jan 2 19:45:01 2008 Minero Aoki + + * net/loveruby/cflat/compiler/TypeChecker.java: check &expr is + assignable. + + * net/loveruby/cflat/ast/Node.java: new generic method + #isAssignable. + + * net/loveruby/cflat/ast/VariableNode.java: is assignable. + + * net/loveruby/cflat/ast/DereferenceNode.java: is assignable. + + * net/loveruby/cflat/ast/ArefNode.java: is assignable. + + * net/loveruby/cflat/ast/MemberNode.java: is assignable. + + * net/loveruby/cflat/ast/PtrMemberNode.java: is assignable. + Wed Jan 2 19:18:29 2008 Minero Aoki * net/loveruby/cflat/compiler/TypeChecker.java: check return type. diff --git a/ToDo b/ToDo index 70471b1..39a32cd 100644 --- a/ToDo +++ b/ToDo @@ -120,9 +120,7 @@ - *ptr = val - ptr->memb - ptr->memb = val -- &expr - - as RHS - * ?? as LHS + - &expr - function pointer - refer - call ptr(arg) @@ -166,7 +164,7 @@ - check duplicated struct/union members - ptr + int; ptr - int - check return type - * check if assignable + - check if &expr is assignable * use user type instead of struct/union - op for various types - signed char diff --git a/net/loveruby/cflat/ast/ArefNode.java b/net/loveruby/cflat/ast/ArefNode.java index c72e99c..d4b806f 100644 --- a/net/loveruby/cflat/ast/ArefNode.java +++ b/net/loveruby/cflat/ast/ArefNode.java @@ -26,6 +26,10 @@ public class ArefNode extends Node implements LHSNode { visitor.visit(this); } + public boolean isAssignable() { + return true; + } + public boolean isConstantAddress() { // FIXME return false; diff --git a/net/loveruby/cflat/ast/DereferenceNode.java b/net/loveruby/cflat/ast/DereferenceNode.java index 4b4a0d5..60d0b07 100644 --- a/net/loveruby/cflat/ast/DereferenceNode.java +++ b/net/loveruby/cflat/ast/DereferenceNode.java @@ -10,10 +10,16 @@ public class DereferenceNode extends UnaryOpNode implements LHSNode { visitor.visit(this); } + public boolean isAssignable() { + return true; + } + + // LHS node requirement public boolean isConstantAddress() { return false; } + // LHS node requirement public AsmEntity address() { throw new Error("DereferenceNode#address"); } diff --git a/net/loveruby/cflat/ast/MemberNode.java b/net/loveruby/cflat/ast/MemberNode.java index 4a264c8..645908b 100644 --- a/net/loveruby/cflat/ast/MemberNode.java +++ b/net/loveruby/cflat/ast/MemberNode.java @@ -35,10 +35,16 @@ public class MemberNode extends Node implements LHSNode { return baseType().memberOffset(name); } + public boolean isAssignable() { + return true; + } + + // LHS node requirement public boolean isConstantAddress() { return ((LHSNode)expr).isConstantAddress(); } + // LHS node requirement public AsmEntity address() { return expr.address().add(offset()); } diff --git a/net/loveruby/cflat/ast/Node.java b/net/loveruby/cflat/ast/Node.java index 8b1eae3..8280a86 100644 --- a/net/loveruby/cflat/ast/Node.java +++ b/net/loveruby/cflat/ast/Node.java @@ -23,4 +23,8 @@ abstract public class Node { public boolean isIndexable() { return type().isIndexable(); } + + public boolean isAssignable() { + return false; + } } diff --git a/net/loveruby/cflat/ast/PtrMemberNode.java b/net/loveruby/cflat/ast/PtrMemberNode.java index 8ada056..71a9479 100644 --- a/net/loveruby/cflat/ast/PtrMemberNode.java +++ b/net/loveruby/cflat/ast/PtrMemberNode.java @@ -28,10 +28,16 @@ public class PtrMemberNode extends Node implements LHSNode { return name; } + public boolean isAssignable() { + return true; + } + + // LHS node requirement public boolean isConstantAddress() { return false; } + // LHS node requirement public AsmEntity address() { throw new Error("PtrMemberNode#address"); } diff --git a/net/loveruby/cflat/ast/VariableNode.java b/net/loveruby/cflat/ast/VariableNode.java index 7543b1e..cc57aed 100644 --- a/net/loveruby/cflat/ast/VariableNode.java +++ b/net/loveruby/cflat/ast/VariableNode.java @@ -38,6 +38,10 @@ public class VariableNode extends Node implements LHSNode { visitor.visit(this); } + public boolean isAssignable() { + return true; + } + // LHS node requirement public boolean isConstantAddress() { return true; diff --git a/net/loveruby/cflat/compiler/TypeChecker.java b/net/loveruby/cflat/compiler/TypeChecker.java index d7dc6b0..295102f 100644 --- a/net/loveruby/cflat/compiler/TypeChecker.java +++ b/net/loveruby/cflat/compiler/TypeChecker.java @@ -451,7 +451,9 @@ class TypeChecker extends Visitor { super.visit(node); Type t = typeTable.pointerTo(node.expr().type()); node.setType(t); - // FIXME: what is "assignable"?? + if (! node.expr().isAssignable()) { + errorHandler.error("invalid LHS expression for &"); + } } public void visit(CastNode node) {