Mercurial > projects > ldc
view dmd2/lstring.c @ 920:545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Fixed align N; in asm blocks.
Fixed inreg parameter passing on x86 for ref/out params.
Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P
Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 03 Feb 2009 08:54:57 +0100 |
parents | 356e65836fb5 |
children |
line wrap: on
line source
// lstring.c // 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. #include <stdlib.h> #include "dchar.h" #include "mem.h" #include "lstring.h" #ifdef _MSC_VER // prevent compiler internal crash Lstring Lstring::zero; #else Lstring Lstring::zero = LSTRING_EMPTY(); #endif Lstring *Lstring::ctor(const dchar *p, unsigned length) { Lstring *s; s = alloc(length); memcpy(s->string, p, length * sizeof(dchar)); return s; } Lstring *Lstring::alloc(unsigned length) { Lstring *s; s = (Lstring *)mem.malloc(size(length)); s->length = length; s->string[length] = 0; return s; } Lstring *Lstring::append(const Lstring *s) { Lstring *t; if (!s->length) return this; t = alloc(length + s->length); memcpy(t->string, string, length * sizeof(dchar)); memcpy(t->string + length, s->string, s->length * sizeof(dchar)); return t; } Lstring *Lstring::substring(int start, int end) { Lstring *t; if (start == end) return &zero; t = alloc(end - start); memcpy(t->string, string + start, (end - start) * sizeof(dchar)); return t; }