# HG changeset patch # User Anders Halager # Date 1208636354 -7200 # Node ID b4dc2b2c0e383660b69c524197bde59c776b84c2 # Parent 14c1abba773ffade07de1c11e16243a8f1527f64 Added a DType class diff -r 14c1abba773f -r b4dc2b2c0e38 gen/LLVMGen.d --- a/gen/LLVMGen.d Sat Apr 19 19:31:28 2008 +0200 +++ b/gen/LLVMGen.d Sat Apr 19 22:19:14 2008 +0200 @@ -213,8 +213,7 @@ return b.buildNeg(target, "neg"); case ExpType.AssignExp: auto assignExp = cast(AssignExp)exp; - buildAssign(exp.env.find(assignExp.identifier), assignExp.exp); - return null; + return buildAssign(exp.env.find(assignExp.identifier), assignExp.exp); case ExpType.CallExp: auto callExp = cast(CallExp)exp; auto func_sym = exp.env.find(cast(Identifier)callExp.exp); @@ -238,7 +237,7 @@ case StmtType.Return: auto ret = cast(ReturnStmt)stmt; auto sym = stmt.env.parentFunction(); - Type t = typeToLLVM[sym.type.get]; + Type t = typeToLLVM[sym.type.name]; Value v = genExpression(ret.exp); if (v.type != t) { @@ -328,9 +327,9 @@ } } - private void buildAssign(Symbol sym, Exp exp) + private Value buildAssign(Symbol sym, Exp exp) { - Type t = typeToLLVM[sym.type.get]; + Type t = typeToLLVM[sym.type.name]; auto name = sym.id.get; auto AI = table.find(name); Value v = genExpression(exp); @@ -347,7 +346,7 @@ else v = b.buildTrunc(v, t, ".cast"); } - b.buildStore(v, AI); + return b.buildStore(v, AI); } private: diff -r 14c1abba773f -r b4dc2b2c0e38 sema/DType.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sema/DType.d Sat Apr 19 22:19:14 2008 +0200 @@ -0,0 +1,65 @@ +module sema.DType; + +import tango.text.Util : jhash; + +import sema.SymbolTable; + +class DType +{ + Identifier id; + Scope sc; + DType actual; + + this(Identifier id, Scope sc, DType actual = null) + { + this.id = id; + this.sc = sc; + if (actual is null) + this.actual = this; + _name = id.get; + } + + int opEquals(Object o) + { + if (auto t = cast(DType)o) + return this.actual is t.actual; + return 0; + } + + int opCmp(Object o) + { + if (auto t = cast(DType)o) + return cast(void*)this.actual - cast(void*)t.actual; + return 0; + } + + hash_t toHash() + { + return cast(hash_t)(cast(void*)this); + } + + char[] name() { return _name; } + +private: + char[] _name; +} + +class DStruct : DType +{ + this(Identifier id, Scope sc, DType actual = null) + { + super(id, sc, actual); + } + DType[] members; +} + +class DFunction : DType +{ + this(Identifier id, Scope sc, DType actual = null) + { + super(id, sc, actual); + } + DType[] params; + DType return_type; +} + diff -r 14c1abba773f -r b4dc2b2c0e38 sema/SymbolTable.d --- a/sema/SymbolTable.d Sat Apr 19 19:31:28 2008 +0200 +++ b/sema/SymbolTable.d Sat Apr 19 22:19:14 2008 +0200 @@ -2,7 +2,8 @@ import tango.io.Stdout; -import lexer.Token; +import lexer.Token, + sema.DType; import ast.Exp : Identifier; @@ -93,6 +94,6 @@ class Symbol { Identifier id; - Identifier type; + DType type; } diff -r 14c1abba773f -r b4dc2b2c0e38 sema/SymbolTableBuilder.d --- a/sema/SymbolTableBuilder.d Sat Apr 19 19:31:28 2008 +0200 +++ b/sema/SymbolTableBuilder.d Sat Apr 19 22:19:14 2008 +0200 @@ -3,7 +3,9 @@ import tango.io.Stdout, tango.core.Array : find; -public import sema.SymbolTable; +public +import sema.SymbolTable, + sema.DType; import sema.Visitor; @@ -41,7 +43,7 @@ override void visitFuncDecl(FuncDecl d) { auto sym = current().add(d.identifier); - sym.type = d.type; + sym.type = new DType(d.type, current()); visitExp(d.type); visitExp(d.identifier); d.env = current(); @@ -66,7 +68,7 @@ auto sc = current(); auto sym = sc.add(d.identifier); - sym.type = d.type; + sym.type = new DType(d.type, sc); d.env = sc; visitExp(d.type); visitExp(d.identifier);