changeset 82:06dda301ea61 new_gen

Can declare outside functions and call c-functions
author Anders Johnsen <skabet@gmail.com>
date Fri, 02 May 2008 19:51:58 +0200
parents 110c7e1c4ca2
children 9e90694f5da0
files ast/Decl.d gen/CodeGen.d parser/Parser.d sema/AstAction.d sema/SymbolTable.d sema/SymbolTableBuilder.d sema/Visitor.d
diffstat 7 files changed, 35 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/ast/Decl.d	Fri May 02 18:23:33 2008 +0200
+++ b/ast/Decl.d	Fri May 02 19:51:58 2008 +0200
@@ -52,7 +52,10 @@
 
     override DType type()
     {
-        return env.find(identifier).type;
+        if(identifier)
+            return env.find(identifier).type;
+        else
+            return env.findType(varType);
     }
 
     Identifier varType, identifier;
@@ -68,7 +71,7 @@
         this.identifier = identifier;
     }
 
-    void addParam(Identifier type, Identifier name)
+    void addParam(Identifier type, Identifier name = null)
     {
         funcArgs ~= new VarDecl(type, name, null);
     }
@@ -76,6 +79,7 @@
     void setBody(CompoundStatement stmts)
     {
         statements = stmts.statements;
+        emptyFunction = false;
     }
 
     void simplify()
@@ -129,6 +133,7 @@
     VarDecl[] funcArgs;
     Stmt[] statements;
     bool sret = false;
+    bool emptyFunction = true;
     private DFunction myType;
 }
 
--- a/gen/CodeGen.d	Fri May 02 18:23:33 2008 +0200
+++ b/gen/CodeGen.d	Fri May 02 19:51:58 2008 +0200
@@ -83,7 +83,7 @@
                 Type[] param_types;
                 foreach (i, p; fd.funcArgs)
                 {
-                    DType t = p.env.find(p.identifier).type;
+                    DType t = p.env.findType(p.varType);
                     if(auto st = cast(DStruct)t)
                     {
                         Type pointer = PointerType.Get(llvm(st));
@@ -105,7 +105,7 @@
                     if(i == 0 && fd.sret)
                         llfunc.addParamAttr(0, ParamAttr.StructRet);
 
-                    DType t = p.env.find(p.identifier).type;
+                    DType t = p.env.findType(p.varType);
                     if(auto st = cast(DStruct)t)
                     {
                         if(i == 0 && fd.sret)
@@ -142,6 +142,10 @@
             case DeclType.FuncDecl:
                 FuncDecl funcDecl = cast(FuncDecl)decl;
 
+                // Empty function - declare;
+                if(funcDecl.emptyFunction)
+                    return;
+
                 llvm(funcDecl.type);
                 auto llfunc = m.getNamedFunction(funcDecl.type.name);
                 auto func_tp = cast(PointerType)llfunc.type;
--- a/parser/Parser.d	Fri May 02 18:23:33 2008 +0200
+++ b/parser/Parser.d	Fri May 02 19:51:58 2008 +0200
@@ -237,6 +237,11 @@
         Decl func = action.actOnStartOfFunctionDef(type, name);
         parseFuncArgs(func);
 
+        if(lexer.peek.type == Tok.Seperator)
+        {
+            lexer.next;
+            return func;
+        }
         Stmt stmt = parseCompoundStatement();
 
         return action.actOnEndOfFunction(func, stmt);
@@ -254,7 +259,9 @@
         while(lexer.peek.type != Tok.CloseParentheses)
         {
             auto t = parseType();
-            auto i = parseIdentifier();
+            Id i;
+            if(lexer.peek.type == Tok.Identifier)
+                i = parseIdentifier();
             action.addFuncArg(func, t, i);
 
             if(lexer.peek.type == Tok.Comma)
--- a/sema/AstAction.d	Fri May 02 18:23:33 2008 +0200
+++ b/sema/AstAction.d	Fri May 02 19:51:58 2008 +0200
@@ -63,7 +63,10 @@
     override void addFuncArg(DeclT func, Id type, Id name)
     {
         FuncDecl fd = cast(FuncDecl)func;
-        fd.addParam(new Identifier(type.tok), new Identifier(name.tok));
+        if(name)
+            fd.addParam(new Identifier(type.tok), new Identifier(name.tok));
+        else
+            fd.addParam(new Identifier(type.tok));
     }
 
     override DeclT actOnEndOfFunction(DeclT func, StmtT stmts)
--- a/sema/SymbolTable.d	Fri May 02 18:23:33 2008 +0200
+++ b/sema/SymbolTable.d	Fri May 02 19:51:58 2008 +0200
@@ -32,6 +32,8 @@
 
     Symbol find(Identifier id)
     {
+        if(!id)
+            return null;
         if (auto sym = id in symbols)
             return *sym;
         if (enclosing !is null)
--- a/sema/SymbolTableBuilder.d	Fri May 02 18:23:33 2008 +0200
+++ b/sema/SymbolTableBuilder.d	Fri May 02 19:51:58 2008 +0200
@@ -34,11 +34,14 @@
 
     override void visitVarDecl(VarDecl d)
     {
+        visitExp(d.varType);
+        if(!d.identifier)
+            return;
+        
         if (d.init)
             visitExp(d.init);
 
         d.env.find(d.identifier).type = typeOf(d.varType, d.env);
-        visitExp(d.varType);
         visitExp(d.identifier);
     }
 
@@ -135,6 +138,8 @@
             --need_push;
         }
 
+        if(!d.identifier)
+            return;
         auto sc = current();
         auto sym = sc.add(d.identifier);
         d.env = sc;
--- a/sema/Visitor.d	Fri May 02 18:23:33 2008 +0200
+++ b/sema/Visitor.d	Fri May 02 19:51:58 2008 +0200
@@ -95,7 +95,8 @@
     DeclT visitVarDecl(VarDecl d)
     {
         visitExp(d.varType);
-        visitExp(d.identifier);
+        if(d.identifier)
+            visitExp(d.identifier);
         if (d.init)
             visitExp(d.init);