diff gen/CodeGen.d @ 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
line wrap: on
line diff
--- 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;