Mercurial > projects > ldc
view dmd2/dump.c @ 1605:1d5721f9ae18
[WIP] Merge DMD r251: bugzilla 111 (appending a dchar to a char[])
This patch needs some work in the code generation, because of the runtime
changes (functions "_d_arrayappendcd" and "_d_arrayappendwd" are added).
This doesn't affect existing code though, it just makes with patch
a little useless, because something like this:
char [] s;
s ~= '\u6211';
That failed to compile with a nice error message previously to this
change, now fails with and ugly error message (a failed assertion).
Apparently there is a regression introduced by this patch too, when
compiling Dil I get this assertion message:
ldc: /home/luca/tesis/ldc/gen/statements.cpp:132: virtual void ReturnStatement::toIR(IRState*): Assertion `p->topfunc()->getReturnType() == llvm::Type::getVoidTy(gIR->context())' failed.
0 ldc 0x08a91628
Thank god we have bisecting capabilities in VCSs now ;)
---
dmd/expression.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 41 insertions(+), 6 deletions(-)
author | Leandro Lucarella <llucax@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 15:18:19 -0300 |
parents | 638d16625da2 |
children |
line wrap: on
line source
// Compiler implementation of the D programming language // Copyright (c) 1999-2006 by Digital Mars // All Rights Reserved // written by Walter Bright // http://www.digitalmars.com // License for redistribution is by either the Artistic License // in artistic.txt, or the GNU General Public License in gnu.txt. // See the included readme.txt for details. #include <stdio.h> #include <ctype.h> #include <assert.h> #include "mars.h" #include "mtype.h" #include "declaration.h" #include "expression.h" #include "template.h" static void indent(int indent) { int i; for (i = 0; i < indent; i++) printf(" "); } static char *type_print(Type *type) { return type ? type->toChars() : (char *) "null"; } void dumpExpressions(int i, Expressions *exps) { for (size_t j = 0; j < exps->dim; j++) { Expression *e = (Expression *)exps->data[j]; indent(i); printf("(\n"); e->dump(i + 2); indent(i); printf(")\n"); } } void Expression::dump(int i) { indent(i); printf("%p %s type=%s\n", this, Token::toChars(op), type_print(type)); } void IntegerExp::dump(int i) { indent(i); printf("%p %jd type=%s\n", this, (intmax_t)value, type_print(type)); } void IdentifierExp::dump(int i) { indent(i); printf("%p ident '%s' type=%s\n", this, ident->toChars(), type_print(type)); } void DsymbolExp::dump(int i) { indent(i); printf("%p %s type=%s\n", this, s->toChars(), type_print(type)); } void VarExp::dump(int i) { indent(i); printf("%p %s var=%s type=%s\n", this, Token::toChars(op), var->toChars(), type_print(type)); } void UnaExp::dump(int i) { indent(i); printf("%p %s type=%s e1=%p\n", this, Token::toChars(op), type_print(type), e1); if (e1) e1->dump(i + 2); } void CallExp::dump(int i) { UnaExp::dump(i); dumpExpressions(i, arguments); } void SliceExp::dump(int i) { indent(i); printf("%p %s type=%s e1=%p\n", this, Token::toChars(op), type_print(type), e1); if (e1) e1->dump(i + 2); if (lwr) lwr->dump(i + 2); if (upr) upr->dump(i + 2); } void DotIdExp::dump(int i) { indent(i); printf("%p %s type=%s ident=%s e1=%p\n", this, Token::toChars(op), type_print(type), ident->toChars(), e1); if (e1) e1->dump(i + 2); } void DotVarExp::dump(int i) { indent(i); printf("%p %s type=%s var='%s' e1=%p\n", this, Token::toChars(op), type_print(type), var->toChars(), e1); if (e1) e1->dump(i + 2); } void DotTemplateInstanceExp::dump(int i) { indent(i); printf("%p %s type=%s ti='%s' e1=%p\n", this, Token::toChars(op), type_print(type), ti->toChars(), e1); if (e1) e1->dump(i + 2); } void DelegateExp::dump(int i) { indent(i); printf("%p %s func=%s type=%s e1=%p\n", this, Token::toChars(op), func->toChars(), type_print(type), e1); if (e1) e1->dump(i + 2); } void BinExp::dump(int i) { indent(i); printf("%p %s type=%s e1=%p e2=%p\n", this, Token::toChars(op), type_print(type), e1, e2); if (e1) e1->dump(i + 2); if (e2) e2->dump(i + 2); }