diff -r 5df4a112967d -r 0c588a96837c src/compiler/SemanticAnalysis.cpp --- a/src/compiler/SemanticAnalysis.cpp Mon Nov 19 01:13:44 2012 -0800 +++ b/src/compiler/SemanticAnalysis.cpp Mon Nov 19 02:12:13 2012 -0800 @@ -193,6 +193,7 @@ for (size_t i = 0; i < node->statements()->length(); i++) { Statement *stmt = node->statements()->at(i); + __ note_position(stmt->pos()); stmt->accept(this); assert(__ stackDepth() == 0); } @@ -395,7 +396,7 @@ if (!left || !right) return; - hir_ = binary(node->token(), left, right); + hir_ = binary(node, node->token(), left, right); } bool @@ -432,18 +433,18 @@ Scope *in = sym->scope(); switch (in->kind()) { case Scope::GLOBAL: - hir_ = new (pool_) HGlobal(sym); + hir_ = new (pool_) HGlobal(proxy, sym); return; case Scope::FUNCTION: assert(var->storage() == VariableSymbol::Arg); - hir_ = new (pool_) HLocal(var); + hir_ = new (pool_) HLocal(proxy, var); return; default: assert(in->kind() == Scope::BLOCK); assert(var->storage() == VariableSymbol::Local); - hir_ = new (pool_) HLocal(var); + hir_ = new (pool_) HLocal(proxy, var); return; } } @@ -452,14 +453,14 @@ SemanticAnalysis::visitIntegerLiteral(IntegerLiteral *lit) { Local type(zone_, zone_->types()->getPrimitive(PrimitiveType_Int32)); - hir_ = new (pool_) HInteger(type, lit->value()); + hir_ = new (pool_) HInteger(lit, type, lit->value()); } void SemanticAnalysis::visitFloatLiteral(FloatLiteral *node) { Local type(zone_, zone_->types()->getPrimitive(PrimitiveType_Float)); - hir_ = new (pool_) HFloat(type, (float)node->value()); + hir_ = new (pool_) HFloat(node, type, (float)node->value()); } void @@ -530,7 +531,7 @@ return; } - hir_ = new (pool_) HCall(fun->returnType(), callee, args); + hir_ = new (pool_) HCall(node, fun->returnType(), callee, args); } void @@ -544,7 +545,7 @@ if ((hir = coerce(hir, lval->type(), Coerce_Assign)) == NULL) return; - hir_ = new (pool_) HStore(node->token(), lval, hir); + hir_ = new (pool_) HStore(node, node->token(), lval, hir); } void @@ -593,7 +594,8 @@ return; } - hir_ = new (pool_) HIndex(ArrayType::cast(left->type())->contained(), + hir_ = new (pool_) HIndex(node, + ArrayType::cast(left->type())->contained(), left, right); } @@ -612,14 +614,14 @@ HIR *rval; if (lval->type()->isInt32()) - rval = new (pool_) HInteger(lval->type(), 1); + rval = new (pool_) HInteger(node, lval->type(), 1); else - rval = new (pool_) HFloat(lval->type(), 1.0); + rval = new (pool_) HFloat(node, lval->type(), 1.0); if (node->postfix()) - hir_ = new (pool_) HPostIncDec(node->token(), lval, rval); + hir_ = new (pool_) HPostIncDec(node, node->token(), lval, rval); else - hir_ = new (pool_) HStore(node->token(), lval, rval); + hir_ = new (pool_) HStore(node, node->token(), lval, rval); } Type * @@ -730,15 +732,17 @@ Handle from = hir->type(); if (from->isInt32() && to->isFloat()) - return new (pool_) HConvert(to, OP_CVT_I2F, hir); + return new (pool_) HConvert(hir->node(), to, OP_CVT_I2F, hir); if (from->isInt32() && to->isBool()) - return new (pool_) HConvert(to, OP_CVT_I2B, hir); + return new (pool_) HConvert(hir->node(), to, OP_CVT_I2B, hir); if (to->isArray()) { if (!typeCheckArray(SourcePosition(), from, to, kind)) return NULL; return hir; } + + assert(from == to); return hir; } @@ -755,7 +759,7 @@ } HIR * -SemanticAnalysis::binary(TokenKind token, HIR *left, HIR *right) +SemanticAnalysis::binary(AstNode *node, TokenKind token, HIR *left, HIR *right) { Local coercion(zone_, coercionType(token, left, right)); if (!coercion) @@ -777,7 +781,7 @@ case TOK_SHR: case TOK_USHR: case TOK_SHL: - return new (pool_) HBinary(left->type(), token, left, right); + return new (pool_) HBinary(node, left->type(), token, left, right); case TOK_EQUALS: case TOK_NOTEQUALS: @@ -789,7 +793,7 @@ case TOK_OR: { Local result(zone_, zone_->types()->getPrimitive(PrimitiveType_Bool)); - return new (pool_) HBinary(result, token, left, right); + return new (pool_) HBinary(node, result, token, left, right); } default: @@ -857,7 +861,7 @@ if (!left || !right) return; - HIR *hir = binary(bin->token(), left, right); + HIR *hir = binary(bin, bin->token(), left, right); if (!hir) return; if ((hir = coerce(hir, boolType, Coerce_Assign)) == NULL)