diff dmd/mtype.c @ 379:d632801b15f0

Introducing opaque type to dmd frontent to be used with certain runtime array and aa args and returns. There are still some bugs with aas.
author Christian Kamm <kamm incasoftware de>
date Tue, 22 Jul 2008 23:06:46 +0200
parents d8234836b40f
children cbb65e65236b
line wrap: on
line diff
--- a/dmd/mtype.c	Tue Jul 22 19:24:40 2008 +0200
+++ b/dmd/mtype.c	Tue Jul 22 23:06:46 2008 +0200
@@ -103,6 +103,9 @@
 ClassDeclaration *Type::typeinfodelegate;
 ClassDeclaration *Type::typeinfotypelist;
 
+// LLVMDC
+Type* Type::topaque;
+
 Type *Type::tvoidptr;
 Type *Type::basic[TMAX];
 unsigned char Type::mangleChar[TMAX];
@@ -207,6 +210,9 @@
     mangleChar[Ttuple] = 'B';
     mangleChar[Tslice] = '@';
 
+    // LLVMDC
+    mangleChar[Topaque] = 'O';
+
     for (i = 0; i < TMAX; i++)
     {	if (!mangleChar[i])
 	    fprintf(stdmsg, "ty = %d\n", i);
@@ -228,6 +234,9 @@
 
     tvoidptr = tvoid->pointerTo();
 
+    // LLVMDC
+    topaque = new TypeOpaque();
+
     // set size_t / ptrdiff_t types and pointer size
     if (global.params.is64bit)
     {
@@ -1585,12 +1594,12 @@
 	Arguments* args = new Arguments;
 	if(dup) {
 	    args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
-	    args->push(new Argument(STCin, Type::tvoid->arrayOf(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
 	} else {
-	    args->push(new Argument(STCin, Type::tvoid->arrayOf(), NULL, NULL));
+	    args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
 	    args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
 	}
-	fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), dup ? Id::adDup : Id::adReverse);
+	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), dup ? Id::adDup : Id::adReverse);
 	ec = new VarExp(0, fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
 	arguments = new Expressions();
@@ -1610,9 +1619,9 @@
 
 	//LLVMDC: Build arguments.
 	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::tvoid->arrayOf(), NULL, NULL));
+	args->push(new Argument(STCin, Type::topaque->arrayOf(), NULL, NULL));
 	args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(),
+	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(),
 		(char*)(n->ty == Tbit ? "_adSortBit" : "_adSort"));
 	ec = new VarExp(0, fd);
 	e = e->castTo(sc, n->arrayOf());	// convert to dynamic array
@@ -2289,7 +2298,7 @@
 
 	//LLVMDC: Build arguments.
 	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
+	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
 	fd = FuncDeclaration::genCfunc(args, Type::tsize_t, Id::aaLen);
 	ec = new VarExp(0, fd);
 	arguments = new Expressions();
@@ -2307,9 +2316,9 @@
 	assert(size);
 	//LLVMDC: Build arguments.
 	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
+	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
 	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaKeys);
+	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaKeys);
 	ec = new VarExp(0, fd);
 	arguments = new Expressions();
 	arguments->push(e);
@@ -2325,10 +2334,10 @@
 
 	//LLVMDC: Build arguments.
 	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::tvoidptr, NULL, NULL));
+	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
 	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
 	args->push(new Argument(STCin, Type::tsize_t, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tvoid->arrayOf(), Id::aaValues);
+	fd = FuncDeclaration::genCfunc(args, Type::topaque->arrayOf(), Id::aaValues);
 	ec = new VarExp(0, fd);
 	arguments = new Expressions();
 	arguments->push(e);
@@ -2347,9 +2356,9 @@
 
 	//LLVMDC: Build arguments.
 	Arguments* args = new Arguments;
-	args->push(new Argument(STCin, Type::tvoidptr->pointerTo(), NULL, NULL));
+	args->push(new Argument(STCin, Type::topaque->pointerTo(), NULL, NULL));
 	args->push(new Argument(STCin, Type::typeinfo->type, NULL, NULL));
-	fd = FuncDeclaration::genCfunc(args, Type::tvoid->pointerTo(), Id::aaRehash);
+	fd = FuncDeclaration::genCfunc(args, Type::tvoidptr, Id::aaRehash);
 	ec = new VarExp(0, fd);
 	arguments = new Expressions();
 	arguments->push(e->addressOf(sc));
@@ -5157,6 +5166,16 @@
     buf->printf("%s]", upr->toChars());
 }
 
+void TypeOpaque::toCBuffer2(OutBuffer *buf, HdrGenState *hgs, int mod)
+{
+    //printf("TypeOpaquePtr::toCBuffer2()");
+    if (mod != this->mod)
+    {	toCBuffer3(buf, hgs, mod);
+	return;
+    }
+   buf->writestring("opaque");
+}
+
 /***************************** Argument *****************************/
 
 Argument::Argument(unsigned storageClass, Type *type, Identifier *ident, Expression *defaultArg)