changeset 55:79cb0afafabe new_gen

Now structs are somewhat useable to use.
author Anders Johnsen <skabet@gmail.com>
date Sat, 26 Apr 2008 23:11:13 +0200
parents d84fec04d462
children 4ae365eff712
files ast/Exp.d gen/CodeGen.d sema/AstAction.d sema/DType.d sema/Declarations.d sema/SymbolTableBuilder.d sema/Visitor.d
diffstat 7 files changed, 61 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/ast/Exp.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/ast/Exp.d	Sat Apr 26 23:11:13 2008 +0200
@@ -11,7 +11,7 @@
     Binary,
     Negate,
     IntegerLit,
-    MemberLookup,
+    MemberReference,
     ArrayLookup,
     Identifier,
     AssignExp,
@@ -111,11 +111,11 @@
     Token token;
 }
 
-class MemberLookup : Exp
+class MemberReference : Exp
 {
     this(Exp target, Identifier child)
     {
-        super(ExpType.MemberLookup);
+        super(ExpType.MemberReference);
         this.target = target;
         this.child = child;
     }
--- a/gen/CodeGen.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/gen/CodeGen.d	Sat Apr 26 23:11:13 2008 +0200
@@ -74,17 +74,22 @@
                 foreach (p; fd.funcArgs)
                 {
                     DType t = p.env.find(p.identifier).type;
-                    if(cast(DStruct)t)
+                    if(auto st = cast(DStruct)t)
                     {
-                        Type pointer = PointerType.Get(llvm(t));
+                        Type pointer = PointerType.Get(llvm(st));
                         param_types ~= pointer;
                     }
                     else
                         param_types ~= llvm(t);
                 }
                 auto ret_t = llvm(fd.env.find(fd.identifier).type);
+                if(auto st = cast(StructType)ret_t)
+                {
+                    ret_t = PointerType.Get(ret_t);
+                }
                 auto func_t = FunctionType.Get(ret_t, param_types);
                 auto llfunc = m.addFunction(func_t, fd.identifier.get);
+                Stdout("uhh").newline;
             };
         auto visitor = new VisitFuncDecls(registerFunc);
         visitor.visit(decls);
@@ -282,9 +287,10 @@
                     return table.find(sym.id.get);
                 else
                     return b.buildLoad(table.find(sym.id.get), sym.id.get);
-            case ExpType.MemberLookup:
+            case ExpType.MemberReference:
                 auto v = getPointer(exp);
-                return b.buildLoad(v, v.name);
+                return v;
+//                return b.buildLoad(v, v.name);
         }
         assert(0, "Reached end of switch in genExpression");
         return null;
@@ -313,7 +319,7 @@
                         throw error(__LINE__, PE.VoidRetInNonVoidFunc);
 
                 Value v = genExpression(ret.exp);
-                if (v.type != t)
+/*                if (v.type != t)
                 {
                     IntegerType v_t = cast(IntegerType) v.type;
                     IntegerType i_t = cast(IntegerType) t;
@@ -326,7 +332,7 @@
                         v = b.buildSExt(v, t, ".cast");
                     else
                         v = b.buildTrunc(v, t, ".cast");
-                }
+                }*/
                 b.buildRet(v);
                 break;
             case StmtType.Decl:
@@ -458,8 +464,8 @@
                 auto identifier = cast(Identifier)exp;
                 auto sym = exp.env.find(identifier);
                 return table.find(sym.id.get);
-            case ExpType.MemberLookup:
-                auto mem = cast(MemberLookup)exp;
+            case ExpType.MemberReference:
+                auto mem = cast(MemberReference)exp;
                 switch(mem.target.expType)
                 {
                     case ExpType.Identifier:
@@ -471,12 +477,7 @@
                         DType t = sym.type;
                         auto st = cast(DStruct)t;
 
-                        int i = 0;
-                        foreach(char[] name, DType type ; st.members)
-                            if(name == child.get)
-                                break;
-                            else
-                                i++;
+                        int i = st.indexOf(child.get);
 
                         Value[] vals;   
                         vals ~= ConstantInt.Get(IntegerType.Int32, 0, false);
@@ -578,8 +579,7 @@
         {
             Type[] members;
             foreach(m; s.members)
-                members ~= llvm(m);
-
+                members ~= llvm(m.type);
 
             Type res = StructType.Get(members);
             type_map[t] = res;
--- a/sema/AstAction.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/sema/AstAction.d	Sat Apr 26 23:11:13 2008 +0200
@@ -39,6 +39,11 @@
                 exp);
     }
 
