changeset 86:29f486ccc203 new_gen

Fixed a bug that made arrays as params fail big time
author Anders Johnsen <skabet@gmail.com>
date Fri, 02 May 2008 21:21:18 +0200
parents 9375bd975730
children 9a35a973175a
files ast/Decl.d ast/Exp.d gen/CodeGen.d sema/AstAction.d sema/SymbolTableBuilder.d
diffstat 5 files changed, 21 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ast/Decl.d	Fri May 02 20:18:50 2008 +0200
+++ b/ast/Decl.d	Fri May 02 21:21:18 2008 +0200
@@ -52,10 +52,7 @@
 
     override DType type()
     {
-        if(identifier)
-            return env.find(identifier).type;
-        else
-            return env.findType(varType);
+        return env.find(identifier).type;
     }
 
     Identifier varType, identifier;
--- a/ast/Exp.d	Fri May 02 20:18:50 2008 +0200
+++ b/ast/Exp.d	Fri May 02 21:21:18 2008 +0200
@@ -69,7 +69,7 @@
 
     Exp simplify()
     {
-        if(auto t = cast(DStruct)type)
+        if(auto t = type.asStruct)
         {
             DFunction func_t = cast(DFunction)exp.type();
             assert(func_t !is null, "Calling on something that isn't a function");
--- a/gen/CodeGen.d	Fri May 02 20:18:50 2008 +0200
+++ b/gen/CodeGen.d	Fri May 02 21:21:18 2008 +0200
@@ -83,12 +83,17 @@
                 Type[] param_types;
                 foreach (i, p; fd.funcArgs)
                 {
-                    DType t = p.env.findType(p.varType);
-                    if(auto st = cast(DStruct)t)
+                    DType t = p.env.find(p.identifier).type;
+                    if(auto st = t.asStruct)
                     {
                         Type pointer = PointerType.Get(llvm(st));
                         param_types ~= pointer;
                     }
+                    if(auto ar = t.asArray)
+                    {
+                        Type pointer = PointerType.Get(llvm(ar));
+                        param_types ~= pointer;
+                    }
                     else
                         param_types ~= llvm(t);
                 }
@@ -105,13 +110,17 @@
                     if(i == 0 && fd.sret)
                         llfunc.addParamAttr(0, ParamAttr.StructRet);
 
-                    DType t = p.env.findType(p.varType);
-                    if(auto st = cast(DStruct)t)
+                    DType t = p.env.find(p.identifier).type;
+                    if(auto st = t.asStruct)
                     {
                         if(i == 0 && fd.sret)
                             continue;
                         llfunc.addParamAttr(i,ParamAttr.ByVal);
                     }
+                    else if(auto ar = t.asArray)
+                    {
+                        llfunc.addParamAttr(i,ParamAttr.ByVal);
+                    }
                 }
             };
         auto visitor = new VisitFuncDecls(registerFunc);
@@ -152,6 +161,7 @@
                 auto func_t = cast(FunctionType)func_tp.elementType();
                 auto ret_t = func_t.returnType();
 
+
                 auto bb = llfunc.appendBasicBlock("entry");
                 b.positionAtEnd(bb);
 
@@ -316,7 +326,7 @@
             case ExpType.Identifier:
                 auto identifier = cast(Identifier)exp;
                 auto sym = exp.env.find(identifier);
-                if(sym.type.isStruct)
+                if(sym.type.isStruct || sym.type.isArray)
                     return table.find(sym.id.get);
                 else
                     return b.buildLoad(table.find(sym.id.get), sym.id.get);
@@ -675,6 +685,8 @@
             foreach(param; f.params)
                 if (param.isStruct)
                     params ~= PointerType.Get(llvm(param));
+                else if (param.isArray)
+                    params ~= PointerType.Get(llvm(param));
                 else
                     params ~= llvm(param);
 
--- a/sema/AstAction.d	Fri May 02 20:18:50 2008 +0200
+++ b/sema/AstAction.d	Fri May 02 21:21:18 2008 +0200
@@ -64,7 +64,7 @@
     {
         FuncDecl fd = cast(FuncDecl)func;
         if(name)
-            fd.addParam(new Identifier(type.tok), new Identifier(name.tok));
+            fd.addParam(handleType(type), new Identifier(name.tok));
         else
             fd.addParam(new Identifier(type.tok));
     }
--- a/sema/SymbolTableBuilder.d	Fri May 02 20:18:50 2008 +0200
+++ b/sema/SymbolTableBuilder.d	Fri May 02 21:21:18 2008 +0200
@@ -35,14 +35,12 @@
     override void visitVarDecl(VarDecl d)
     {
         visitExp(d.varType);
-        if(!d.identifier)
-            return;
+        visitExp(d.identifier);
         
         if (d.init)
             visitExp(d.init);
 
         d.env.find(d.identifier).type = typeOf(d.varType, d.env);
-        visitExp(d.identifier);
     }
 
     override void visitStructDecl(StructDecl s)
@@ -138,8 +136,6 @@
             --need_push;
         }
 
-        if(!d.identifier)
-            return;
         auto sc = current();
         auto sym = sc.add(d.identifier);
         d.env = sc;