diff --git a/ChangeLog b/ChangeLog index ba17971..e7f7070 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Sun May 24 19:23:28 2009 Minero Aoki + + * net/loveruby/cflat/compiler/TypeResolver.java: now 3 pathes + (define, resolve entities, resolve expr) are not required; just + use old 2 pathes (define, resolve). Old TypeResolver fixed a type + of AddressNode, it requires 3 path. But current implementation + fixes a type of AddressNode in DereferenceChecker, we do not need + 3 path. + + * net/loveruby/cflat/ast/AST.java: #entities -> #definitions. + + * net/loveruby/cflat/ast/AST.java: new method #entities, it + returns #definitions + #declarations. + + * net/loveruby/cflat/compiler/TypeResolver.java: follow it. + + * net/loveruby/cflat/compiler/LocalResolver.java: follow it. + Sun May 24 11:58:15 2009 Minero Aoki * net/loveruby/cflat/compiler/IRGenerator.java (If): refactoring: diff --git a/net/loveruby/cflat/ast/AST.java b/net/loveruby/cflat/ast/AST.java index ffbb081..02292b3 100644 --- a/net/loveruby/cflat/ast/AST.java +++ b/net/loveruby/cflat/ast/AST.java @@ -29,6 +29,16 @@ public class AST extends Node { return result; } + public List entities() { + List result = new ArrayList(); + result.addAll(declarations.funcdecls); + result.addAll(declarations.vardecls); + result.addAll(declarations.defvars); + result.addAll(declarations.defuns); + result.addAll(declarations.constants); + return result; + } + public List declarations() { List result = new ArrayList(); result.addAll(declarations.funcdecls); @@ -36,7 +46,7 @@ public class AST extends Node { return result; } - public List entities() { + public List definitions() { List result = new ArrayList(); result.addAll(declarations.defvars); result.addAll(declarations.defuns); diff --git a/net/loveruby/cflat/compiler/LocalResolver.java b/net/loveruby/cflat/compiler/LocalResolver.java index 6f3a40a..0449e01 100644 --- a/net/loveruby/cflat/compiler/LocalResolver.java +++ b/net/loveruby/cflat/compiler/LocalResolver.java @@ -35,7 +35,7 @@ public class LocalResolver extends Visitor { for (Entity decl : ast.declarations()) { toplevel.declareEntity(decl); } - for (Entity ent : ast.entities()) { + for (Entity ent : ast.definitions()) { toplevel.defineEntity(ent); } // #@@} diff --git a/net/loveruby/cflat/compiler/TypeResolver.java b/net/loveruby/cflat/compiler/TypeResolver.java index 05aa438..3f015a7 100644 --- a/net/loveruby/cflat/compiler/TypeResolver.java +++ b/net/loveruby/cflat/compiler/TypeResolver.java @@ -25,24 +25,9 @@ public class TypeResolver extends Visitor for (TypeDefinition t : ast.types()) { t.accept(this); } - for (Entity d : ast.declarations()) { - d.accept(this); - } for (Entity e : ast.entities()) { e.accept(this); } - - for (DefinedVariable var : ast.definedVariables()) { - if (var.hasInitializer()) { - visitExpr(var.initializer()); - } - } - for (Constant c : ast.constants()) { - visitExpr(c.value()); - } - for (DefinedFunction f : ast.definedFunctions()) { - visitStmt(f.body()); - } // #@@} } // #@@} @@ -112,6 +97,9 @@ public class TypeResolver extends Visitor // #@@range/DefinedVariable{ public Void visit(DefinedVariable var) { bindType(var.typeNode()); + if (var.hasInitializer()) { + visitExpr(var.initializer()); + } return null; } // #@@} @@ -123,12 +111,14 @@ public class TypeResolver extends Visitor public Void visit(Constant c) { bindType(c.typeNode()); + visitExpr(c.value()); return null; } // #@@range/DefinedFunction{ public Void visit(DefinedFunction func) { resolveFunctionHeader(func); + visitStmt(func.body()); return null; } // #@@} @@ -155,12 +145,7 @@ public class TypeResolver extends Visitor public Void visit(BlockNode node) { for (DefinedVariable var : node.variables()) { - bindType(var.typeNode()); - } - for (DefinedVariable var : node.variables()) { - if (var.hasInitializer()) { - visitExpr(var.initializer()); - } + var.accept(this); } visitStmts(node.stmts()); return null;