* 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.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4131 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2009-04-05 22:04:35 +00:00
parent 043859df0b
commit 33dcef983b
3 changed files with 14 additions and 3 deletions

View File

@ -1,3 +1,12 @@
Mon Apr 6 07:04:30 2009 Minero Aoki <aamine@loveruby.net>
* 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 <aamine@loveruby.net>
* net/loveruby/cflat/ast/ASTVisitor.java: #visit returns a node

View File

@ -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);

View File

@ -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;