Mercurial > projects > ldc
view dmd2/root/lstring.h @ 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
// lstring.h // length-prefixed strings // Copyright (c) 1999-2002 by Digital Mars // All Rights Reserved // written by Walter Bright // 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. #ifndef LSTRING_H #define LSTRING_H 1 #include "dchar.h" struct Lstring { unsigned length; // Disable warning about nonstandard extension #pragma warning (disable : 4200) dchar string[]; static Lstring zero; // 0 length string // No constructors because we want to be able to statically // initialize Lstring's, and Lstrings are of variable size. #if M_UNICODE #define LSTRING(p,length) { length, L##p } #else #define LSTRING(p,length) { length, p } #endif #if __GNUC__ #define LSTRING_EMPTY() { 0 } #else #define LSTRING_EMPTY() LSTRING("", 0) #endif static Lstring *ctor(const dchar *p) { return ctor(p, Dchar::len(p)); } static Lstring *ctor(const dchar *p, unsigned length); static unsigned size(unsigned length) { return sizeof(Lstring) + (length + 1) * sizeof(dchar); } static Lstring *alloc(unsigned length); Lstring *clone(); unsigned len() { return length; } dchar *toDchars() { return string; } hash_t hash() { return Dchar::calcHash(string, length); } hash_t ihash() { return Dchar::icalcHash(string, length); } static int cmp(const Lstring *s1, const Lstring *s2) { int c = s2->length - s1->length; return c ? c : Dchar::memcmp(s1->string, s2->string, s1->length); } static int icmp(const Lstring *s1, const Lstring *s2) { int c = s2->length - s1->length; return c ? c : Dchar::memicmp(s1->string, s2->string, s1->length); } Lstring *append(const Lstring *s); Lstring *substring(int start, int end); }; #endif