annotate dmd/module.c @ 956:369996c08420

Change the numbering of static ctors/dtors to be module based instead of being global. This fixes #210 by making sure that the static ctor always gets the same number, regardless of the order of the modules given at the command line.
author Christian Kamm <kamm incasoftware de>
date Sun, 15 Feb 2009 11:46:28 +0100
parents 330f999ade44
children 31bbc7f3b817
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
2 // Compiler implementation of the D programming language
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
3 // Copyright (c) 1999-2007 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
4 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
5 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
6 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
7 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
9 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
11 #include <stdio.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
12 #include <stdlib.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
13 #include <assert.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
14
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 751
diff changeset
15 #if (defined (__SVR4) && defined (__sun))
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 751
diff changeset
16 #include <alloca.h>
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 751
diff changeset
17 #endif
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 751
diff changeset
18
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
19 #if _MSC_VER || __MINGW32__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
20 #include <malloc.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
21 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
22
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
23 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
24 #include "gdc_alloca.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
25 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
26
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
27 #include "mem.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
28
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
29 #include "mars.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
30 #include "module.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
31 #include "parse.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
32 #include "scope.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
33 #include "identifier.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
34 #include "id.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
35 #include "import.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
36 #include "dsymbol.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
37 #include "hdrgen.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
38 #include "lexer.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
39
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
40 #define MARS 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
41 #include "html.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
42
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
43 #ifdef IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
44 #include "d-dmd-gcc.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
45 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
46
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
47 ClassDeclaration *Module::moduleinfo;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
48
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
49 Module *Module::rootModule;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
50 DsymbolTable *Module::modules;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
51 Array Module::amodules;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
52
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
53 Array Module::deferred; // deferred Dsymbol's needing semantic() run on them
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
54 unsigned Module::dprogress;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
55
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
56 void Module::init()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
57 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
58 modules = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
59 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
60
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
61 Module::Module(char *filename, Identifier *ident, int doDocComment, int doHdrGen)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
62 : Package(ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
63 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
64 FileName *srcfilename;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
65
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
66 // printf("Module::Module(filename = '%s', ident = '%s')\n", filename, ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
67 this->arg = filename;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
68 md = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
69 errors = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
70 numlines = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
71 members = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
72 isHtml = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
73 isDocFile = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
74 needmoduleinfo = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
75 #ifdef IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
76 strictlyneedmoduleinfo = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
77 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
78 insearch = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
79 searchCacheIdent = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
80 searchCacheSymbol = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
81 searchCacheFlags = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
82 semanticstarted = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
83 semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
84 decldefs = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
85 vmoduleinfo = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
86 massert = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
87 marray = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
88 sictor = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
89 sctor = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
90 sdtor = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
91 stest = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
92 sfilename = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
93 root = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
94 importedFrom = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
95 srcfile = NULL;
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
96 objfile = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
97 docfile = NULL;
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
98 hdrfile = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
99
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
100 debuglevel = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
101 debugids = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
102 debugidsNot = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
103 versionlevel = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
104 versionids = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
105 versionidsNot = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
106
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
107 macrotable = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
108 escapetable = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
109 doppelganger = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
110 cov = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
111 covb = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
112
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
113 srcfilename = FileName::defaultExt(filename, global.mars_ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
114 if (!srcfilename->equalsExt(global.mars_ext) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
115 !srcfilename->equalsExt(global.hdr_ext) &&
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
116 !srcfilename->equalsExt("dd"))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
117 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
118 if (srcfilename->equalsExt("html") ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
119 srcfilename->equalsExt("htm") ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
120 srcfilename->equalsExt("xhtml"))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
121 isHtml = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
122 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
123 { error("source file name '%s' must have .%s extension", srcfilename->toChars(), global.mars_ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
124 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
125 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
126 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
127 srcfile = new File(srcfilename);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
128
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 643
diff changeset
129 // LDC
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
130 llvmForceLogging = false;
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
131 this->doDocComment = doDocComment;
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
132 this->doHdrGen = doHdrGen;
956
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
133 uniqueId = 0;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
134 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
135
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
136 File* Module::buildFilePath(char* forcename, char* path, char* ext)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
137 {
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
138 char *argobj;
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
139 if (forcename)
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
140 argobj = forcename;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
141 else
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
142 {
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
143 if (global.params.preservePaths)
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
144 argobj = (char*)this->arg;
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
145 else
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
146 argobj = FileName::name((char*)this->arg);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
147
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
148 if (global.params.fqnNames)
643
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
149 {
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
150 if(md)
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
151 argobj = FileName::replaceName(argobj, md->toChars());
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
152 else
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
153 argobj = FileName::replaceName(argobj, toChars());
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
154
643
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
155 // add ext, otherwise forceExt will make nested.module into nested.bc
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
156 size_t len = strlen(argobj);
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
157 size_t extlen = strlen(ext);
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
158 char* s = (char *)alloca(len + 1 + extlen + 1);
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
159 memcpy(s, argobj, len);
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
160 s[len] = '.';
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
161 memcpy(s + len + 1, ext, extlen + 1);
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
162 s[len+1+extlen] = 0;
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
163 argobj = s;
2a0bcf7f7b3d Fix -oq, closes #96
Christian Kamm <kamm incasoftware de>
parents: 614
diff changeset
164 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
165 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
166
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
167 if (!FileName::absolute(argobj))
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
168 {
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
169 argobj = FileName::combine(path, argobj);
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
170 }
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
171
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
172 FileName::ensurePathExists(FileName::path(argobj));
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
173
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
174 // always append the extension! otherwise hard to make output switches consistent
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
175 // if (forcename)
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
176 // return new File(argobj);
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
177 // else
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
178 // allow for .o and .obj on windows
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
179 #if _WIN32
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
180 if (ext == global.params.objdir && FileName::ext(argobj)
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
181 && stricmp(FileName::ext(argobj), global.obj_ext_alt) == 0)
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
182 return new File(argobj);
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
183 #endif
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 675
diff changeset
184 return new File(FileName::forceExt(argobj, ext));
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
185 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
186
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
187 void Module::buildTargetFiles()
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
188 {
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
189 if(objfile &&
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
190 (!doDocComment || docfile) &&
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
191 (!doHdrGen || hdrfile))
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
192 return;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
193
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
194 if(!objfile)
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 664
diff changeset
195 objfile = Module::buildFilePath(global.params.objname, global.params.objdir, global.obj_ext);
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
196 if(doDocComment && !docfile)
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
197 docfile = Module::buildFilePath(global.params.docname, global.params.docdir, global.doc_ext);
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
198 if(doHdrGen && !hdrfile)
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
199 hdrfile = Module::buildFilePath(global.params.hdrname, global.params.hdrdir, global.hdr_ext);
598
13ff06605226 To prevert source-overwriting in the future, forbit output files with the same
Christian Kamm <kamm incasoftware de>
parents: 597
diff changeset
200
13ff06605226 To prevert source-overwriting in the future, forbit output files with the same
Christian Kamm <kamm incasoftware de>
parents: 597
diff changeset
201 // safety check: never allow obj, doc or hdr file to have the source file's name
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
202 if(stricmp(FileName::name(objfile->name->str), FileName::name((char*)this->arg)) == 0)
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
203 {
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
204 error("Output object files with the same name as the source file are forbidden");
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
205 fatal();
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
206 }
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
207 if(docfile && stricmp(FileName::name(docfile->name->str), FileName::name((char*)this->arg)) == 0)
598
13ff06605226 To prevert source-overwriting in the future, forbit output files with the same
Christian Kamm <kamm incasoftware de>
parents: 597
diff changeset
208 {
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
209 error("Output doc files with the same name as the source file are forbidden");
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
210 fatal();
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
211 }
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
212 if(hdrfile && stricmp(FileName::name(hdrfile->name->str), FileName::name((char*)this->arg)) == 0)
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
213 {
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
214 error("Output header files with the same name as the source file are forbidden");
598
13ff06605226 To prevert source-overwriting in the future, forbit output files with the same
Christian Kamm <kamm incasoftware de>
parents: 597
diff changeset
215 fatal();
13ff06605226 To prevert source-overwriting in the future, forbit output files with the same
Christian Kamm <kamm incasoftware de>
parents: 597
diff changeset
216 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
217 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
218
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
219 void Module::deleteObjFile()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
220 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
221 if (global.params.obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
222 objfile->remove();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
223 //if (global.params.llvmBC)
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
224 //bcfile->remove();
604
a30fc28e8f23 Make creating and deleting of doc and hdr files dependent on whether doc and
Christian Kamm <kamm incasoftware de>
parents: 598
diff changeset
225 if (doDocComment && docfile)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
226 docfile->remove();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
227 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
228
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
229 Module::~Module()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
230 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
231 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
232
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
233 const char *Module::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
234 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
235 return "module";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
236 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
237
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
238 Module *Module::load(Loc loc, Array *packages, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
239 { Module *m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
240 char *filename;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
241
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
242 //printf("Module::load(ident = '%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
243
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
244 // Build module filename by turning:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
245 // foo.bar.baz
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
246 // into:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
247 // foo\bar\baz
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
248 filename = ident->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
249 if (packages && packages->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
250 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
251 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
252 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
253
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
254 for (i = 0; i < packages->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
255 { Identifier *pid = (Identifier *)packages->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
256
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
257 buf.writestring(pid->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
258 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
259 buf.writeByte('\\');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
260 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
261 buf.writeByte('/');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
262 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
263 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
264 buf.writestring(filename);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
265 buf.writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
266 filename = (char *)buf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
267 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
268
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
269 m = new Module(filename, ident, 0, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
270 m->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
271
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
272 /* Search along global.path for .di file, then .d file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
273 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
274 char *result = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
275 FileName *fdi = FileName::forceExt(filename, global.hdr_ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
276 FileName *fd = FileName::forceExt(filename, global.mars_ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
277 char *sdi = fdi->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
278 char *sd = fd->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
279
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
280 if (FileName::exists(sdi))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
281 result = sdi;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
282 else if (FileName::exists(sd))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
283 result = sd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
284 else if (FileName::absolute(filename))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
285 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
286 else if (!global.path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
287 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
288 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
289 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
290 for (size_t i = 0; i < global.path->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
291 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
292 char *p = (char *)global.path->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
293 char *n = FileName::combine(p, sdi);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
294 if (FileName::exists(n))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
295 { result = n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
296 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
297 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
298 mem.free(n);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
299 n = FileName::combine(p, sd);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
300 if (FileName::exists(n))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
301 { result = n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
302 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
303 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
304 mem.free(n);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
305 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
306 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
307 if (result)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
308 m->srcfile = new File(result);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
309
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
310 if (global.params.verbose)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
311 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
312 printf("import ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
313 if (packages)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
314 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
315 for (size_t i = 0; i < packages->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
316 { Identifier *pid = (Identifier *)packages->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
317 printf("%s.", pid->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
318 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
319 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
320 printf("%s\t(%s)\n", ident->toChars(), m->srcfile->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
321 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
322
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
323 m->read(loc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
324 m->parse();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
325
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
326 #ifdef IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
327 d_gcc_magic_module(m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
328 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
329
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
330 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
331 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
332
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
333 void Module::read(Loc loc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
334 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
335 //printf("Module::read('%s') file '%s'\n", toChars(), srcfile->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
336 if (srcfile->read())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
337 { error(loc, "cannot read file '%s'", srcfile->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
338 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
339 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
340 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
341
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
342 inline unsigned readwordLE(unsigned short *p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
343 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
344 #if __I86__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
345 return *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
346 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
347 return (((unsigned char *)p)[1] << 8) | ((unsigned char *)p)[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
348 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
349 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
350
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
351 inline unsigned readwordBE(unsigned short *p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
352 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
353 return (((unsigned char *)p)[0] << 8) | ((unsigned char *)p)[1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
354 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
355
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
356 inline unsigned readlongLE(unsigned *p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
357 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
358 #if __I86__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
359 return *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
360 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
361 return ((unsigned char *)p)[0] |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
362 (((unsigned char *)p)[1] << 8) |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
363 (((unsigned char *)p)[2] << 16) |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
364 (((unsigned char *)p)[3] << 24);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
365 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
366 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
367
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
368 inline unsigned readlongBE(unsigned *p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
369 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
370 return ((unsigned char *)p)[3] |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
371 (((unsigned char *)p)[2] << 8) |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
372 (((unsigned char *)p)[1] << 16) |
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
373 (((unsigned char *)p)[0] << 24);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
374 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
375
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
376 #if IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
377 void Module::parse(bool dump_source)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
378 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
379 void Module::parse()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
380 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
381 { char *srcname;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
382 unsigned char *buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
383 unsigned buflen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
384 unsigned le;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
385 unsigned bom;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
386
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
387 //printf("Module::parse()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
388
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
389 srcname = srcfile->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
390 //printf("Module::parse(srcname = '%s')\n", srcname);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
391
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
392 buf = srcfile->buffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
393 buflen = srcfile->len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
394
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
395 if (buflen >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
396 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
397 /* Convert all non-UTF-8 formats to UTF-8.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
398 * BOM : http://www.unicode.org/faq/utf_bom.html
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
399 * 00 00 FE FF UTF-32BE, big-endian
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
400 * FF FE 00 00 UTF-32LE, little-endian
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
401 * FE FF UTF-16BE, big-endian
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
402 * FF FE UTF-16LE, little-endian
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
403 * EF BB BF UTF-8
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
404 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
405
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
406 bom = 1; // assume there's a BOM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
407 if (buf[0] == 0xFF && buf[1] == 0xFE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
408 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
409 if (buflen >= 4 && buf[2] == 0 && buf[3] == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
410 { // UTF-32LE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
411 le = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
412
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
413 Lutf32:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
414 OutBuffer dbuf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
415 unsigned *pu = (unsigned *)(buf);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
416 unsigned *pumax = &pu[buflen / 4];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
417
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
418 if (buflen & 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
419 { error("odd length of UTF-32 char source %u", buflen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
420 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
421 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
422
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
423 dbuf.reserve(buflen / 4);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
424 for (pu += bom; pu < pumax; pu++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
425 { unsigned u;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
426
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
427 u = le ? readlongLE(pu) : readlongBE(pu);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
428 if (u & ~0x7F)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
429 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
430 if (u > 0x10FFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
431 { error("UTF-32 value %08x greater than 0x10FFFF", u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
432 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
434 dbuf.writeUTF8(u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
435 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
436 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
437 dbuf.writeByte(u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
438 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
439 dbuf.writeByte(0); // add 0 as sentinel for scanner
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
440 buflen = dbuf.offset - 1; // don't include sentinel in count
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
441 buf = (unsigned char *) dbuf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
442 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
443 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
444 { // UTF-16LE (X86)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
445 // Convert it to UTF-8
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
446 le = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
447
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
448 Lutf16:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
449 OutBuffer dbuf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
450 unsigned short *pu = (unsigned short *)(buf);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
451 unsigned short *pumax = &pu[buflen / 2];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
452
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
453 if (buflen & 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
454 { error("odd length of UTF-16 char source %u", buflen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
455 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
456 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
457
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
458 dbuf.reserve(buflen / 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
459 for (pu += bom; pu < pumax; pu++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
460 { unsigned u;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
461
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
462 u = le ? readwordLE(pu) : readwordBE(pu);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
463 if (u & ~0x7F)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
464 { if (u >= 0xD800 && u <= 0xDBFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
465 { unsigned u2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
466
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
467 if (++pu > pumax)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
468 { error("surrogate UTF-16 high value %04x at EOF", u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
469 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
470 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
471 u2 = le ? readwordLE(pu) : readwordBE(pu);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
472 if (u2 < 0xDC00 || u2 > 0xDFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
473 { error("surrogate UTF-16 low value %04x out of range", u2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
474 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
475 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
476 u = (u - 0xD7C0) << 10;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
477 u |= (u2 - 0xDC00);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
478 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
479 else if (u >= 0xDC00 && u <= 0xDFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
480 { error("unpaired surrogate UTF-16 value %04x", u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
481 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
482 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
483 else if (u == 0xFFFE || u == 0xFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
484 { error("illegal UTF-16 value %04x", u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
485 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
486 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
487 dbuf.writeUTF8(u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
488 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
489 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
490 dbuf.writeByte(u);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
491 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
492 dbuf.writeByte(0); // add 0 as sentinel for scanner
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
493 buflen = dbuf.offset - 1; // don't include sentinel in count
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
494 buf = (unsigned char *) dbuf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
495 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
496 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
497 else if (buf[0] == 0xFE && buf[1] == 0xFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
498 { // UTF-16BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
499 le = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
500 goto Lutf16;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
501 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
502 else if (buflen >= 4 && buf[0] == 0 && buf[1] == 0 && buf[2] == 0xFE && buf[3] == 0xFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
503 { // UTF-32BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
504 le = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
505 goto Lutf32;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
506 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
507 else if (buflen >= 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
508 { // UTF-8
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
509
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
510 buf += 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
511 buflen -= 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
512 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
513 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
514 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
515 /* There is no BOM. Make use of Arcane Jill's insight that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
516 * the first char of D source must be ASCII to
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
517 * figure out the encoding.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
518 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
519
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
520 bom = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
521 if (buflen >= 4)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
522 { if (buf[1] == 0 && buf[2] == 0 && buf[3] == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
523 { // UTF-32LE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
524 le = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
525 goto Lutf32;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
526 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
527 else if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
528 { // UTF-32BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
529 le = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
530 goto Lutf32;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
531 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
532 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
533 if (buflen >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
534 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
535 if (buf[1] == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
536 { // UTF-16LE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
537 le = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
538 goto Lutf16;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
539 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
540 else if (buf[0] == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
541 { // UTF-16BE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
542 le = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
543 goto Lutf16;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
544 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
545 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
546
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
547 // It's UTF-8
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
548 if (buf[0] >= 0x80)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
549 { error("source file must start with BOM or ASCII character, not \\x%02X", buf[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
550 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
551 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
552 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
553 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
554
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
555 #ifdef IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
556 // dump utf-8 encoded source
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
557 if (dump_source)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
558 { // %% srcname could contain a path ...
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
559 d_gcc_dump_source(srcname, "utf-8", buf, buflen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
560 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
561 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
562
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
563 /* If it starts with the string "Ddoc", then it's a documentation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
564 * source file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
565 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
566 if (buflen >= 4 && memcmp(buf, "Ddoc", 4) == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
567 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
568 comment = buf + 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
569 isDocFile = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
570 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
571 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
572 if (isHtml)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
573 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
574 OutBuffer *dbuf = new OutBuffer();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
575 Html h(srcname, buf, buflen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
576 h.extractCode(dbuf);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
577 buf = dbuf->data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
578 buflen = dbuf->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
579 #ifdef IN_GCC
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
580 // dump extracted source
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
581 if (dump_source)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
582 d_gcc_dump_source(srcname, "d.utf-8", buf, buflen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
583 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
584 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
585 Parser p(this, buf, buflen, docfile != NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
586 p.nextToken();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
587 members = p.parseModule();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
588 md = p.md;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
589 numlines = p.loc.linnum;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
591 DsymbolTable *dst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
592
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
593 if (md)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
594 { this->ident = md->id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
595 dst = Package::resolve(md->packages, &this->parent, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
596 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
597 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
598 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
599 dst = modules;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
600
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
601 /* Check to see if module name is a valid identifier
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
602 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
603 if (!Lexer::isValidIdentifier(this->ident->toChars()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
604 error("has non-identifier characters in filename, use module declaration instead");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
605 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
606
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
607 // Update global list of modules
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
608 if (!dst->insert(this))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
609 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
610 if (md)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
611 error(loc, "is in multiple packages %s", md->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
612 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
613 error(loc, "is in multiple defined");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
614 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
615 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
616 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
617 amodules.push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
618 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
619 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
620
751
dc8b8b7ea0c1 Fix compile-time warnings. Adjust include in d-asm-i386.
Christian Kamm <kamm incasoftware de>
parents: 708
diff changeset
621 void Module::semantic(Scope* unused_sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
622 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
623
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
624 if (semanticstarted)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
625 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
626
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
627 //printf("+Module::semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
628 semanticstarted = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
629
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
630 // Note that modules get their own scope, from scratch.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
631 // This is so regardless of where in the syntax a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
632 // gets imported, it is unaffected by context.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
633 Scope *sc = Scope::createGlobal(this); // create root scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
634
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
635 //printf("Module = %p, linkage = %d\n", sc->scopesym, sc->linkage);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
636
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
637 // Add import of "object" if this module isn't "object"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
638 if (ident != Id::object)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
639 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
640 Import *im = new Import(0, NULL, Id::object, NULL, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
641 members->shift(im);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
642 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
643
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
644 // Add all symbols into module's symbol table
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
645 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
646 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
647 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
648
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
649 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
650 s->addMember(NULL, sc->scopesym, 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
651 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
652
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
653 // Pass 1 semantic routines: do public side of the definition
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
654 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
655 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
656
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
657 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
658 //printf("\tModule('%s'): '%s'.semantic()\n", toChars(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
659 s->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
660 runDeferredSemantic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
661 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
662
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
663 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
664 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
665 semanticdone = semanticstarted;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
666 //printf("-Module::semantic(this = %p, '%s'): parent = %p\n", this, toChars(), parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
667 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
668
751
dc8b8b7ea0c1 Fix compile-time warnings. Adjust include in d-asm-i386.
Christian Kamm <kamm incasoftware de>
parents: 708
diff changeset
669 void Module::semantic2(Scope* unused_sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
670 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
671
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
672 if (deferred.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
673 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
674 for (int i = 0; i < deferred.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
675 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
676 Dsymbol *sd = (Dsymbol *)deferred.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
677
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
678 sd->error("unable to resolve forward reference in definition");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
679 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
680 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
681 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
682 //printf("Module::semantic2('%s'): parent = %p\n", toChars(), parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
683 if (semanticstarted >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
684 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
685 assert(semanticstarted == 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
686 semanticstarted = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
687
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
688 // Note that modules get their own scope, from scratch.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
689 // This is so regardless of where in the syntax a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
690 // gets imported, it is unaffected by context.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
691 Scope *sc = Scope::createGlobal(this); // create root scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
692 //printf("Module = %p\n", sc.scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
693
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
694 // Pass 2 semantic routines: do initializers and function bodies
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
695 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
696 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
697
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
698 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
699 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
700 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
701
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
702 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
703 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
704 semanticdone = semanticstarted;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
705 //printf("-Module::semantic2('%s'): parent = %p\n", toChars(), parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
706 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
707
751
dc8b8b7ea0c1 Fix compile-time warnings. Adjust include in d-asm-i386.
Christian Kamm <kamm incasoftware de>
parents: 708
diff changeset
708 void Module::semantic3(Scope* unused_sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
709 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
710
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
711 //printf("Module::semantic3('%s'): parent = %p\n", toChars(), parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
712 if (semanticstarted >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
713 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
714 assert(semanticstarted == 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
715 semanticstarted = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
716
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
717 // Note that modules get their own scope, from scratch.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
718 // This is so regardless of where in the syntax a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
719 // gets imported, it is unaffected by context.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
720 Scope *sc = Scope::createGlobal(this); // create root scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
721 //printf("Module = %p\n", sc.scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
722
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
723 // Pass 3 semantic routines: do initializers and function bodies
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
724 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
725 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
726
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
727 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
728 //printf("Module %s: %s.semantic3()\n", toChars(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
729 s->semantic3(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
730 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
731
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
732 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
733 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
734 semanticdone = semanticstarted;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
735 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
736
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
737 void Module::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
738 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
739
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
740 if (semanticstarted >= 4)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
741 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
742 assert(semanticstarted == 3);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
743 semanticstarted = 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
744
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
745 // Note that modules get their own scope, from scratch.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
746 // This is so regardless of where in the syntax a module
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
747 // gets imported, it is unaffected by context.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
748 //printf("Module = %p\n", sc.scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
749
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
750 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
751 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
752
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
753 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
754 //if (global.params.verbose)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
755 //printf("inline scan symbol %s\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
756
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
757 s->inlineScan();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
758 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
759 semanticdone = semanticstarted;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
760 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
761
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
762 /****************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
763 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
764
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
765 // is this used anywhere?
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
766 /*
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
767 void Module::gensymfile()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
768 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
769 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
770 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
771
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
772 //printf("Module::gensymfile()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
773
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
774 buf.printf("// Sym file generated from '%s'", srcfile->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
775 buf.writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
776
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
777 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
778 { Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
779
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
780 s->toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
781 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
782
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
783 // Transfer image to file
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
784 symfile->setbuffer(buf.data, buf.offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
785 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
786
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
787 symfile->writev();
580
7824c21a58e3 Restructure path handling a bit. Fixes #66.
Christian Kamm <kamm incasoftware de>
parents: 550
diff changeset
788 }*/
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
789
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
790 /**********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
791 * Determine if we need to generate an instance of ModuleInfo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
792 * for this Module.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
793 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
794
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
795 int Module::needModuleInfo()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
796 {
550
cbe08531430f Removed unimplemented switches.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 510
diff changeset
797 return needmoduleinfo;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
798 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
799
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
800 Dsymbol *Module::search(Loc loc, Identifier *ident, int flags)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
801 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
802 /* Since modules can be circularly referenced,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
803 * need to stop infinite recursive searches.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
804 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
805
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
806 //printf("%s Module::search('%s', flags = %d) insearch = %d\n", toChars(), ident->toChars(), flags, insearch);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
807 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
808 if (insearch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
809 s = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
810 else if (searchCacheIdent == ident && searchCacheFlags == flags)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
811 s = searchCacheSymbol;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
812 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
813 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
814 insearch = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
815 s = ScopeDsymbol::search(loc, ident, flags);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
816 insearch = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
817
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
818 searchCacheIdent = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
819 searchCacheSymbol = s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
820 searchCacheFlags = flags;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
821 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
822 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
823 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
824
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
825 /*******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
826 * Can't run semantic on s now, try again later.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
827 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
828
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
829 void Module::addDeferredSemantic(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
830 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
831 // Don't add it if it is already there
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
832 for (int i = 0; i < deferred.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
833 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
834 Dsymbol *sd = (Dsymbol *)deferred.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
835
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
836 if (sd == s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
837 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
838 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
839
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
840 //printf("Module::addDeferredSemantic('%s')\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
841 deferred.push(s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
842 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
843
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
844
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
845 /******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
846 * Run semantic() on deferred symbols.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
847 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
848
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
849 void Module::runDeferredSemantic()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
850 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
851 size_t len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
852
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
853 static int nested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
854 if (nested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
855 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
856 //if (deferred.dim) printf("+Module::runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
857 nested++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
858
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
859 do
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
860 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
861 dprogress = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
862 len = deferred.dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
863 if (!len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
864 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
865
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
866 Dsymbol **todo;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
867 Dsymbol *tmp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
868 if (len == 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
869 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
870 todo = &tmp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
871 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
872 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
873 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
874 todo = (Dsymbol **)alloca(len * sizeof(Dsymbol *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
875 assert(todo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
876 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
877 memcpy(todo, deferred.data, len * sizeof(Dsymbol *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
878 deferred.setDim(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
879
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
880 for (int i = 0; i < len; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
881 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
882 Dsymbol *s = todo[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
883
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
884 s->semantic(NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
885 //printf("deferred: %s, parent = %s\n", s->toChars(), s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
886 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
887 //printf("\tdeferred.dim = %d, len = %d, dprogress = %d\n", deferred.dim, len, dprogress);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
888 } while (deferred.dim < len || dprogress); // while making progress
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
889 nested--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
890 //printf("-Module::runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
891 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
892
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
893 /************************************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
894 * Recursively look at every module this module imports,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
895 * return TRUE if it imports m.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
896 * Can be used to detect circular imports.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
897 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
898
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
899 int Module::imports(Module *m)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
900 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
901 //printf("%s Module::imports(%s)\n", toChars(), m->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
902 int aimports_dim = aimports.dim;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
903 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
904 for (int i = 0; i < aimports.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
905 { Module *mi = (Module *)aimports.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
906 printf("\t[%d] %s\n", i, mi->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
907 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
908 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
909 for (int i = 0; i < aimports.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
910 { Module *mi = (Module *)aimports.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
911 if (mi == m)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
912 return TRUE;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
913 if (!mi->insearch)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
914 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
915 mi->insearch = 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
916 int r = mi->imports(m);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
917 mi->insearch = 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
918 if (r)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
919 return r;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
920 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
921 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
922 return FALSE;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
923 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 872
diff changeset
924
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
925 /* =========================== ModuleDeclaration ===================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
926
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
927 ModuleDeclaration::ModuleDeclaration(Array *packages, Identifier *id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
928 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
929 this->packages = packages;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
930 this->id = id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
931 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
932
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
933 char *ModuleDeclaration::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
934 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
935 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
936 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
937
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
938 if (packages && packages->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
939 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
940 for (i = 0; i < packages->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
941 { Identifier *pid = (Identifier *)packages->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
942
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
943 buf.writestring(pid->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
944 buf.writeByte('.');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
945 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
946 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
947 buf.writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
948 buf.writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
949 return (char *)buf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
950 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
951
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
952 /* =========================== Package ===================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
953
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
954 Package::Package(Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
955 : ScopeDsymbol(ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
956 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
957 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
958
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
959
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
960 const char *Package::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
961 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
962 return "package";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
963 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
964
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
965
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
966 DsymbolTable *Package::resolve(Array *packages, Dsymbol **pparent, Package **ppkg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
967 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
968 DsymbolTable *dst = Module::modules;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
969 Dsymbol *parent = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
970
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
971 //printf("Package::resolve()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
972 if (ppkg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
973 *ppkg = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
974
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
975 if (packages)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
976 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
977
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
978 for (i = 0; i < packages->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
979 { Identifier *pid = (Identifier *)packages->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
980 Dsymbol *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
981
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
982 p = dst->lookup(pid);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
983 if (!p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
984 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
985 p = new Package(pid);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
986 dst->insert(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
987 p->parent = parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
988 ((ScopeDsymbol *)p)->symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
989 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
990 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
991 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
992 assert(p->isPackage());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
993 if (p->isModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
994 { p->error("module and package have the same name");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
995 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
996 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
997 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
998 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
999 parent = p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1000 dst = ((Package *)p)->symtab;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1001 if (ppkg && !*ppkg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1002 *ppkg = (Package *)p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1003 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1004 if (pparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1005 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1006 *pparent = parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1007 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1008 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1009 return dst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 285
diff changeset
1010 }
956
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1011
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1012 Identifier* Module::generateId(Identifier* id)
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1013 {
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1014 return Identifier::generateId(id->string, uniqueId++);
369996c08420 Change the numbering of static ctors/dtors to be module based instead of being global.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1015 }