annotate dmd/Module.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents fa9a71a9f5a8
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Module;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Package;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.DsymbolTable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.StaticDtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Import;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.ModuleDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.File;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.Identifier;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
16 import dmd.Json;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.ModuleInfoDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.Macro;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.Escape;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.FileName;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.Parser;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.Lexer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.String;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.ScopeDsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.backend.TYPE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.backend.Cstate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.backend.OPER;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.backend.REG;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.backend.elem;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.backend.mTYman;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.backend.FL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.backend.SFL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.backend.TF;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 import dmd.backend.RTLSYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.backend.BC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.backend.block;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.backend.targ_types;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.backend.Classsym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.backend.glue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.backend.LIST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 import dmd.codegen.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 import core.stdc.string;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 import core.stdc.stdlib;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
61 import core.memory;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
62
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 uint readwordLE(ushort* p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 version (__I86__) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 return *p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 return ((cast(ubyte*)p)[1] << 8) | (cast(ubyte*)p)[0];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 uint readwordBE(ushort* p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 return ((cast(ubyte*)p)[0] << 8) | (cast(ubyte*)p)[1];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 uint readlongLE(uint* p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 version (__I86__) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 return *p;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 return (cast(ubyte*)p)[0] |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 ((cast(ubyte*)p)[1] << 8) |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 ((cast(ubyte*)p)[2] << 16) |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 ((cast(ubyte*)p)[3] << 24);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 uint readlongBE(uint* p)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 return (cast(ubyte*)p)[3] |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 ((cast(ubyte*)p)[2] << 8) |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 ((cast(ubyte*)p)[1] << 16) |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 ((cast(ubyte*)p)[0] << 24);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 /* Segments */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 enum Segment {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 CODE = 1, /* code segment */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 DATA = 2, /* initialized data */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 CDATA = 3, /* constant data */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 UDATA = 4, /* uninitialized data */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 UNKNOWN = -1, /* unknown segment */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
106 struct seg_data
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 int SDseg; // omf file segment index
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 targ_size_t SDoffset; // starting offset for data
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 bool isfarseg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 int seg; // segment number
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 int lnameidx; // lname idx of segment name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 int classidx; // lname idx of class name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 uint attr; // segment attribute
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 targ_size_t origsize; // original size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 int seek; // seek position in output file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 extern (C) extern __gshared seg_data** SegData;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 ref targ_size_t Offset(Segment seg) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 return SegData[seg].SDoffset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 ref targ_size_t Doffset() {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 return SegData[Segment.DATA].SDoffset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 ref targ_size_t CDoffset() {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 return SegData[Segment.CDATA].SDoffset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 ref targ_size_t UDoffset() {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 return SegData[Segment.UDATA].SDoffset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 enum CF {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 CFes = 1, // generate an ES: segment override for this instr
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 CFjmp16 = 2, // need 16 bit jump offset (long branch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 CFtarg = 4, // this code is the target of a jump
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 CFseg = 8, // get segment of immediate value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 CFoff = 0x10, // get offset of immediate value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 CFss = 0x20, // generate an SS: segment override (not with
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 // CFes at the same time, though!)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 CFpsw = 0x40, // we need the flags result after this instruction
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 CFopsize = 0x80, // prefix with operand size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 CFaddrsize = 0x100, // prefix with address size
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
149 CFds = 0x200, // need DS override (not with es, ss, or cs )
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 CFcs = 0x400, // need CS override
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 CFfs = 0x800, // need FS override
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 CFgs = (CFcs | CFfs), // need GS override
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 CFwait = 0x1000, // If I32 it indicates when to output a WAIT
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 CFselfrel = 0x2000, // if self-relative
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 CFunambig = 0x4000, // indicates cannot be accessed by other addressing
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 // modes
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 CFtarg2 = 0x8000, // like CFtarg, but we can't optimize this away
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 CFvolatile = 0x10000, // volatile reference, do not schedule
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 CFclassinit = 0x20000, // class init code
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 CFSEG = (CFes | CFss | CFds | CFcs | CFfs | CFgs),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 CFPREFIX = (CFSEG | CFopsize | CFaddrsize),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 class Module : Package
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 string arg; // original argument name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 ModuleDeclaration md; // if !null, the contents of the ModuleDeclaration declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 File srcfile; // input source file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 File objfile; // output .obj file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 File hdrfile; // 'header' file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 File symfile; // output symbol file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 File docfile; // output documentation file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 uint errors; // if any errors in file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 uint numlines; // number of lines in source file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 int isHtml; // if it is an HTML file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 int isDocFile; // if it is a documentation input file, not D source
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 int needmoduleinfo; /// TODO: change to bool
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 version (IN_GCC) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 int strictlyneedmoduleinfo;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 int selfimports; // 0: don't know, 1: does not, 2: does
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 int selfImports() // returns !=0 if module imports itself
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 int insearch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 Identifier searchCacheIdent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 Dsymbol searchCacheSymbol; // cached value of search
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 int searchCacheFlags; // cached flags
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 int semanticstarted; // has semantic() been started?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 int semanticRun; // has semantic() been done?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 int root; // != 0 if this is a 'root' module,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 // i.e. a module that will be taken all the
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 // way to an object file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 Module importedFrom; // module from command line we're imported from,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 // i.e. a module that will be taken all the
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 // way to an object file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 Array decldefs; // top level declarations for this Module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 Array aimports; // all imported modules
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 ModuleInfoDeclaration vmoduleinfo;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 uint debuglevel; // debug level
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 128
diff changeset
210 Vector!string debugids; // debug identifiers
010eb8f0e18d further work on dmd test suite
korDen
parents: 128
diff changeset
211 Vector!string debugidsNot; // forward referenced debug identifiers
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 uint versionlevel; // version level
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
214 Vector!(string) versionids; // version identifiers
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
215 Vector!(string) versionidsNot; // forward referenced version identifiers
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 Macro macrotable; // document comment macros
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 Escape escapetable; // document comment escapes
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 bool safe; // TRUE if module is marked as 'safe'
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 this(string filename, Identifier ident, int doDocComment, int doHdrGen)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
223 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
224
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 super(ident);
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
226
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
227 versionids = new Vector!string;
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
228 versionidsNot = new Vector!string;
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
229
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 FileName objfilename;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
231
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 aimports = new Array();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
234 //writefln("Module.Module(filename = '%s', ident = '%s')", filename, ident.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 this.arg = filename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 FileName srcfilename = FileName.defaultExt(filename, global.mars_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 if (!srcfilename.equalsExt(global.mars_ext) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 !srcfilename.equalsExt(global.hdr_ext) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 !srcfilename.equalsExt("dd"))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 if (srcfilename.equalsExt("html") ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 srcfilename.equalsExt("htm") ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 srcfilename.equalsExt("xhtml"))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 if (!global.params.useDeprecated)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 error("html source files is deprecated %s", srcfilename.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 isHtml = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 error("source file name '%s' must have .%s extension", srcfilename.toChars(), global.mars_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 string argobj;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 if (global.params.objname)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 argobj = global.params.objname;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 else if (global.params.preservePaths)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 argobj = filename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 argobj = FileName.name(filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 if (!FileName.absolute(argobj))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 argobj = FileName.combine(global.params.objdir, argobj);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 if (global.params.objname)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 objfilename = new FileName(argobj);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 objfilename = FileName.forceExt(argobj, global.obj_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 FileName symfilename = FileName.forceExt(filename, global.sym_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
276 //writeln(srcfilename.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 srcfile = new File(srcfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 if (doDocComment) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 setDocfile();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 if (doHdrGen) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 setHdrfile();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 objfile = new File(objfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 symfile = new File(symfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 128
diff changeset
291 static Module load(Loc loc, Vector!Identifier packages, Identifier ident)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 Module m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 string filename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 //writef("Module.load(ident = '%s')\n", ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 // Build module filename by turning:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 // foo.bar.baz
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 // into:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 // foo\bar\baz
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 filename = ident.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 if (packages && packages.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 {
129
010eb8f0e18d further work on dmd test suite
korDen
parents: 128
diff changeset
305 scope OutBuffer buf = new OutBuffer();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
307 foreach (pid; packages)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
308 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 buf.writestring(pid.toChars());
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
310 version (Windows)
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
311 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 buf.writeByte('\\');
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
313 }
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
314 else
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 96
diff changeset
315 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 buf.writeByte('/');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 buf.writestring(filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 filename = buf.extractString();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 m = new Module(filename, ident, 0, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 m.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 /* Search along global.path for .di file, then .d file.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 string result = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 FileName fdi = FileName.forceExt(filename, global.hdr_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 FileName fd = FileName.forceExt(filename, global.mars_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 string sdi = fdi.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 string sd = fd.toChars();
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
333
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 if (FileName.exists(sdi)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 result = sdi;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 } else if (FileName.exists(sd)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 result = sd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 } else if (FileName.absolute(filename)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 foreach (p; global.path)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 string n = FileName.combine(p, sdi);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 if (FileName.exists(n))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 result = n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 n = FileName.combine(p, sd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 if (FileName.exists(n))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 result = n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
362 if (result) {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 m.srcfile = new File(result);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
364 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 if (global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 176
diff changeset
368 write("import ");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 if (packages)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 {
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
371 foreach (pid; packages)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
372 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 writef("%s.", pid.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 writef("%s\t(%s)\n", ident.toChars(), m.srcfile.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 m.read(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 m.parse();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 version (IN_GCC) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 d_gcc_magic_module(m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 return m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
389 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
393
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
394 override void toJsonBuffer(OutBuffer buf)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
395 {
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
396 buf.writestring("{\n");
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
397
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
398 if (md)
acd69f84627e further work
Trass3r
parents: 81
diff changeset
399 JsonProperty(buf, Pname, md.toChars());
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
400
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
401 JsonProperty(buf, Pkind, kind());
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
402
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
403 JsonProperty(buf, Pfile, srcfile.toChars());
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
404
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
405 if (comment)
acd69f84627e further work
Trass3r
parents: 81
diff changeset
406 JsonProperty(buf, Pcomment, comment);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
407
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
408 JsonString(buf, Pmembers);
acd69f84627e further work
Trass3r
parents: 81
diff changeset
409 buf.writestring(" : [\n");
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
410
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
411 size_t offset = buf.offset;
acd69f84627e further work
Trass3r
parents: 81
diff changeset
412 foreach (Dsymbol s; members)
acd69f84627e further work
Trass3r
parents: 81
diff changeset
413 {
acd69f84627e further work
Trass3r
parents: 81
diff changeset
414 if (offset != buf.offset)
acd69f84627e further work
Trass3r
parents: 81
diff changeset
415 {
acd69f84627e further work
Trass3r
parents: 81
diff changeset
416 buf.writestring(",\n");
acd69f84627e further work
Trass3r
parents: 81
diff changeset
417 offset = buf.offset;
acd69f84627e further work
Trass3r
parents: 81
diff changeset
418 }
acd69f84627e further work
Trass3r
parents: 81
diff changeset
419 s.toJsonBuffer(buf);
acd69f84627e further work
Trass3r
parents: 81
diff changeset
420 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
421
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
422 JsonRemoveComma(buf);
acd69f84627e further work
Trass3r
parents: 81
diff changeset
423 buf.writestring("]\n");
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
424
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
425 buf.writestring("}\n");
acd69f84627e further work
Trass3r
parents: 81
diff changeset
426 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
427
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
428 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 return "module";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
432
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 void setDocfile() // set docfile member
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
437
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 void read(Loc loc) // read file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 {
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
440 //writefln("Module.read('%s') file '%s'", toChars(), srcfile.toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 if (srcfile.read())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 error(loc, "cannot read file '%s'", srcfile.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
447
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 version (IN_GCC) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 void parse(bool dump_source = false) // syntactic parse
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 void parse() // syntactic parse
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 uint le;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 uint bom;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 //printf("Module.parse()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 string srcname = srcfile.name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 //printf("Module.parse(srcname = '%s')\n", srcname);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 ubyte* buf = srcfile.buffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 uint buflen = srcfile.len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 if (buflen >= 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 /* Convert all non-UTF-8 formats to UTF-8.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 * BOM : http://www.unicode.org/faq/utf_bom.html
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 * 00 00 FE FF UTF-32BE, big-endian
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 * FF FE 00 00 UTF-32LE, little-endian
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 * FE FF UTF-16BE, big-endian
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 * FF FE UTF-16LE, little-endian
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 * EF BB BF UTF-8
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 bom = 1; // assume there's a BOM
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 if (buf[0] == 0xFF && buf[1] == 0xFE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 if (buflen >= 4 && buf[2] == 0 && buf[3] == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 { // UTF-32LE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 le = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 Lutf32:
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
486 OutBuffer dbuf = new OutBuffer();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 uint* pu = cast(uint*)buf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 uint* pumax = &pu[buflen / 4];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 if (buflen & 3)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 { error("odd length of UTF-32 char source %u", buflen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 dbuf.reserve(buflen / 4);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 for (pu += bom; pu < pumax; pu++)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
497 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 uint u = le ? readlongLE(pu) : readlongBE(pu);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 if (u & ~0x7F)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 if (u > 0x10FFFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 { error("UTF-32 value %08x greater than 0x10FFFF", u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 dbuf.writeUTF8(u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 dbuf.writeByte(u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 dbuf.writeByte(0); // add 0 as sentinel for scanner
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 buflen = dbuf.offset - 1; // don't include sentinel in count
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 buf = cast(ubyte*) dbuf.extractData();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 else
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
515 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 // UTF-16LE (X86)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 // Convert it to UTF-8
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 le = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 Lutf16:
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 14
diff changeset
521 OutBuffer dbuf = new OutBuffer();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 ushort* pu = cast(ushort*)(buf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 ushort *pumax = &pu[buflen / 2];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 if (buflen & 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 { error("odd length of UTF-16 char source %u", buflen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 dbuf.reserve(buflen / 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 for (pu += bom; pu < pumax; pu++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 uint u = le ? readwordLE(pu) : readwordBE(pu);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 if (u & ~0x7F)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 if (u >= 0xD800 && u <= 0xDBFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 { uint u2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 if (++pu > pumax)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 { error("surrogate UTF-16 high value %04x at EOF", u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 u2 = le ? readwordLE(pu) : readwordBE(pu);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 if (u2 < 0xDC00 || u2 > 0xDFFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 { error("surrogate UTF-16 low value %04x out of range", u2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 u = (u - 0xD7C0) << 10;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 u |= (u2 - 0xDC00);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 else if (u >= 0xDC00 && u <= 0xDFFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 error("unpaired surrogate UTF-16 value %04x", u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 else if (u == 0xFFFE || u == 0xFFFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 error("illegal UTF-16 value %04x", u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561 dbuf.writeUTF8(u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 dbuf.writeByte(u);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 dbuf.writeByte(0); // add 0 as sentinel for scanner
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 buflen = dbuf.offset - 1; // don't include sentinel in count
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 buf = cast(ubyte*) dbuf.extractData();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 else if (buf[0] == 0xFE && buf[1] == 0xFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 { // UTF-16BE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 le = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 goto Lutf16;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 else if (buflen >= 4 && buf[0] == 0 && buf[1] == 0 && buf[2] == 0xFE && buf[3] == 0xFF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 { // UTF-32BE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 le = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 goto Lutf32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 else if (buflen >= 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 { // UTF-8
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 buf += 3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 buflen -= 3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 /* There is no BOM. Make use of Arcane Jill's insight that
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 * the first char of D source must be ASCII to
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 * figure out the encoding.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 bom = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 if (buflen >= 4)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 { if (buf[1] == 0 && buf[2] == 0 && buf[3] == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 { // UTF-32LE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 le = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 goto Lutf32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 else if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 { // UTF-32BE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 le = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 goto Lutf32;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 if (buflen >= 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 if (buf[1] == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 { // UTF-16LE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 le = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 goto Lutf16;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 else if (buf[0] == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 { // UTF-16BE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 le = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 goto Lutf16;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 // It's UTF-8
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 if (buf[0] >= 0x80)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 { error("source file must start with BOM or ASCII character, not \\x%02X", buf[0]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629 version (IN_GCC) {
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
630 // dump utf-8 encoded source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 if (dump_source)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 { // %% srcname could contain a path ...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 d_gcc_dump_source(srcname, "utf-8", buf, buflen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 /* If it starts with the string "Ddoc", then it's a documentation
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 * source file.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 if (buflen >= 4 && memcmp(buf, "Ddoc".ptr, 4) == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
642 comment = cast(string) ((buf + 4)[0 .. buflen]);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643 isDocFile = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 if (!docfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 setDocfile();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 if (isHtml)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 ///OutBuffer dbuf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 ///Html h = new Html(srcname, buf, buflen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 ///h.extractCode(dbuf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 ///buf = dbuf.data;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 ///buflen = dbuf.offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
657 version (IN_GCC)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
658 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 // dump extracted source
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 ///if (dump_source)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 /// d_gcc_dump_source(srcname, "d.utf-8", buf, buflen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
665 auto p = new Parser(this, buf, buflen, docfile !is null);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 p.nextToken();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 members = p.parseModule();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 md = p.md;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 numlines = p.loc.linnum;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 DsymbolTable dst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 if (md !is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 this.ident = md.id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 this.safe = md.safe;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 dst = super.resolve(md.packages, &this.parent, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 {
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
681 dst = global.modules;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 /* Check to see if module name is a valid identifier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 if (!Lexer.isValidIdentifier(this.ident.toChars()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 error("has non-identifier characters in filename, use module declaration instead");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
688
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 // Update global list of modules
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 if (!dst.insert(this))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 if (md)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 error(loc, "is in multiple packages %s", md.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 error(loc, "is in multiple defined");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 {
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
699 global.amodules.push(cast(void*)this);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
702 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
704 override void importAll(Scope prevsc)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
705 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
706 //writef("+Module.importAll(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
707
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
708 if (scope_ !is null)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
709 return; // already done
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
710
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
711 /* Note that modules get their own scope, from scratch.
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
712 * This is so regardless of where in the syntax a module
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
713 * gets imported, it is unaffected by context.
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
714 * Ignore prevsc.
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
715 */
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
716 Scope sc = Scope.createGlobal(this); // create root scope
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
717
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
718 // Add import of "object" if this module isn't "object"
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
719 if (ident != Id.object)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
720 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
721 if (members.dim == 0 || members[0].ident != Id.object)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
722 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
723 Import im = new Import(Loc(), null, Id.object, null, 0);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
724 members.shift(im);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
725 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
726 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
727
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
728 if (!symtab)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
729 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
730 // Add all symbols into module's symbol table
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
731 symtab = new DsymbolTable();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
732 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
733 s.addMember(null, sc.scopesym, 1);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
734 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
735 // anything else should be run after addMember, so version/debug symbols are defined
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
736
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
737 /* Set scope for the symbols so that if we forward reference
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
738 * a symbol, it can possibly be resolved on the spot.
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
739 * If this works out well, it can be extended to all modules
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
740 * before any semantic() on any of them.
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
741 */
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
742 setScope(sc); // remember module scope for semantic
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
743 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
744 s.setScope(sc);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
745
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
746 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
747 s.importAll(sc);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
748
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
749 sc = sc.pop();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
750 sc.pop(); // 2 pops because Scope::createGlobal() created 2
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
751 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
752
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753 void semantic() // semantic analysis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
755 if (semanticstarted)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 //printf("+Module.semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759 semanticstarted = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
761 // Note that modules get their own scope, from scratch.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
762 // This is so regardless of where in the syntax a module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763 // gets imported, it is unaffected by context.
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
764 Scope sc = scope_; // // see if already got one from importAll()
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
765 if (!sc)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
766 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
767 writef("test2\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
768 Scope.createGlobal(this); // create root scope
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
769 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
770
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
771 //writef("Module = %p, linkage = %d\n", sc.scopesym, sc.linkage);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
773 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
774 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 // Add import of "object" if this module isn't "object"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 if (ident !is Id.object)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
777 {
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
778 auto im = new Import(Loc(0), null, Id.object, null, 0);
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
779 members.shift(im);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
782 // Add all symbols into module's symbol table
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
783 symtab = new DsymbolTable();
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
784 foreach(s; members)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
785 {
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 5
diff changeset
786 s.addMember(null, sc.scopesym, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789 /* Set scope for the symbols so that if we forward reference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
790 * a symbol, it can possibly be resolved on the spot.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 * If this works out well, it can be extended to all modules
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 * before any semantic() on any of them.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 */
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
794 foreach(Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795 s.setScope(sc);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
796 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 // Pass 1 semantic routines: do public side of the definition
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
799 foreach (Dsymbol s; members)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
800 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 //writef("\tModule('%s'): '%s'.semantic()\n", toChars(), s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 runDeferredSemantic();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
806 if (!scope_)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
807 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
808 sc = sc.pop();
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
809 sc.pop(); // 2 pops because Scope.createGlobal() created 2
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
810 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 semanticRun = semanticstarted;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 //printf("-Module.semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
814
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 void semantic2() // pass 2 semantic analysis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816 {
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
817 auto deferred = global.deferred;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 if (deferred.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
819 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 for (int i = 0; i < deferred.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 Dsymbol sd = cast(Dsymbol)deferred.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 sd.error("unable to resolve forward reference in definition");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 //printf("Module.semantic2('%s'): parent = %p\n", toChars(), parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 if (semanticstarted >= 2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 assert(semanticstarted == 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 semanticstarted = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 // Note that modules get their own scope, from scratch.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 // This is so regardless of where in the syntax a module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 // gets imported, it is unaffected by context.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 Scope sc = Scope.createGlobal(this); // create root scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 //printf("Module = %p\n", sc.scopesym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 // Pass 2 semantic routines: do initializers and function bodies
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
841 foreach(Dsymbol s; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 s.semantic2(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
844 sc = sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
845 sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
846 semanticRun = semanticstarted;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 //printf("-Module.semantic2('%s'): parent = %p\n", toChars(), parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
849
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
850 void semantic3() // pass 3 semantic analysis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
851 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
852 //printf("Module.semantic3('%s'): parent = %p\n", toChars(), parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 if (semanticstarted >= 3)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 assert(semanticstarted == 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 semanticstarted = 3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
857
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
858 // Note that modules get their own scope, from scratch.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
859 // This is so regardless of where in the syntax a module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860 // gets imported, it is unaffected by context.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
861 Scope sc = Scope.createGlobal(this); // create root scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
862 //printf("Module = %p\n", sc.scopesym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
863
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864 // Pass 3 semantic routines: do initializers and function bodies
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
865 foreach(Dsymbol s; members)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
866 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
867 //printf("Module %s: %s.semantic3()\n", toChars(), s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 s.semantic3(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 sc = sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
872 sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 semanticRun = semanticstarted;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
874 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
875
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
876 override void inlineScan() // scan for functions to inline
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
878 if (semanticstarted >= 4)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
879 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
880
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
881 assert(semanticstarted == 3);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882 semanticstarted = 4;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
883
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
884 // Note that modules get their own scope, from scratch.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
885 // This is so regardless of where in the syntax a module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886 // gets imported, it is unaffected by context.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
887 //printf("Module = %p\n", sc.scopesym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
888
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
889 foreach(Dsymbol s; members)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
890 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
891 //if (global.params.verbose)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
892 //printf("inline scan symbol %s\n", s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
893 s.inlineScan();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
894 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
896 semanticRun = semanticstarted;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
898
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
899 void setHdrfile() // set hdrfile member
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 FileName hdrfilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 string arghdr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 if (global.params.hdrname)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 arghdr = global.params.hdrname;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 else if (global.params.preservePaths)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
907 arghdr = arg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
908 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
909 arghdr = FileName.name(arg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910 if (!FileName.absolute(arghdr))
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
911 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912 //FileName.ensurePathExists(global.params.hdrdir);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 arghdr = FileName.combine(global.params.hdrdir, arghdr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
914 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915 if (global.params.hdrname)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 hdrfilename = new FileName(arghdr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918 hdrfilename = FileName.forceExt(arghdr, global.hdr_ext);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 if (hdrfilename.str == srcfile.name.str)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
921 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 error("Source file and 'header' file have same name '%s'", srcfile.name.str);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 fatal();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 hdrfile = new File(hdrfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
928
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 version (_DH) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 void genhdrfile() // generate D import file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
931 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
935
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 * Generate .obj file for Module.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 void genobjfile(int multiobj)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 //EEcontext *ee = env.getEEcontext();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 //printf("Module.genobjfile(multiobj = %d) %s\n", multiobj, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
945 auto lastmname = global.lastmname = srcfile.toChars();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 obj_initfile(toStringz(lastmname), null, toStringz(toPrettyChars()));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
949 global.eictor = null;
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
950 global.ictorlocalgot = null;
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
951 global.ector = null;
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
952 global.ectorgates.setDim(0);
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
953 global.edtor = null;
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
954 global.etest = null;
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
955 global.dtorcount = 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 if (doppelganger)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 /* Generate a reference to the moduleinfo, so the module constructors
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 * and destructors get linked in.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 Module m = cast(Module)aimports.data[0];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 assert(m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 if (m.sictor || m.sctor || m.sdtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 Symbol* s = m.toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 //objextern(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 //if (!s.Sxtrnnum) objextdef(s.Sident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 if (!s.Sxtrnnum)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971 //printf("%s\n", s.Sident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 /* This should work, but causes optlink to fail in common/newlib.asm */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 objextdef(s.Sident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 } else {
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
976 version (ELFOBJ_OR_MACHOBJ) {///ELFOBJ || MACHOBJ
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
977 int nbytes = reftoident(Segment.DATA, Offset(Segment.DATA), s, 0, CF.CFoff);
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
978 Offset(Segment.DATA) += nbytes;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 int nbytes = reftoident(Segment.DATA, Doffset, s, 0, CF.CFoff);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 Doffset() += nbytes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 if (global.params.cov)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 /* Create coverage identifier:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 * private uint[numlines] __coverage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 cov = symbol_calloc("__coverage");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 cov.Stype = type_fake(TYM.TYint);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 cov.Stype.Tmangle = mTYman.mTYman_c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 cov.Stype.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 cov.Sclass = SC.SCstatic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 cov.Sfl = FL.FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 version (ELFOBJ_OR_MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 cov.Sseg = Segment.UDATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 dtnzeros(&cov.Sdt, 4 * numlines);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 outdata(cov);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 slist_add(cov);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
1006 covb = cast(uint*)GC.calloc(((numlines + 32) / 32) * (*covb).sizeof);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1008
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
1009 foreach(Dsymbol member; members)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 member.toObjFile(multiobj);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1011
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 if (global.params.cov)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 /* Generate
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 * bit[numlines] __bcoverage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 Symbol* bcov = symbol_calloc("__bcoverage");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 bcov.Stype = type_fake(TYM.TYuint);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 bcov.Stype.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020 bcov.Sclass = SC.SCstatic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021 bcov.Sfl = FL.FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 version (ELFOBJ_OR_MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 bcov.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 dtnbytes(&bcov.Sdt, (numlines + 32) / 32 * (*covb).sizeof, cast(char*)covb);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026 outdata(bcov);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
1028 ///free(covb);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 covb = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031 /* Generate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 * _d_cover_register(uint[] __coverage, BitArray __bcoverage, string filename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 * and prepend it to the static constructor.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 /* t will be the type of the functions generated:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 * extern (C) void func();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039 type* t = type_alloc(TYM.TYnfunc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 t.Tflags |= TF.TFprototype | TF.TFfixed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 t.Tmangle = mTYman.mTYman_c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 t.Tnext = tsvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 tsvoid.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045 sictor = toSymbolX("__modictor", SC.SCglobal, t, "FZv");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 cstate.CSpsymtab = &sictor.Sfunc.Flocsym;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1047 global.localgot = global.ictorlocalgot;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 elem* e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050 e = el_params(el_ptr(cov), el_long(TYM.TYuint, numlines),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 el_ptr(bcov), el_long(TYM.TYuint, numlines),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052 toEfilename(),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1053 null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 e = el_bin(OPER.OPcall, TYM.TYvoid, el_var(rtlsym[RTLSYM.RTLSYM_DCOVER]), e);
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1055 global.eictor = el_combine(e, global.eictor);
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1056 global.ictorlocalgot = global.localgot;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1058
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1059 // If coverage / static constructor / destructor / unittest calls
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1060 if (global.eictor || global.ector || global.ectorgates.dim || global.edtor || global.etest)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 /* t will be the type of the functions generated:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063 * extern (C) void func();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 type* t = type_alloc(TYM.TYnfunc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066 t.Tflags |= TF.TFprototype | TF.TFfixed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 t.Tmangle = mTYman.mTYman_c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 t.Tnext = tsvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 tsvoid.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070
170
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1071 enum moddeco = "FZv";
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1073 if (global.eictor)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074 {
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1075 global.localgot = global.ictorlocalgot;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 block* b = block_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 b.BC = BC.BCret;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1079 b.Belem = global.eictor;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1080 sictor.Sfunc.Fstartblock = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 writefunc(sictor);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1084 if (global.ector || global.ectorgates.dim)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 {
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1086 global.localgot = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1087 sctor = toSymbolX("__modctor", SC.SCglobal, t, moddeco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1088 cstate.CSpsymtab = &sctor.Sfunc.Flocsym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1090 for (int i = 0; i < global.ectorgates.dim; i++)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1091 {
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1092 StaticDtorDeclaration f = cast(StaticDtorDeclaration)global.ectorgates.data[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1094 Symbol* s = f.vgate.toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095 elem* e = el_var(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1096 e = el_bin(OPER.OPaddass, TYM.TYint, e, el_long(TYM.TYint, 1));
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1097 global.ector = el_combine(global.ector, e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1098 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1099
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 block* b = block_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 b.BC = BC.BCret;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1102 b.Belem = global.ector;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 sctor.Sfunc.Fstartblock = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 writefunc(sctor);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 version (STATICCTOR) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1106 obj_staticctor(sctor, dtorcount, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1110 if (global.edtor)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 {
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1112 global.localgot = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 sdtor = toSymbolX("__moddtor", SC.SCglobal, t, moddeco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115 block* b = block_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 b.BC = BC.BCret;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1117 b.Belem = global.edtor;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 sdtor.Sfunc.Fstartblock = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 writefunc(sdtor);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1120 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1122 if (global.etest)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 {
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1124 global.localgot = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 stest = toSymbolX("__modtest", SC.SCglobal, t, moddeco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127 block* b = block_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128 b.BC = BC.BCret;
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1129 b.Belem = global.etest;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130 stest.Sfunc.Fstartblock = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1131 writefunc(stest);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1132 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1133
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1134 if (doppelganger)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1135 genmoduleinfo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1136 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1137
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1138 if (doppelganger)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1139 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1140 obj_termfile();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1143
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1144 if (global.params.multiobj)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1145 { /* This is necessary because the main .obj for this module is written
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1146 * first, but determining whether marray or massert are needed is done
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1147 * possibly later in the doppelganger modules.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1148 * Another way to fix it is do the main one last.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1149 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1150 toModuleAssert();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1151 toModuleArray();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1152 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1154 // If module assert
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1155 for (int i = 0; i < 2; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1156 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1157 Symbol* ma = i ? marray : massert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1158
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1159 if (ma)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1160 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1161 elem* elinnum;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1162 elem* efilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1163
176
fa9a71a9f5a8 Moved all the mutable globals to Global
korDen
parents: 174
diff changeset
1164 global.localgot = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1165
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1166 // Call dassert(filename, line)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1167 // Get sole parameter, linnum
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1168 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1169 Symbol* sp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1170
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1171 sp = symbol_calloc("linnum".ptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1172 sp.Stype = type_fake(TYM.TYint);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1173 sp.Stype.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1174 sp.Sclass = SC.SCfastpar;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1175 sp.Spreg = REG.AX;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1176 sp.Sflags &= ~SFL.SFLspill;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1177 sp.Sfl = FL.FLpara; // FLauto?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1178 cstate.CSpsymtab = &ma.Sfunc.Flocsym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1179 symbol_add(sp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1180
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1181 elinnum = el_var(sp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1182 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1183
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1184 efilename = toEmodulename();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1185
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1186 elem *e = el_var(rtlsym[i ? RTLSYM.RTLSYM_DARRAY : RTLSYM.RTLSYM_DASSERT]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1187 e = el_bin(OPER.OPcall, TYM.TYvoid, e, el_param(elinnum, efilename));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1189 block* b = block_calloc();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1190 b.BC = BC.BCret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1191 b.Belem = e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1192 ma.Sfunc.Fstartblock = b;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1193 ma.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1194 ma.Sfl = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1195 writefunc(ma);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1196 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1197 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1198
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1199
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1200 static if (true) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1201 // Always generate module info, because of templates and -cov
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1202 if (1 || needModuleInfo())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1203 genmoduleinfo();
5
63623152e82a Fixed memory corruption bug which was introduced when attempting to restore GC functionality
dkoroskin <>
parents: 4
diff changeset
1204 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1205
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1206 obj_termfile();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1207 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1208
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1209 void gensymfile()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1210 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1211 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1212 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1213
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1214 void gendocfile()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1215 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1216 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1217 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1218
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1219 /**********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1220 * Determine if we need to generate an instance of ModuleInfo
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1221 * for this Module.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1222 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1223 bool needModuleInfo()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1224 {
96
acd69f84627e further work
Trass3r
parents: 81
diff changeset
1225 // writef("needModuleInfo() %s, %d, %d\n", toChars(), needmoduleinfo, global.params.cov);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1226 return needmoduleinfo || global.params.cov;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1227 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1228
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
1229 override Dsymbol search(Loc loc, Identifier ident, int flags)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1230 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1231 /* Since modules can be circularly referenced,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1232 * need to stop infinite recursive searches.
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1233 * This is done with the cache.
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1234 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1235
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1236 //printf("%s Module.search('%s', flags = %d) insearch = %d\n", toChars(), ident.toChars(), flags, insearch);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1237 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1238 if (insearch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1239 s = null;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1240 else if (searchCacheIdent == ident && searchCacheFlags == flags)
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1241 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1242 s = searchCacheSymbol;
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1243 //printf("%s Module.search('%s', flags = %d) insearch = %d searchCacheSymbol = %s\n", toChars(), ident.toChars(), flags, insearch, searchCacheSymbol ? searchCacheSymbol.toChars() : "null");
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
1244 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1245 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1246 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1247 insearch = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1248 s = ScopeDsymbol.search(loc, ident, flags);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1249 insearch = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1250
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1251 searchCacheIdent = ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1252 searchCacheSymbol = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1253 searchCacheFlags = flags;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1254 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1255 return s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1256 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1257
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1258 void deleteObjFile()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1259 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1260 if (global.params.obj)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1261 objfile.remove();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1262 if (docfile)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1263 docfile.remove();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1264 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1265
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1266 override Dsymbol symtabInsert(Dsymbol s)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1267 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1268 searchCacheIdent = null; // symbol is inserted, so invalidate cache
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1269 return Package.symtabInsert(s);
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1270 }
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1271
29
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1272 /*******************************************
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1273 * Can't run semantic on s now, try again later.
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1274 */
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1275 void addDeferredSemantic(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1276 {
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1277 auto deferred = global.deferred;
29
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1278 // Don't add it if it is already there
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1279 for (int i = 0; i < deferred.dim; i++)
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1280 {
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1281 Dsymbol sd = cast(Dsymbol)deferred.data[i];
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1282
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1283 if (sd == s)
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1284 return;
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1285 }
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1286
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
1287 //printf("Module::addDeferredSemantic('%s')\n", s.toChars());
29
9fe59705c82d Implemented Module.addDeferredSemantic, removed -release from the linux commands file.
Robert Clipsham <robert@octarineparrot.com>
parents: 23
diff changeset
1288 deferred.push(cast(void*)s);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1289 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1290
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1291 /******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1292 * Run semantic() on deferred symbols.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1293 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1295 void runDeferredSemantic()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1296 {
170
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1297 if (global.nested)
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1298 return;
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1299 //if (deferred.dim) printf("+Module.runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1300 global.nested++;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1301
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1302 size_t len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1303
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1304 auto deferred = global.deferred;
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1305
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1306 do
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1307 {
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1308 global.dprogress = 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1309 len = deferred.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1310 if (!len)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1311 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1312
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1313 Dsymbol *todo;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1314 Dsymbol tmp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1315 if (len == 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1316 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1317 todo = &tmp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1318 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1319 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1320 {
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 5
diff changeset
1321 version(Bug4054)
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 5
diff changeset
1322 todo = cast(Dsymbol*)GC.malloc(len * (Dsymbol*).sizeof);
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 5
diff changeset
1323 else
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1324 todo = cast(Dsymbol*)alloca(len * (Dsymbol*).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1325 assert(todo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1326 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1327 memcpy(todo, deferred.data, len * (Dsymbol*).sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1328 deferred.setDim(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1329
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1330 for (int i = 0; i < len; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1331 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1332 Dsymbol s = todo[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1333
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1334 s.semantic(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1335 //printf("deferred: %s, parent = %s\n", s.toChars(), s.parent.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1336 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1337 //printf("\tdeferred.dim = %d, len = %d, dprogress = %d\n", deferred.dim, len, dprogress);
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1338 } while (deferred.dim < len || global.dprogress); // while making progress
170
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1339 global.nested--;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1340 //printf("-Module.runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1341 }
81
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1342
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1343 /************************************
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1344 * Recursively look at every module this module imports,
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1345 * return TRUE if it imports m.
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1346 * Can be used to detect circular imports.
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1347 */
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1348 bool imports(Module m)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1349 {
81
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1350 // writef("%s Module::imports(%s)\n", toChars(), m.toChars());
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1351 int aimports_dim = aimports.dim;
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1352 static if (false)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1353 {
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1354 for (int i = 0; i < aimports.dim; i++)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1355 { Module mi = cast(Module)aimports.data[i];
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1356 writef("\t[%d] %s\n", i, mi.toChars());
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1357 }
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1358 }
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1359 for (int i = 0; i < aimports.dim; i++)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1360 { Module mi = cast(Module)aimports.data[i];
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1361 if (mi == m)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1362 return true;
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1363 if (!mi.insearch)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1364 {
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1365 mi.insearch = 1;
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1366 bool r = mi.imports(m);
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1367 if (r)
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1368 return r;
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1369 }
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1370 }
722df8e7509c * fixed win32_lib
Trass3r
parents: 79
diff changeset
1371 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1372 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1373
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1374 // Back end
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1375
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1376 int doppelganger; // sub-module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1377 Symbol* cov; // private uint[] __coverage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1378 uint* covb; // bit array of valid code line numbers
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1379
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1380 Symbol* sictor; // module order independent constructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1381 Symbol* sctor; // module constructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1382 Symbol* sdtor; // module destructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1383 Symbol* stest; // module unit test
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1384
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1385 Symbol* sfilename; // symbol for filename
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1386
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1387 Symbol* massert; // module assert function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1388 Symbol* toModuleAssert() // get module assert function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1389 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1390 if (!massert)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1391 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1392 type* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1393
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1394 t = type_alloc(TYjfunc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1395 t.Tflags |= TFprototype | TFfixed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1396 t.Tmangle = mTYman_d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1397 t.Tnext = tsvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1398 tsvoid.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1399
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1400 massert = toSymbolX("__assert", SCextern, t, "FiZv");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1401 massert.Sfl = FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1402 massert.Sflags |= SFLnodebug;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1403 slist_add(massert);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1404 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1405 return massert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1406 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1407
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1408 Symbol* marray; // module array bounds function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1409
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1410 Symbol* toModuleArray() // get module array bounds function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1411 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1412 if (!marray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1413 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1414 type* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1415
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1416 t = type_alloc(TYjfunc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1417 t.Tflags |= TFprototype | TFfixed;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1418 t.Tmangle = mTYman_d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1419 t.Tnext = tsvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1420 tsvoid.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1421
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1422 marray = toSymbolX("__array", SCextern, t, "Z");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1423 marray.Sfl = FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1424 marray.Sflags |= SFLnodebug;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1425 slist_add(marray);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1426 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1427 return marray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1428 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1429
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1430 static Symbol* gencritsec()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1431 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1432 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1433 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1434
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1435 elem* toEfilename()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1436 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1437 elem* efilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1438
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1439 if (!sfilename)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1440 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1441 dt_t* dt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1442
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1443 string id = srcfile.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1444 int len = id.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1445 dtdword(&dt, len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1446 dtabytes(&dt,TYnptr, 0, len + 1, toStringz(id));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1447
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1448 sfilename = symbol_generate(SCstatic,type_fake(TYdarray));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1449 sfilename.Sdt = dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1450 sfilename.Sfl = FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1451 version (ELFOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1452 sfilename.Sseg = Segment.CDATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1453 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1454 version (MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1455 // Because of PIC and CDATA being in the _TEXT segment, cannot
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1456 // have pointers in CDATA
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1457 sfilename.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1458 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1459 outdata(sfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1460 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1461
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1462 efilename = el_var(sfilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1463 return efilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1464 }
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1465
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1466 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1467 * Generate elem that is a pointer to the module file name.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1468 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1469 elem* toEmodulename()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1470 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1471 elem *efilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1472
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1473 // Get filename
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1474 if (needModuleInfo())
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1475 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1476 /* Class ModuleInfo is defined in std.moduleinfo.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1477 * The first member is the name of it, char name[],
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1478 * which will be at offset 8.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1479 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1480
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1481 Symbol* si = toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1482 static if (true) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1483 // Use this instead so -fPIC will work
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1484 efilename = el_ptr(si);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1485 efilename = el_bin(OPadd, TYnptr, efilename, el_long(TYuint, 8));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1486 efilename = el_una(OPind, TYdarray, efilename);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1487 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1488 efilename = el_var(si);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1489 efilename.Ety = TYdarray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1490 efilename.EV.sp.Voffset += 8;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1491 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1492 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1493 else // generate our own filename
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1494 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1495 efilename = toEfilename();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1496 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1497 return efilename;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1498 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1499
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1500 /*************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1501 * Create the "ModuleInfo" symbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1502 */
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
1503 override Symbol* toSymbol()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1504 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1505 if (!csym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1506 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1507 Symbol* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1508
170
96c0fff6897d more global state cleanup
korDen
parents: 169
diff changeset
1509 s = toSymbolX("__ModuleInfo", SC.SCextern, global.scc.Stype, "Z");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1510 s.Sfl = FL.FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1511 s.Sflags |= SFL.SFLnodebug;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1512 csym = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1513 slist_add(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1514 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1515 return csym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1516 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1517
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1518 // Put out instance of ModuleInfo for this Module
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1519 void genmoduleinfo()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1520 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1521 //printf("Module.genmoduleinfo() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1522
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1523 Symbol* msym = toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1524
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1525 //dumpSymbol(msym);
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1526
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1527 uint offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1528 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1529 uint sizeof_ModuleInfo = 18 * PTRSIZE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1530 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1531 uint sizeof_ModuleInfo = 14 * PTRSIZE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1532 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1533
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1534 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1535
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1536 csym.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1537
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1538 csym.Sfl = FL.FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1539
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1540 /* The layout is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1541 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1542 void **vptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1543 monitor_t monitor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1544 char[] name; // class name
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1545 ModuleInfo importedModules[];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1546 ClassInfo localClasses[];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1547 uint flags; // initialization state
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1548 void *ctor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1549 void *dtor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1550 void *unitTest;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1551 const(MemberInfo[]) function(string) xgetMembers; // module getMembers() function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1552 void *ictor;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1553 void*[4] reserved;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1554 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1555 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1556 dt_t* dt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1557
169
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1558 if (global.moduleinfo)
e7769d53e750 Moves static variables from Module to Global
korDen
parents: 129
diff changeset
1559 dtxoff(&dt, global.moduleinfo.toVtblSymbol(), 0, TYM.TYnptr); // vtbl for ModuleInfo
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1560 else
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1561 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1562 //printf("moduleinfo is null\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1563 dtdword(&dt, 0); // BUG: should be an assert()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1564 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1565 dtdword(&dt, 0); // monitor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1566
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1567 // name[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1568 string name = toPrettyChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1569 size_t namelen = name.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1570 dtdword(&dt, namelen);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1571 dtabytes(&dt, TYM.TYnptr, 0, namelen + 1, toStringz(name));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1572
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1573 ClassDeclarations aclasses = new ClassDeclarations();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1574
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1575 //printf("members.dim = %d\n", members.dim);
77
ad4792a1cfd6 more D-ification container accessing
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 74
diff changeset
1576 foreach(Dsymbol member; members)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1577 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1578 //printf("\tmember '%s'\n", member.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1579 member.addLocalClass(aclasses);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1580 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1581
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1582 // importedModules[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1583 int aimports_dim = aimports.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1584 for (int i = 0; i < aimports.dim; i++)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1585 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1586 Module m = cast(Module)aimports.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1587 if (!m.needModuleInfo())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1588 aimports_dim--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1589 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1590
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1591 dtdword(&dt, aimports_dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1592 if (aimports_dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1593 dtxoff(&dt, csym, sizeof_ModuleInfo, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1594 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1595 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1596
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1597 // localClasses[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1598 dtdword(&dt, aclasses.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1599 if (aclasses.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1600 dtxoff(&dt, csym, sizeof_ModuleInfo + aimports_dim * PTRSIZE, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1601 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1602 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1603
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1604 if (needmoduleinfo)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1605 dtdword(&dt, 8|0); // flags (4 means MIstandalone)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1606 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1607 dtdword(&dt, 8|4); // flags (4 means MIstandalone)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1608
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1609 if (sctor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1610 dtxoff(&dt, sctor, 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1611 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1612 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1613
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1614 if (sdtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1615 dtxoff(&dt, sdtor, 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1616 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1617 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1618
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1619 if (stest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1620 dtxoff(&dt, stest, 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1621 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1622 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1623
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1624 /// version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1625 FuncDeclaration sgetmembers = findGetMembers();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1626 if (sgetmembers)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1627 dtxoff(&dt, sgetmembers.toSymbol(), 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1628 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1629 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1630 dtdword(&dt, 0); // xgetMembers
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1631
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1632 if (sictor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1633 dtxoff(&dt, sictor, 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1634 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1635 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1636
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1637 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1638 // void*[4] reserved;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1639 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1640 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1641 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1642 dtdword(&dt, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1643 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1644 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1645
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1646 for (int i = 0; i < aimports.dim; i++)
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1647 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1648 Module m = cast(Module)aimports.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1649
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1650 if (m.needModuleInfo())
174
af724d3510d7 lot os toCBuffer methods implemented
korDen
parents: 170
diff changeset
1651 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1652 Symbol* s = m.toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1653
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1654 /* Weak references don't pull objects in from the library,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1655 * they resolve to 0 if not pulled in by something else.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1656 * Don't pull in a module just because it was imported.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1657 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1658 version (OMFOBJ) {// Optlink crashes with weak symbols at EIP 41AFE7, 402000
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1659 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1660 s.Sflags |= SFL.SFLweak;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1661 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1662 dtxoff(&dt, s, 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1663 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1664 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1665
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1666 foreach (cd; aclasses)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1667 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1668 dtxoff(&dt, cd.toSymbol(), 0, TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1669 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1670
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1671 csym.Sdt = dt;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1672 version (ELFOBJ_OR_MACHOBJ) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1673 // Cannot be CONST because the startup code sets flag bits in it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1674 csym.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1675 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1676
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1677 outdata(csym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1678
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1679 //////////////////////////////////////////////
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1680
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1681 obj_moduleinfo(msym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1682 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1683
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 29
diff changeset
1684 override Module isModule() { return this; }
14
2cc604139636 Implemented Linux support for ddmd. Some parts are a bit hacky to just "get it working", that said, druntime and phobos compile, and unittests pass.
Robert Clipsham <robert@octarineparrot.com>
parents: 5
diff changeset
1685 }