diff -uNr dmd-0.170/dmd/src/dmd/aggregate.h dmd-0.171/dmd/src/dmd/aggregate.h --- dmd-0.170/dmd/src/dmd/aggregate.h 2006-10-05 17:01:58.000000000 +0200 +++ dmd-0.171/dmd/src/dmd/aggregate.h 2006-10-17 21:40:28.000000000 +0200 @@ -163,6 +163,7 @@ FuncDeclaration *staticCtor; FuncDeclaration *staticDtor; Array vtbl; // Array of FuncDeclaration's making up the vtbl[] + Array vtblFinal; // More FuncDeclaration's that aren't in vtbl[] BaseClasses baseclasses; // Array of BaseClass's; first is super, // rest are Interface's diff -uNr dmd-0.170/dmd/src/dmd/class.c dmd-0.171/dmd/src/dmd/class.c --- dmd-0.170/dmd/src/dmd/class.c 2006-10-15 20:04:58.000000000 +0200 +++ dmd-0.171/dmd/src/dmd/class.c 2006-10-17 21:41:28.000000000 +0200 @@ -722,19 +722,24 @@ { //printf("ClassDeclaration::findFunc(%s, %s) %s\n", ident->toChars(), tf->toChars(), toChars()); - for (size_t i = 0; i < vtbl.dim; i++) + Array *vtbl = &this->vtbl; + for (int j = 0; j < 2; j++) { - FuncDeclaration *fd = (FuncDeclaration *)vtbl.data[i]; + for (size_t i = 0; i < vtbl->dim; i++) + { + FuncDeclaration *fd = (FuncDeclaration *)vtbl->data[i]; - //printf("\t[%d] = %s\n", i, fd->toChars()); - if (ident == fd->ident && - //tf->equals(fd->type) - fd->type->covariant(tf) == 1 - ) - { //printf("\t\tfound\n"); - return fd; + //printf("\t[%d] = %s\n", i, fd->toChars()); + if (ident == fd->ident && + //tf->equals(fd->type) + fd->type->covariant(tf) == 1 + ) + { //printf("\t\tfound\n"); + return fd; + } + //else printf("\t\t%d\n", fd->type->covariant(tf)); } - //else printf("\t\t%d\n", fd->type->covariant(tf)); + vtbl = &this->vtblFinal; } return NULL; diff -uNr dmd-0.170/dmd/src/dmd/func.c dmd-0.171/dmd/src/dmd/func.c --- dmd-0.170/dmd/src/dmd/func.c 2006-10-10 19:26:58.000000000 +0200 +++ dmd-0.171/dmd/src/dmd/func.c 2006-10-17 21:40:24.000000000 +0200 @@ -328,6 +328,7 @@ error("cannot override final function %s", f->toPrettyChars()); } } + cd->vtblFinal.push(this); } else { diff -uNr dmd-0.170/dmd/src/dmd/mars.c dmd-0.171/dmd/src/dmd/mars.c --- dmd-0.170/dmd/src/dmd/mars.c 2006-10-17 01:07:06.000000000 +0200 +++ dmd-0.171/dmd/src/dmd/mars.c 2006-10-17 20:06:40.000000000 +0200 @@ -60,7 +60,7 @@ copyright = "Copyright (c) 1999-2006 by Digital Mars"; written = "written by Walter Bright"; - version = "v0.170"; + version = "v0.171"; global.structalign = 8; memset(¶ms, 0, sizeof(Param)); diff -uNr dmd-0.170/dmd/src/phobos/internal/aApplyR.d dmd-0.171/dmd/src/phobos/internal/aApplyR.d --- dmd-0.170/dmd/src/phobos/internal/aApplyR.d 2006-10-17 02:36:12.000000000 +0200 +++ dmd-0.171/dmd/src/phobos/internal/aApplyR.d 2006-10-18 00:18:36.000000000 +0200 @@ -33,7 +33,7 @@ import std.utf; -debug=apply; +//debug=apply; /**********************************************/ /* 1 argument versions */ diff -uNr dmd-0.170/dmd/src/phobos/internal/gc/gc.d dmd-0.171/dmd/src/phobos/internal/gc/gc.d --- dmd-0.170/dmd/src/phobos/internal/gc/gc.d 2006-10-17 02:36:12.000000000 +0200 +++ dmd-0.171/dmd/src/phobos/internal/gc/gc.d 2006-10-18 00:18:38.000000000 +0200 @@ -489,7 +489,7 @@ } //printf("newsize = %x, newlength = %x\n", newsize, newlength); - if (p.length) + if (p.data) { newdata = p.data; if (newlength > p.length) @@ -569,7 +569,7 @@ //printf("newsize = %x, newlength = %x\n", newsize, newlength); size_t size = p.length * sizeelem; - if (p.length) + if (p.data) { newdata = p.data; if (newlength > p.length) @@ -674,7 +674,7 @@ //printf("newsize = %x, newlength = %x\n", newsize, newlength); size_t size = p.length * sizeelem; - if (p.length) + if (p.data) { newdata = p.data; if (newlength > p.length)