Fix cases where goto skips initialization of variables

This commit is contained in:
Daniel Murphy 2013-11-20 00:20:33 +11:00
parent 19bed560cd
commit 1754eed7f6
3 changed files with 58 additions and 58 deletions

View file

@ -5137,6 +5137,7 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
} }
//printf("formatArg(fc = '%c', m = '%c')\n", fc, m); //printf("formatArg(fc = '%c', m = '%c')\n", fc, m);
int mi;
switch (m) switch (m)
{ {
case Mangle.Tbool: case Mangle.Tbool:
@ -5279,7 +5280,7 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
return; return;
case Mangle.Tarray: case Mangle.Tarray:
int mi = 10; mi = 10;
if (typeid(ti).name.length == 14 && if (typeid(ti).name.length == 14 &&
typeid(ti).name[9..14] == "Array") typeid(ti).name[9..14] == "Array")
{ // array of non-primitive types { // array of non-primitive types
@ -5325,8 +5326,7 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
case Mangle.Tdchar: case Mangle.Tdchar:
LarrayDchar: LarrayDchar:
auto sd = va_arg!(dstring)(argptr); s = toUTF8(va_arg!(dstring)(argptr));
s = toUTF8(sd);
Lputstr: Lputstr:
if (fc != 's') if (fc != 's')
throw new FormatException("string"); throw new FormatException("string");
@ -5501,28 +5501,30 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
} }
} }
ptrdiff_t n = tmpbuf.length; {
char c; ptrdiff_t n = tmpbuf.length;
int hexoffset = uc ? ('A' - ('9' + 1)) : ('a' - ('9' + 1)); char c;
int hexoffset = uc ? ('A' - ('9' + 1)) : ('a' - ('9' + 1));
while (vnumber) while (vnumber)
{ {
c = cast(char)((vnumber % base) + '0'); c = cast(char)((vnumber % base) + '0');
if (c > '9') if (c > '9')
c += hexoffset; c += hexoffset;
vnumber /= base; vnumber /= base;
tmpbuf[--n] = c; tmpbuf[--n] = c;
}
if (tmpbuf.length - n < precision && precision < tmpbuf.length)
{
ptrdiff_t m = tmpbuf.length - precision;
tmpbuf[m .. n] = '0';
n = m;
}
else if (flags & FLhash && fc == 'o')
prefix = "0";
putstr(tmpbuf[n .. tmpbuf.length]);
return;
} }
if (tmpbuf.length - n < precision && precision < tmpbuf.length)
{
ptrdiff_t m = tmpbuf.length - precision;
tmpbuf[m .. n] = '0';
n = m;
}
else if (flags & FLhash && fc == 'o')
prefix = "0";
putstr(tmpbuf[n .. tmpbuf.length]);
return;
Lreal: Lreal:
putreal(vreal); putreal(vreal);

View file

@ -228,37 +228,41 @@ class MmFile
dwCreationDisposition, dwCreationDisposition,
FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL,
cast(HANDLE)null); cast(HANDLE)null);
if (hFile == INVALID_HANDLE_VALUE)
goto err1;
} }
else else
hFile = null; hFile = null;
int hi = cast(int)(size>>32); hFileMap = null;
hFileMap = CreateFileMappingA(hFile, null, flProtect, if (hFile != INVALID_HANDLE_VALUE)
hi, cast(uint)size, null);
if (hFileMap == null) // mapping failed
goto err1;
if (size == 0)
{ {
uint sizehi; int hi = cast(int)(size>>32);
uint sizelow = GetFileSize(hFile,&sizehi); hFileMap = CreateFileMappingA(hFile, null, flProtect,
size = (cast(ulong)sizehi << 32) + sizelow; hi, cast(uint)size, null);
} }
this.size = size; if (hFileMap != null) // mapping didn't fail
{
size_t initial_map = (window && 2*window<size) if (size == 0)
? 2*window : cast(size_t)size; {
p = MapViewOfFileEx(hFileMap, dwDesiredAccess, 0, 0, uint sizehi;
initial_map, address); uint sizelow = GetFileSize(hFile,&sizehi);
if (!p) goto err1; size = (cast(ulong)sizehi << 32) + sizelow;
data = p[0 .. initial_map]; }
this.size = size;
debug (MMFILE) printf("MmFile.this(): p = %p, size = %d\n", p, size); size_t initial_map = (window && 2*window<size)
return; ? 2*window : cast(size_t)size;
p = MapViewOfFileEx(hFileMap, dwDesiredAccess, 0, 0,
initial_map, address);
if (p)
{
data = p[0 .. initial_map];
debug (MMFILE) printf("MmFile.this(): p = %p, size = %d\n", p, size);
return;
}
}
err1:
if (hFileMap != null) if (hFileMap != null)
CloseHandle(hFileMap); CloseHandle(hFileMap);
hFileMap = null; hFileMap = null;

View file

@ -401,7 +401,7 @@ size_t uriLength(string s)
size_t i; size_t i;
if (s.length <= 4) if (s.length <= 4)
goto Lno; return -1;
if (s.length > 7 && std.string.icmp(s[0 .. 7], "http://") == 0) { if (s.length > 7 && std.string.icmp(s[0 .. 7], "http://") == 0) {
i = 7; i = 7;
@ -411,7 +411,7 @@ size_t uriLength(string s)
if (s.length > 8 && std.string.icmp(s[0 .. 8], "https://") == 0) if (s.length > 8 && std.string.icmp(s[0 .. 8], "https://") == 0)
i = 8; i = 8;
else else
goto Lno; return -1;
} }
// if (icmp(s[0 .. 4], "www.") == 0) // if (icmp(s[0 .. 4], "www.") == 0)
// i = 4; // i = 4;
@ -436,12 +436,9 @@ size_t uriLength(string s)
} }
//if (!lastdot || (i - lastdot != 3 && i - lastdot != 4)) //if (!lastdot || (i - lastdot != 3 && i - lastdot != 4))
if (!lastdot) if (!lastdot)
goto Lno; return -1;
return i; return i;
Lno:
return -1;
} }
unittest unittest
@ -466,19 +463,19 @@ size_t emailLength(string s)
size_t i; size_t i;
if (!isAlpha(s[0])) if (!isAlpha(s[0]))
goto Lno; return -1;
for (i = 1; 1; i++) for (i = 1; 1; i++)
{ {
if (i == s.length) if (i == s.length)
goto Lno; return -1;
auto c = s[i]; auto c = s[i];
if (isAlphaNum(c)) if (isAlphaNum(c))
continue; continue;
if (c == '-' || c == '_' || c == '.') if (c == '-' || c == '_' || c == '.')
continue; continue;
if (c != '@') if (c != '@')
goto Lno; return -1;
i++; i++;
break; break;
} }
@ -501,12 +498,9 @@ size_t emailLength(string s)
break; break;
} }
if (!lastdot || (i - lastdot != 3 && i - lastdot != 4)) if (!lastdot || (i - lastdot != 3 && i - lastdot != 4))
goto Lno; return -1;
return i; return i;
Lno:
return -1;
} }
unittest unittest