annotate dmd2/cppmangle.c @ 1452:638d16625da2

LDC 2 compiles again.
author Robert Clipsham <robert@octarineparrot.com>
date Sat, 30 May 2009 17:23:32 +0100
parents
children e4f7b5d9c68a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1452
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
1
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
2 // Compiler implementation of the D programming language
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
3 // Copyright (c) 1999-2007 by Digital Mars
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
4 // All Rights Reserved
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
5 // written by Walter Bright
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
6 // http://www.digitalmars.com
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
7 // License for redistribution is by either the Artistic License
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
9 // See the included readme.txt for details.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
10
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
11 #include <stdio.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
12 #include <assert.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
13
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
14 #include "mars.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
15 #include "dsymbol.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
16 #include "mtype.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
17 #include "scope.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
18 #include "init.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
19 #include "expression.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
20 #include "attrib.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
21 #include "declaration.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
22 #include "template.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
23 #include "id.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
24 #include "enum.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
25 #include "import.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
26 #include "aggregate.h"
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
27
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
28 #if DMDV2
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
29
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
30 /* Do mangling for C++ linkage.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
31 * Follows Itanium C++ ABI 1.86
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
32 * No attempt is made to support mangling of templates, operator
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
33 * overloading, or special functions.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
34 *
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
35 * So why don't we use the C++ ABI for D name mangling?
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
36 * Because D supports a lot of things (like modules) that the C++
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
37 * ABI has no concept of. These affect every D mangled name,
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
38 * so nothing would be compatible anyway.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
39 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
40
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
41 struct CppMangleState
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
42 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
43 static Array components;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
44
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
45 int substitute(OutBuffer *buf, void *p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
46 };
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
47
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
48 Array CppMangleState::components;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
49
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
50
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
51 void writeBase36(OutBuffer *buf, unsigned i)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
52 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
53 if (i >= 36)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
54 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
55 writeBase36(buf, i / 36);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
56 i %= 36;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
57 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
58 if (i < 10)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
59 buf->writeByte(i + '0');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
60 else if (i < 36)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
61 buf->writeByte(i - 10 + 'A');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
62 else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
63 assert(0);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
64 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
65
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
66 int CppMangleState::substitute(OutBuffer *buf, void *p)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
67 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
68 for (size_t i = 0; i < components.dim; i++)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
69 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
70 if (p == components.data[i])
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
71 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
72 /* Sequence is S_, S0_, .., S9_, SA_, ..., SZ_, S10_, ...
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
73 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
74 buf->writeByte('S');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
75 if (i)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
76 writeBase36(buf, i - 1);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
77 buf->writeByte('_');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
78 return 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
79 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
80 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
81 components.push(p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
82 return 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
83 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
84
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
85 void source_name(OutBuffer *buf, Dsymbol *s)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
86 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
87 char *name = s->ident->toChars();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
88 buf->printf("%d%s", strlen(name), name);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
89 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
90
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
91 void prefix_name(OutBuffer *buf, CppMangleState *cms, Dsymbol *s)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
92 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
93 if (!cms->substitute(buf, s))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
94 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
95 Dsymbol *p = s->toParent();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
96 if (p && !p->isModule())
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
97 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
98 prefix_name(buf, cms, p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
99 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
100 source_name(buf, s);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
101 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
102 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
103
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
104 void cpp_mangle_name(OutBuffer *buf, CppMangleState *cms, Dsymbol *s)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
105 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
106 Dsymbol *p = s->toParent();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
107 if (p && !p->isModule())
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
108 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
109 buf->writeByte('N');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
110
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
111 FuncDeclaration *fd = s->isFuncDeclaration();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
112 if (fd->isConst())
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
113 buf->writeByte('K');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
114
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
115 prefix_name(buf, cms, p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
116 source_name(buf, s);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
117
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
118 buf->writeByte('E');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
119 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
120 else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
121 source_name(buf, s);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
122 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
123
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
124
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
125 char *cpp_mangle(Dsymbol *s)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
126 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
127 /*
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
128 * <mangled-name> ::= _Z <encoding>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
129 * <encoding> ::= <function name> <bare-function-type>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
130 * ::= <data name>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
131 * ::= <special-name>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
132 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
133
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
134 CppMangleState cms;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
135 memset(&cms, 0, sizeof(cms));
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
136 cms.components.setDim(0);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
137
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
138 OutBuffer buf;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
139 #if MACHOBJ
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
140 buf.writestring("__Z");
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
141 #else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
142 buf.writestring("_Z");
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
143 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
144
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
145 cpp_mangle_name(&buf, &cms, s);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
146
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
147 FuncDeclaration *fd = s->isFuncDeclaration();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
148 if (fd)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
149 { // add <bare-function-type>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
150 TypeFunction *tf = (TypeFunction *)fd->type;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
151 assert(tf->ty == Tfunction);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
152 Argument::argsCppMangle(&buf, &cms, tf->parameters, tf->varargs);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
153 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
154 buf.writeByte(0);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
155 return (char *)buf.extractData();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
156 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
157
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
158 /* ============= Type Encodings ============================================= */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
159
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
160 void Type::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
161 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
162 /* Make this the 'vendor extended type' when there is no
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
163 * C++ analog.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
164 * u <source-name>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
165 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
166 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
167 { assert(deco);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
168 buf->printf("u%d%s", strlen(deco), deco);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
169 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
170 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
171
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
172 void TypeBasic::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
173 { char c;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
174 char p = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
175
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
176 /* ABI spec says:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
177 * v void
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
178 * w wchar_t
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
179 * b bool
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
180 * c char
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
181 * a signed char
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
182 * h unsigned char
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
183 * s short
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
184 * t unsigned short
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
185 * i int
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
186 * j unsigned int
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
187 * l long
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
188 * m unsigned long
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
189 * x long long, __int64
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
190 * y unsigned long long, __int64
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
191 * n __int128
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
192 * o unsigned __int128
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
193 * f float
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
194 * d double
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
195 * e long double, __float80
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
196 * g __float128
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
197 * z ellipsis
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
198 * u <source-name> # vendor extended type
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
199 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
200
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
201 switch (ty)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
202 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
203 case Tvoid: c = 'v'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
204 case Tint8: c = 'a'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
205 case Tuns8: c = 'h'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
206 case Tint16: c = 's'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
207 case Tuns16: c = 't'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
208 case Tint32: c = 'i'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
209 case Tuns32: c = 'j'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
210 case Tfloat32: c = 'f'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
211 case Tint64: c = 'x'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
212 case Tuns64: c = 'y'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
213 case Tfloat64: c = 'd'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
214 case Tfloat80: c = 'e'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
215 case Tbool: c = 'b'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
216 case Tchar: c = 'c'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
217 case Twchar: c = 't'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
218 case Tdchar: c = 'w'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
219
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
220 case Timaginary32: p = 'G'; c = 'f'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
221 case Timaginary64: p = 'G'; c = 'd'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
222 case Timaginary80: p = 'G'; c = 'e'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
223 case Tcomplex32: p = 'C'; c = 'f'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
224 case Tcomplex64: p = 'C'; c = 'd'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
225 case Tcomplex80: p = 'C'; c = 'e'; break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
226
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
227 default: assert(0);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
228 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
229 if (p)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
230 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
231 if (cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
232 return;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
233 buf->writeByte(p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
234 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
235 buf->writeByte(c);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
236 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
237
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
238
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
239 void TypeSArray::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
240 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
241 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
242 { buf->printf("A%ju_", dim ? dim->toInteger() : 0);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
243 next->toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
244 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
245 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
246
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
247 void TypeDArray::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
248 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
249 Type::toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
250 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
251
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
252
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
253 void TypeAArray::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
254 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
255 Type::toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
256 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
257
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
258
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
259 void TypePointer::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
260 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
261 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
262 { buf->writeByte('P');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
263 next->toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
264 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
265 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
266
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
267
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
268 void TypeReference::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
269 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
270 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
271 { buf->writeByte('R');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
272 next->toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
273 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
274 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
275
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
276
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
277 void TypeFunction::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
278 { /*
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
279 * <function-type> ::= F [Y] <bare-function-type> E
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
280 * <bare-function-type> ::= <signature type>+
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
281 * # types are possible return type, then parameter types
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
282 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
283
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
284 /* ABI says:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
285 "The type of a non-static member function is considered to be different,
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
286 for the purposes of substitution, from the type of a namespace-scope or
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
287 static member function whose type appears similar. The types of two
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
288 non-static member functions are considered to be different, for the
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
289 purposes of substitution, if the functions are members of different
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
290 classes. In other words, for the purposes of substitution, the class of
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
291 which the function is a member is considered part of the type of
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
292 function."
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
293
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
294 BUG: Right now, types of functions are never merged, so our simplistic
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
295 component matcher always finds them to be different.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
296 We should use Type::equals on these, and use different
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
297 TypeFunctions for non-static member functions, and non-static
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
298 member functions of different classes.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
299 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
300 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
301 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
302 buf->writeByte('F');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
303 if (linkage == LINKc)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
304 buf->writeByte('Y');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
305 next->toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
306 Argument::argsCppMangle(buf, cms, parameters, varargs);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
307 buf->writeByte('E');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
308 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
309 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
310
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
311
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
312 void TypeDelegate::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
313 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
314 Type::toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
315 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
316
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
317
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
318 void TypeStruct::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
319 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
320 if (!cms->substitute(buf, sym))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
321 cpp_mangle_name(buf, cms, sym);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
322 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
323
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
324
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
325 void TypeEnum::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
326 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
327 if (!cms->substitute(buf, sym))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
328 cpp_mangle_name(buf, cms, sym);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
329 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
330
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
331
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
332 void TypeTypedef::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
333 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
334 Type::toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
335 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
336
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
337
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
338 void TypeClass::toCppMangle(OutBuffer *buf, CppMangleState *cms)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
339 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
340 if (!cms->substitute(buf, this))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
341 { buf->writeByte('P');
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
342 if (!cms->substitute(buf, sym))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
343 cpp_mangle_name(buf, cms, sym);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
344 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
345 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
346
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
347
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
348
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
349 void Argument::argsCppMangle(OutBuffer *buf, CppMangleState *cms, Arguments *arguments, int varargs)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
350 { int n = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
351 if (arguments)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
352 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
353 for (size_t i = 0; i < arguments->dim; i++)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
354 { Argument *arg = (Argument *)arguments->data[i];
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
355 Type *t = arg->type;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
356 if (arg->storageClass & (STCout | STCref))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
357 t = t->referenceTo();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
358 else if (arg->storageClass & STClazy)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
359 { // Mangle as delegate
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
360 Type *td = new TypeFunction(NULL, t, 0, LINKd);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
361 td = new TypeDelegate(td);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
362 t = t->merge();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
363 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
364 if (t->ty == Tsarray)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
365 { // Mangle static arrays as pointers
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
366 t = t->pointerTo();
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
367 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
368 t->toCppMangle(buf, cms);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
369
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
370 n++;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
371 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
372 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
373 if (varargs)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
374 buf->writestring("z");
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
375 else if (!n)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
376 buf->writeByte('v'); // encode ( ) arguments
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
377 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
378
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
379
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
380 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
381