diff --git a/ChangeLog b/ChangeLog index b8ac370..51b18d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Apr 6 07:04:30 2009 Minero Aoki + + * net/loveruby/cflat/compiler/Compiler.java: call JumpResolver at + last. + + * net/loveruby/cflat/compiler/TypeChecker.java: TypeChecker has + required ReturnNode.function, provide "current function" by + myself. + Sat Apr 4 23:47:02 2009 Minero Aoki * net/loveruby/cflat/ast/ASTVisitor.java: #visit returns a node diff --git a/net/loveruby/cflat/compiler/Compiler.java b/net/loveruby/cflat/compiler/Compiler.java index fab008c..9a65b44 100644 --- a/net/loveruby/cflat/compiler/Compiler.java +++ b/net/loveruby/cflat/compiler/Compiler.java @@ -113,6 +113,7 @@ public class Compiler { ast.dump(); return; } + new JumpResolver(errorHandler).resolve(ast); String asm = generateAssembly(ast, opts); if (opts.mode() == CompilerMode.DumpAsm) { System.out.println(asm); @@ -171,7 +172,6 @@ public class Compiler { protected void semanticAnalysis(AST ast, Options opts) throws SemanticException { - new JumpResolver(errorHandler).resolve(ast); new LocalResolver(errorHandler).resolve(ast); new TypeResolver(errorHandler).resolve(ast); ast.typeTable().semanticCheck(errorHandler); diff --git a/net/loveruby/cflat/compiler/TypeChecker.java b/net/loveruby/cflat/compiler/TypeChecker.java index 881785d..1b61aee 100644 --- a/net/loveruby/cflat/compiler/TypeChecker.java +++ b/net/loveruby/cflat/compiler/TypeChecker.java @@ -7,6 +7,7 @@ import java.util.*; class TypeChecker implements ASTVisitor { protected TypeTable typeTable; protected ErrorHandler errorHandler; + private DefinedFunction currentFunction; // #@@range/ctor{ public TypeChecker(ErrorHandler errorHandler) { @@ -30,6 +31,7 @@ class TypeChecker implements ASTVisitor { // #@@} public DefinedFunction visit(DefinedFunction f) { + currentFunction = f; checkReturnType(f); checkParamTypes(f); checkStmt(f.body()); @@ -183,7 +185,7 @@ class TypeChecker implements ASTVisitor { if (node.expr() != null) { node.setExpr(checkExpr(node.expr())); } - if (node.function().isVoid()) { + if (currentFunction.isVoid()) { if (node.expr() != null) { error(node, "returning value from void function"); } @@ -197,7 +199,7 @@ class TypeChecker implements ASTVisitor { error(node, "returning void"); return null; } - node.setExpr(implicitCast(node.function().returnType(), + node.setExpr(implicitCast(currentFunction.returnType(), node.expr())); } return null;