[svn r179] lots and lots of fixes, much more of tango now compiles/works.

This commit is contained in:
Tomas Lindquist Olsen
2008-05-05 07:36:29 +02:00
parent 06362014f4
commit a0c6cb6673
19 changed files with 225 additions and 95 deletions

View File

@@ -3528,6 +3528,10 @@ Expression *VarExp::semantic(Scope *sc)
#endif
}
// LLVMDC: Fixes bug 1161, http://d.puremagic.com/issues/show_bug.cgi?id=1161
// check access to VarDeclaration
accessCheck(loc, sc, NULL, var);
VarDeclaration *v = var->isVarDeclaration();
if (v)
{

View File

@@ -81,19 +81,19 @@ DValue* DtoAAIndex(Type* type, DValue* aa, DValue* key)
llvm::Value* keyti = to_keyti(key);
keyti = DtoBitCast(keyti, funcTy->getParamType(1));
// pkey param
llvm::Value* pkey = to_pkey(key);
pkey = DtoBitCast(pkey, funcTy->getParamType(2));
// valuesize param
llvm::Value* valsize = DtoConstSize_t(getABITypeSize(DtoType(type)));
// pkey param
llvm::Value* pkey = to_pkey(key);
pkey = DtoBitCast(pkey, funcTy->getParamType(3));
// build arg vector
std::vector<llvm::Value*> args;
args.push_back(aaval);
args.push_back(keyti);
args.push_back(pkey);
args.push_back(valsize);
args.push_back(pkey);
// call runtime
llvm::Value* ret = gIR->ir->CreateCall(func, args.begin(), args.end(), "aa.index");

View File

@@ -615,20 +615,17 @@ void DtoCatArrayElement(llvm::Value* arr, Expression* exp1, Expression* exp2)
exp2 = e;
}
assert(t1->ty == Tarray);
assert(t2 == DtoDType(t1->next));
DValue* e1 = exp1->toElem(gIR);
DValue* e2 = exp2->toElem(gIR);
llvm::Value *len1, *src1, *res;
llvm::Value* a = e1->getRVal();
len1 = gIR->ir->CreateLoad(DtoGEPi(a,0,0,"tmp"),"tmp");
len1 = DtoArrayLen(e1);
res = gIR->ir->CreateAdd(len1,DtoConstSize_t(1),"tmp");
llvm::Value* mem = DtoNewDynArray(arr, res, DtoDType(t1->next), false);
src1 = gIR->ir->CreateLoad(DtoGEPi(a,0,1,"tmp"),"tmp");
src1 = DtoArrayPtr(e1);
DtoMemCpy(mem,src1,len1);
@@ -641,6 +638,7 @@ void DtoCatArrayElement(llvm::Value* arr, Expression* exp1, Expression* exp2)
// helper for eq and cmp
static llvm::Value* DtoArrayEqCmp_impl(const char* func, DValue* l, DValue* r, bool useti)
{
Logger::println("comparing arrays");
llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, func);
assert(fn);
@@ -648,6 +646,7 @@ static llvm::Value* DtoArrayEqCmp_impl(const char* func, DValue* l, DValue* r, b
llvm::Value* rmem;
// cast static arrays to dynamic ones, this turns them into DSliceValues
Logger::println("casting to dynamic arrays");
Type* l_ty = DtoDType(l->getType());
Type* r_ty = DtoDType(r->getType());
assert(l_ty->next == r_ty->next);
@@ -659,24 +658,43 @@ static llvm::Value* DtoArrayEqCmp_impl(const char* func, DValue* l, DValue* r, b
r = DtoCastArray(r, a_ty);
}
Logger::println("giving storage");
// we need to give slices storage
if (l->isSlice()) {
lmem = new llvm::AllocaInst(DtoType(l->getType()), "tmpparam", gIR->topallocapoint());
DtoSetArray(lmem, DtoArrayLen(l), DtoArrayPtr(l));
}
// also null
else if (l->isNull())
{
lmem = new llvm::AllocaInst(DtoType(l->getType()), "tmpparam", gIR->topallocapoint());
DtoSetArray(lmem, llvm::Constant::getNullValue(DtoSize_t()), llvm::Constant::getNullValue(DtoType(l->getType()->next->pointerTo())));
}
else
lmem = l->getRVal();
// and for the rvalue ...
// we need to give slices storage
if (r->isSlice()) {
rmem = new llvm::AllocaInst(DtoType(r->getType()), "tmpparam", gIR->topallocapoint());
DtoSetArray(rmem, DtoArrayLen(r), DtoArrayPtr(r));
}
// also null
else if (r->isNull())
{
rmem = new llvm::AllocaInst(DtoType(r->getType()), "tmpparam", gIR->topallocapoint());
DtoSetArray(rmem, llvm::Constant::getNullValue(DtoSize_t()), llvm::Constant::getNullValue(DtoType(r->getType()->next->pointerTo())));
}
else
rmem = r->getRVal();
const llvm::Type* pt = fn->getFunctionType()->getParamType(0);
std::vector<llvm::Value*> args;
Logger::cout() << "bitcasting to " << *pt << '\n';
Logger::cout() << *lmem << '\n';
Logger::cout() << *rmem << '\n';
args.push_back(DtoBitCast(lmem,pt));
args.push_back(DtoBitCast(rmem,pt));
@@ -905,8 +923,7 @@ DValue* DtoCastArray(DValue* u, Type* to)
if (totype->ty == Tpointer) {
Logger::cout() << "to pointer" << '\n';
assert(fromtype->next == totype->next || totype->next->ty == Tvoid);
llvm::Value* ptr = DtoGEPi(u->getRVal(),0,1,"tmp",gIR->scopebb());
rval = new llvm::LoadInst(ptr, "tmp", gIR->scopebb());
rval = DtoArrayPtr(u);
if (fromtype->next != totype->next)
rval = gIR->ir->CreateBitCast(rval, getPtrToType(llvm::Type::Int8Ty), "tmp");
}

View File

@@ -1094,13 +1094,13 @@ llvm::Value* DtoIndexClass(llvm::Value* ptr, ClassDeclaration* cd, Type* t, unsi
if (idxs.empty())
idxs.push_back(0);
const llvm::Type* llt = getPtrToType(DtoType(t));
const llvm::Type* st = DtoType(cd->type);
if (ptr->getType() != st) {
assert(gIR->irDsymbol[cd].irStruct->hasUnions);
//assert(gIR->irDsymbol[cd].irStruct->hasUnions);
ptr = gIR->ir->CreateBitCast(ptr, st, "tmp");
}
const llvm::Type* llt = getPtrToType(DtoType(t));
unsigned dataoffset = 2;
IrStruct* irstruct = gIR->irDsymbol[cd].irStruct;

View File

@@ -384,11 +384,11 @@ void DtoDeclareFunction(FuncDeclaration* fdecl)
}
// static ctor
if (fdecl->isStaticCtorDeclaration()) {
if (fdecl->isStaticCtorDeclaration() && fdecl->getModule() == gIR->dmodule) {
gIR->ctors.push_back(fdecl);
}
// static dtor
else if (fdecl->isStaticDtorDeclaration()) {
else if (fdecl->isStaticDtorDeclaration() && fdecl->getModule() == gIR->dmodule) {
gIR->dtors.push_back(fdecl);
}

View File

@@ -535,14 +535,14 @@ static void LLVM_D_BuildRuntimeModule()
new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
}
// void* _aaGet(AA* aa, TypeInfo keyti, void* pkey, size_t valuesize)
// void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, void* pkey)
{
std::string fname("_aaGet");
std::vector<const llvm::Type*> types;
types.push_back(aaTy);
types.push_back(typeInfoTy);
types.push_back(voidPtrTy);
types.push_back(sizeTy);
types.push_back(voidPtrTy);
const llvm::FunctionType* fty = llvm::FunctionType::get(voidPtrTy, types, false);
new llvm::Function(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
}

View File

@@ -153,6 +153,13 @@ void IfStatement::toIR(IRState* p)
Logger::println("IfStatement::toIR(): %s", loc.toChars());
LOG_SCOPE;
if (match)
{
llvm::Value* allocainst = new llvm::AllocaInst(DtoType(match->type), "._tmp_if_var", p->topallocapoint());
gIR->irDsymbol[match].irLocal = new IrLocal(match);
gIR->irDsymbol[match].irLocal->value = allocainst;
}
DValue* cond_e = condition->toElem(p);
llvm::Value* cond_val = cond_e->getRVal();
delete cond_e;

View File

@@ -212,6 +212,7 @@ DValue* VarExp::toElem(IRState* p)
else if (vd->isParameter()) {
Logger::println("function param");
if (!gIR->irDsymbol[vd].getIrValue()) {
assert(0); // should be fixed now
// TODO: determine this properly
// this happens when the DMD frontend generates by pointer wrappers for struct opEquals(S) and opCmp(S)
gIR->irDsymbol[vd].getIrValue() = &p->func()->func->getArgumentList().back();
@@ -230,8 +231,9 @@ DValue* VarExp::toElem(IRState* p)
vd->toObjFile();
DtoConstInitGlobal(vd);
}
if (!gIR->irDsymbol[vd].getIrValue() || gIR->irDsymbol[vd].getIrValue()->getType()->isAbstract()) {
if (!gIR->irDsymbol[vd].getIrValue() || DtoType(vd->type)->isAbstract()) {
Logger::println("global variable not resolved :/ %s", vd->toChars());
Logger::cout() << *DtoType(vd->type) << '\n';
assert(0);
}
return new DVarValue(vd, gIR->irDsymbol[vd].getIrValue(), true);
@@ -1503,7 +1505,7 @@ DValue* IndexExp::toElem(IRState* p)
arrptr = DtoGEP(l->getRVal(), zero, r->getRVal(),"tmp",p->scopebb());
}
else if (e1type->ty == Tarray) {
arrptr = DtoGEP(l->getLVal(),zero,one,"tmp",p->scopebb());
arrptr = DtoGEP(l->getRVal(),zero,one,"tmp",p->scopebb());
arrptr = new llvm::LoadInst(arrptr,"tmp",p->scopebb());
arrptr = new llvm::GetElementPtrInst(arrptr,r->getRVal(),"tmp",p->scopebb());
}

View File

@@ -605,7 +605,7 @@ llvm::Value* DtoGEP(llvm::Value* ptr, llvm::Value* i0, llvm::Value* i1, const st
std::vector<llvm::Value*> v(2);
v[0] = i0;
v[1] = i1;
//Logger::cout() << "DtoGEP: " << *ptr << '\n';
Logger::cout() << "DtoGEP: " << *ptr << ", " << *i0 << ", " << *i1 << '\n';
return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb());
}

View File

@@ -324,7 +324,8 @@ void Module::genmoduleinfo()
std::string m_name("_D");
m_name.append(m->mangle());
m_name.append("8__ModuleZ");
llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name, gIR->module);
llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name);
if (!m_gvar) m_gvar = new llvm::GlobalVariable(moduleinfoTy, false, llvm::GlobalValue::ExternalLinkage, NULL, m_name, gIR->module);
importInits.push_back(m_gvar);
}
}
@@ -336,7 +337,8 @@ void Module::genmoduleinfo()
std::string m_name("_D");
m_name.append(mangle());
m_name.append("9__importsZ");
llvm::GlobalVariable* m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module);
llvm::GlobalVariable* m_gvar = gIR->module->getGlobalVariable(m_name);
if (!m_gvar) m_gvar = new llvm::GlobalVariable(importArrTy, true, llvm::GlobalValue::InternalLinkage, c, m_name, gIR->module);
c = llvm::ConstantExpr::getBitCast(m_gvar, getPtrToType(importArrTy->getElementType()));
c = DtoConstSlice(DtoConstSize_t(importInits.size()), c);
}
@@ -539,6 +541,8 @@ void VarDeclaration::toObjFile()
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_type,_isconst,_linkage,NULL,_name,gIR->module);
gIR->irDsymbol[this].irGlobal->value = gvar;
Logger::cout() << *gvar << '\n';
if (static_local)
DtoConstInitGlobal(this);
else