+    ExprT actOnMemberReference(ExprT lhs, Location op, Id member)
+    {
+        return new MemberReference(cast(Exp)lhs, new Identifier(member.tok));
+    }
+
     override DeclT actOnStartOfFunctionDef(ref Id type, ref Id name)
     {
         return new FuncDecl(new Identifier(type.tok), new Identifier(name.tok));
--- a/sema/DType.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/sema/DType.d	Sat Apr 26 23:11:13 2008 +0200
@@ -105,16 +105,35 @@
 
     int byteSize() { return bytes_total; }
 
-    void setMembers(DType[char[]] members)
+    void addMember(DType type, char[] name)
     {
-        this.members = members;
+        auto s = DStructMember(type, members.length);
+        members[name] = s;
 
-        foreach (type; members)
-            bytes_total += type.byteSize();
+        bytes_total += type.byteSize();
     }
 
-    DType[char[]] members;
+    int indexOf(char[] name)
+    {
+        if(name in members)
+            return members[name].index;
+
+        return -1;
+    }
+
+    DType typeOf(char[] name)
+    {
+        return members[name].type;
+    }
+
+    DStructMember[char[]] members;
     private int bytes_total;
+
+    struct DStructMember
+    {
+        DType type;
+        int index;
+    }
 }
 
 class DFunction : DType
--- a/sema/Declarations.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/sema/Declarations.d	Sat Apr 26 23:11:13 2008 +0200
@@ -45,7 +45,7 @@
             visitStmt(stmt);
     }
 
-    override void visitMemberLookup(MemberLookup m)
+    override void visitMemberReference(MemberReference m)
     {
         switch(m.target.expType)
         {
@@ -60,7 +60,7 @@
                         .arg(child.get)
                         .tok(child.token);
                 break;
-            case ExpType.MemberLookup:
+            case ExpType.MemberReference:
                 break;
         }
     }
--- a/sema/SymbolTableBuilder.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/sema/SymbolTableBuilder.d	Sat Apr 26 23:11:13 2008 +0200
@@ -42,12 +42,13 @@
     override void visitStructDecl(StructDecl s)
     {
         DType[char[]] types;
+
+        auto st = (cast(DStruct)s.env.types[s.identifier.get]);
         foreach(varDecl ; s.vars)
         {
-            types[varDecl.identifier.get] = typeOf(varDecl.type, s.env);
+            st.addMember(typeOf(varDecl.type, varDecl.env), varDecl.identifier.get);
         }
 
-        (cast(DStruct)s.env.types[s.identifier.get]).setMembers(types);
         super.visitStructDecl(s);
     }
 
@@ -142,12 +143,15 @@
     {
         auto sc = current();
         auto sym = sc.add(s.identifier);
+        s.env = sc;
+        auto type = new DStruct(s.identifier);
 
-        auto type = new DStruct(s.identifier);
         
         sc.types[s.identifier.get] = type;
-        s.env = sc;
+
+        sc = push();
         super.visitStructDecl(s);
+        pop(sc);
     }
 
     override void visitDeclStmt(DeclStmt d)
--- a/sema/Visitor.d	Sat Apr 26 19:13:10 2008 +0200
+++ b/sema/Visitor.d	Sat Apr 26 23:11:13 2008 +0200
@@ -76,8 +76,8 @@
                 return visitCallExp(cast(CallExp)exp);
             case ExpType.Identifier:
                 return visitIdentifier(cast(Identifier)exp);
-            case ExpType.MemberLookup:
-                return visitMemberLookup(cast(MemberLookup)exp);
+            case ExpType.MemberReference:
+                return visitMemberReference(cast(MemberReference)exp);
             default:
                 throw new Exception("Unknown expression type");
         }
@@ -261,7 +261,7 @@
             return ExpT.init;
     }
 
-    ExpT visitMemberLookup(MemberLookup mem)
+    ExpT visitMemberReference(MemberReference mem)
     {
         visitExp(mem.target);
         visitExp(mem.child);