Mercurial > projects > ldc
changeset 761:fa306ca8843b
Applied fvbommel's patch from #112
Added missing TypeInfoInvariant codegen for D2
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Wed, 12 Nov 2008 02:30:28 +0100 |
parents | 6f33b427bfd1 |
children | d7aae6f09754 |
files | dmd/root.c dmd2/root.c gen/typinf.cpp |
diffstat | 3 files changed, 29 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/dmd/root.c Wed Nov 12 00:19:18 2008 +0100 +++ b/dmd/root.c Wed Nov 12 02:30:28 2008 +0100 @@ -1613,6 +1613,11 @@ unsigned psize; int count; + // On some platforms (i.e. x86_64) va_list is an array and thus passed by + // reference. Copy the input list so we can copy it back before retrying. + va_list orig_args; + va_copy(orig_args, args); + p = buffer; psize = sizeof(buffer); for (;;) @@ -1622,8 +1627,7 @@ if (count != -1) break; psize *= 2; -#endif -#if POSIX +#elif POSIX count = vsnprintf(p,psize,format,args); if (count == -1) psize *= 2; @@ -1632,6 +1636,7 @@ else break; #endif + va_copy(args, orig_args); p = (char *) alloca(psize); // buffer too small, try again with larger size } write(p,count);
--- a/dmd2/root.c Wed Nov 12 00:19:18 2008 +0100 +++ b/dmd2/root.c Wed Nov 12 02:30:28 2008 +0100 @@ -1613,6 +1613,11 @@ unsigned psize; int count; + // On some platforms (i.e. x86_64) va_list is an array and thus passed by + // reference. Copy the input list so we can copy it back before retrying. + va_list orig_args; + va_copy(orig_args, args); + p = buffer; psize = sizeof(buffer); for (;;) @@ -1622,8 +1627,7 @@ if (count != -1) break; psize *= 2; -#endif -#if POSIX +#elif POSIX count = vsnprintf(p,psize,format,args); if (count == -1) psize *= 2; @@ -1632,6 +1636,7 @@ else break; #endif + va_copy(args, orig_args); p = (char *) alloca(psize); // buffer too small, try again with larger size } write(p,count);
--- a/gen/typinf.cpp Wed Nov 12 00:19:18 2008 +0100 +++ b/gen/typinf.cpp Wed Nov 12 02:30:28 2008 +0100 @@ -1229,45 +1229,32 @@ assert(0); } -// void TypeInfoConstDeclaration::toDt(dt_t **pdt) -// { -// //printf("TypeInfoConstDeclaration::toDt() %s\n", toChars()); -// dtxoff(pdt, Type::typeinfoconst->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Const -// dtdword(pdt, 0); // monitor -// Type *tm = tinfo->mutableOf(); -// tm = tm->merge(); -// tm->getTypeInfo(NULL); -// dtxoff(pdt, tm->vtinfo->toSymbol(), 0, TYnptr); -// } - /////////////////////////////////////////////////////////// /* ========================================================================= */ -void TypeInfoInvariantDeclaration::toDt(dt_t **pdt) -{ - assert(0 && "TypeInfoInvariantDeclaration::toDt"); -} - void TypeInfoInvariantDeclaration::llvmDeclare() { - assert(0 && "TypeInfoInvariantDeclaration::llvmDeclare"); + Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars()); + LOG_SCOPE; + + LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoinvariant); } void TypeInfoInvariantDeclaration::llvmDefine() { - assert(0 && "TypeInfoInvariantDeclaration::llvmDeclare"); + Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars()); + LOG_SCOPE; + + Type *tm = tinfo->mutableOf(); + tm = tm->merge(); + + LLVM_D_Define_TypeInfoBase(tm, this, Type::typeinfoinvariant); } -// void TypeInfoInvariantDeclaration::toDt(dt_t **pdt) -// { -// //printf("TypeInfoInvariantDeclaration::toDt() %s\n", toChars()); -// dtxoff(pdt, Type::typeinfoinvariant->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Invariant -// dtdword(pdt, 0); // monitor -// Type *tm = tinfo->mutableOf(); -// tm = tm->merge(); -// tm->getTypeInfo(NULL); -// dtxoff(pdt, tm->vtinfo->toSymbol(), 0, TYnptr); -// } +void TypeInfoInvariantDeclaration::toDt(dt_t **pdt) +{ + assert(0); +} #endif \ No newline at end of file