View File

@@ -1052,6 +1052,7 @@ void TypeInfoClassDeclaration::llvmDefine()
// get classinfo
assert(tinfo->ty == Tclass);
TypeClass *tc = (TypeClass *)tinfo;
DtoForceDeclareDsymbol(tc->sym);
assert(gIR->irDsymbol[tc->sym].irStruct->classInfo);
sinits.push_back(gIR->irDsymbol[tc->sym].irStruct->classInfo);

View File

@@ -747,6 +747,7 @@ tango/tango/util/log/model/IHierarchy.d
tango/tango/util/log/model/ILevel.d
tangotests
tangotests/a.d
tangotests/aa1.d
tangotests/b.d
tangotests/c.d
tangotests/constructors.d
@@ -768,8 +769,10 @@ tangotests/q.d
tangotests/r.d
tangotests/s.d
tangotests/stdout1.d
tangotests/stdout2.d
tangotests/t.d
tangotests/vararg1.d
tangotests/vararg2.d
test
test/a.d
test/aa1.d

View File

@@ -29,6 +29,7 @@
/*
* Modified by Sean Kelly <sean@f4.ca> for use with Tango.
* Modified by Tomas Lindquist Olsen <tomas@famolsen.dk> for use with LLVMDC.
*/
private
@@ -61,13 +62,7 @@ static size_t[] prime_list = [
1610612741UL, 4294967291UL
];
/* This is the type of the return value for dynamic arrays.
* It should be a type that is returned in registers.
* Although DMD will return types of Array in registers,
* gcc will not, so we instead use a 'long'.
*/
alias long ArrayRet_t;
// This is the type of the return value for dynamic arrays.
struct Array
{
size_t length;
@@ -93,10 +88,8 @@ struct BB
* it is completely opaque.
*/
struct AA
{
BB* a;
}
// LLVMDC doesn't pass structs in registers so no need to wrap it ...
alias BB* AA;
/**********************************
* Align to next pointer boundary, so that
@@ -210,9 +203,9 @@ out (result)
}
}
if (aa.a)
if (aa)
{
foreach (e; aa.a.b)
foreach (e; aa.b)
{
if (e)
_aaLen_x(e);
@@ -224,7 +217,7 @@ out (result)
}
body
{
return aa.a ? aa.a.nodes : 0;
return aa ? aa.nodes : 0;
}
@@ -233,40 +226,41 @@ body
* Add entry for key if it is not already there.
*/
void* _aaGet(AA* aa, TypeInfo keyti, size_t valuesize, ...)
void* _aaGet(AA* aa_arg, TypeInfo keyti, size_t valuesize, void* pkey)
in
{
assert(aa);
assert(aa_arg);
}
out (result)
{
assert(result);
assert(aa.a);
assert(aa.a.b.length);
//assert(_aaInAh(*aa.a, key));
assert(*aa_arg);
assert((*aa_arg).b.length);
//assert(_aaInAh(*aa, key));
}
body
{
auto pkey = cast(void *)(&valuesize + 1);
//auto pkey = cast(void *)(&valuesize + 1);
size_t i;
aaA *e;
auto keysize = aligntsize(keyti.tsize());
if (!aa.a)
aa.a = new BB();
if (!*aa_arg)
*aa_arg = new BB();
auto aa = *aa_arg;
if (!aa.a.b.length)
if (!aa.b.length)
{
alias aaA *pa;
auto len = prime_list[0];
aa.a.b = new pa[len];
aa.b = new pa[len];
}
auto key_hash = keyti.getHash(pkey);
//printf("hash = %d\n", key_hash);
i = key_hash % aa.a.b.length;
auto pe = &aa.a.b[i];
i = key_hash % aa.b.length;
auto pe = &aa.b[i];
while ((e = *pe) !is null)
{
if (key_hash == e.hash)
@@ -292,11 +286,11 @@ body
e.hash = key_hash;
*pe = e;
auto nodes = ++aa.a.nodes;
//printf("length = %d, nodes = %d\n", (*aa.a).length, nodes);
if (nodes > aa.a.b.length * 4)
auto nodes = ++aa.nodes;
//printf("length = %d, nodes = %d\n", (*aa).length, nodes);
if (nodes > aa.b.length * 4)
{
_aaRehash(aa,keyti);
_aaRehash(aa_arg,keyti);
}
Lret:
@@ -309,22 +303,22 @@ Lret:
* Returns null if it is not already there.
*/
void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...)
void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, void *pkey)
{
//printf("_aaGetRvalue(valuesize = %u)\n", valuesize);
if (!aa.a)
if (!aa)
return null;
auto pkey = cast(void *)(&valuesize + 1);
//auto pkey = cast(void *)(&valuesize + 1);
auto keysize = aligntsize(keyti.tsize());
auto len = aa.a.b.length;
auto len = aa.b.length;
if (len)
{
auto key_hash = keyti.getHash(pkey);
//printf("hash = %d\n", key_hash);
size_t i = key_hash % len;
auto e = aa.a.b[i];
auto e = aa.b[i];
while (e !is null)
{
if (key_hash == e.hash)
@@ -349,7 +343,7 @@ void* _aaGetRvalue(AA aa, TypeInfo keyti, size_t valuesize, ...)
* !=null in aa, return pointer to value
*/
void* _aaIn(AA aa, TypeInfo keyti, ...)
void* _aaIn(AA aa, TypeInfo keyti, void *pkey)
in
{
}
@@ -359,19 +353,19 @@ out (result)
}
body
{
if (aa.a)
if (aa)
{
auto pkey = cast(void *)(&keyti + 1);
//auto pkey = cast(void *)(&keyti + 1);
//printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr);
auto len = aa.a.b.length;
//printf("_aaIn(), .length = %d, .ptr = %x\n", aa.length, cast(uint)aa.ptr);
auto len = aa.b.length;
if (len)
{
auto key_hash = keyti.getHash(pkey);
//printf("hash = %d\n", key_hash);
size_t i = key_hash % len;
auto e = aa.a.b[i];
auto e = aa.b[i];
while (e !is null)
{
if (key_hash == e.hash)
@@ -396,17 +390,17 @@ body
* If key is not in aa[], do nothing.
*/
void _aaDel(AA aa, TypeInfo keyti, ...)
void _aaDel(AA aa, TypeInfo keyti, void *pkey)
{
auto pkey = cast(void *)(&keyti + 1);
//auto pkey = cast(void *)(&keyti + 1);
aaA *e;
if (aa.a && aa.a.b.length)
if (aa && aa.b.length)
{
auto key_hash = keyti.getHash(pkey);
//printf("hash = %d\n", key_hash);
size_t i = key_hash % aa.a.b.length;
auto pe = &aa.a.b[i];
size_t i = key_hash % aa.b.length;
auto pe = &aa.b[i];
while ((e = *pe) !is null) // null means not found
{
if (key_hash == e.hash)
@@ -439,7 +433,7 @@ void _aaDel(AA aa, TypeInfo keyti, ...)
e.right = null;
}
aa.a.nodes--;
aa.nodes--;
// Should notify GC that e can be free'd now
break;
@@ -457,7 +451,7 @@ void _aaDel(AA aa, TypeInfo keyti, ...)
* Produce array of values from aa.
*/
ArrayRet_t _aaValues(AA aa, size_t keysize, size_t valuesize)
Array _aaValues(AA aa, size_t keysize, size_t valuesize)
in
{
assert(keysize == aligntsize(keysize));
@@ -486,21 +480,21 @@ body
} while (e !is null);
}
if (aa.a)
if (aa)
{
a.length = _aaLen(aa);
a.ptr = cast(byte*) gc_malloc(a.length * valuesize,
valuesize < (void*).sizeof &&
valuesize > (void).sizeof ? BlkAttr.NO_SCAN : 0);
resi = 0;
foreach (e; aa.a.b)
foreach (e; aa.b)
{
if (e)
_aaValues_x(e);
}
assert(resi == a.length);
}
return *cast(ArrayRet_t*)(&a);
return a;
}
@@ -567,10 +561,10 @@ body
}
//printf("Rehash\n");
if (paa.a)
if (*paa)
{
auto aa = paa.a;
auto len = _aaLen(*paa);
auto aa = *paa;
auto len = _aaLen(aa);
if (len)
{ size_t i;
@@ -588,12 +582,12 @@ body
_aaRehash_x(e);
}
newb.nodes = aa.nodes;
newb.nodes = (*aa).nodes;
}
*paa.a = newb;
**paa = newb;
}
return (*paa).a;
return *paa;
}
@@ -601,7 +595,7 @@ body
* Produce array of N byte keys from aa.
*/
ArrayRet_t _aaKeys(AA aa, size_t keysize)
Array _aaKeys(AA aa, size_t keysize)
{
byte[] res;
size_t resi;
@@ -625,22 +619,19 @@ ArrayRet_t _aaKeys(AA aa, size_t keysize)
auto len = _aaLen(aa);
if (!len)
return 0;
return Array();
res = (cast(byte*) gc_malloc(len * keysize,
keysize < (void*).sizeof &&
keysize > (void).sizeof ? BlkAttr.NO_SCAN : 0))[0 .. len * keysize];
resi = 0;
foreach (e; aa.a.b)
foreach (e; aa.b)
{
if (e)
_aaKeys_x(e);
}
assert(resi == len);
Array a;
a.length = len;
a.ptr = res.ptr;
return *cast(ArrayRet_t*)(&a);
return Array(len, res.ptr);
}
@@ -659,7 +650,7 @@ in
body
{ int result;
//printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg);
//printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg);
int treewalker(aaA* e)
{ int result;
@@ -686,9 +677,9 @@ body
return result;
}
if (aa.a)
if (aa)
{
foreach (e; aa.a.b)
foreach (e; aa.b)
{
if (e)
{
@@ -712,7 +703,7 @@ in
body
{ int result;
//printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa.a, keysize, dg);
//printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg);
int treewalker(aaA* e)
{ int result;
@@ -739,9 +730,9 @@ body
return result;
}
if (aa.a)
if (aa)
{
foreach (e; aa.a.b)
foreach (e; aa.b)
{
if (e)
{

View File

@@ -265,6 +265,23 @@ class Layout(T)
}
}
}
else version (LLVMDC)
{
static va_list get_va_arg(TypeInfo ti, ref va_list vp)
{
auto tisize = ti.tsize;
size_t size = tisize > size_t.sizeof ? size_t.sizeof : tisize;
va_list vptmp = cast(va_list)((cast(size_t)vp + size - 1) & ~(size - 1));
vp = vptmp + tisize;
return vptmp;
}
Arg[64] arglist = void;
foreach (i, arg; arguments)
{
arglist[i] = get_va_arg(arg, args);
}
}
else
{
Arg[64] arglist = void;

View File

@@ -100,7 +100,7 @@ package struct CultureData {
package char[][] abbrevMonthNames;
package char[][] monthNames;
private static const CultureData[] cultureDataTable = [
package static const CultureData[] cultureDataTable = [
{ 0x0001, 0x007F, "ar", "ar", "ara", "ar", "\u0041\u0072\u0061\u0062\u0069\u0063", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", true },
{ 0x0002, 0x007F, "bg", "bg", "bul", "bg", "\u0042\u0075\u006C\u0067\u0061\u0072\u0069\u0061\u006E", "\u0431\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", true },
{ 0x0003, 0x007F, "ca", "ca", "cat", "ca", "\u0043\u0061\u0074\u0061\u006C\u0061\u006E", "\u0063\u0061\u0074\u0061\u006C\u00E0", true },

21
tangotests/aa1.d Normal file
View File

@@ -0,0 +1,21 @@
module tangotests.aa1;
extern(C) int printf(char*,...);
void main()
{
int[int] map;
map[1] = 1;
map[10] = 1;
map[11] = 11;
map[14] = 41;
map[21] = 12;
map[23] = 32;
map[32] = 23;
map[201] = 102;
foreach(k,v; map)
{
printf("%d:%d ", k,v);
}
printf("\n");
}

8
tangotests/stdout2.d Normal file
View File

@@ -0,0 +1,8 @@
module tangotests.stdout2;
import tango.io.Stdout;
void main()
{
Stdout.formatln("{} {} {}", "a", "b", 1);
}

13
tangotests/vararg1.d Normal file
View File

@@ -0,0 +1,13 @@
module tangotests.vararg1;
import tango.io.Stdout;
void func(int[] arr...)
{
Stdout.formatln("1,2,4,5,6 == {},{},{},{},{}", arr[0],arr[1],arr[2],arr[3],arr[4]);
}
void main()
{
func(1,2,4,5,6);
}

42
tangotests/vararg2.d Normal file
View File

@@ -0,0 +1,42 @@
module tangotests.vararg2;
extern(C) int printf(char*, ...);
import tango.core.Vararg;
void main()
{
func(0xf00, 1, " ", 2, " ", 3, "\n", 0.3, "\n");
}
void func(int foo, ...)
{
foreach(t; _arguments)
{
if (t == typeid(char[]))
{
char[] str = va_arg!(char[])(_argptr);
printf("%.*s", str.length, str.ptr);
}
else if (t == typeid(int))
{
printf("%d", va_arg!(int)(_argptr));
}
else if (t == typeid(float))
{
printf("%f", va_arg!(float)(_argptr));
}
else if (t == typeid(double))
{
printf("%f", va_arg!(double)(_argptr));
}
else if (t == typeid(real))
{
printf("%f", va_arg!(real)(_argptr));
}
else
{
assert(0, "not int");
}
}
}