# HG changeset patch # User Anders Johnsen # Date 1209244273 -7200 # Node ID 79cb0afafabe7ec1b820b9c627d2863e6e32216c # Parent d84fec04d4623598e437a9844517c0a227fe7f68 Now structs are somewhat useable to use. diff -r d84fec04d462 -r 79cb0afafabe ast/Exp.d --- 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; } diff -r d84fec04d462 -r 79cb0afafabe gen/CodeGen.d --- 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; diff -r d84fec04d462 -r 79cb0afafabe sema/AstAction.d --- 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)); diff -r d84fec04d462 -r 79cb0afafabe sema/DType.d --- 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 diff -r d84fec04d462 -r 79cb0afafabe sema/Declarations.d --- 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; } } diff -r d84fec04d462 -r 79cb0afafabe sema/SymbolTableBuilder.d --- 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) diff -r d84fec04d462 -r 79cb0afafabe sema/Visitor.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);