annotate dmd/scope.h @ 314:8d98e42ece93 trunk

[svn r335] The basics of exception handling are in place. Still need to make sure calls are turned into invokes everywhere. (NewExpression for instance) Still some rough edges and corner cases to figure out. Needs testing!
author ChristianK
date Wed, 02 Jul 2008 22:20:18 +0200
parents d59c363fccad
children d4e95db0e62b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
2 // Copyright (c) 1999-2005 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
10 #ifndef DMD_SCOPE_H
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
11 #define DMD_SCOPE_H
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
12
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
13 #ifdef __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
14 #pragma once
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
15 #endif /* __DMC__ */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
16
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
17 struct Dsymbol;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
18 struct ScopeDsymbol;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
19 struct Array;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
20 struct Identifier;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
21 struct Module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
22 struct Statement;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
23 struct SwitchStatement;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
24 struct TryFinallyStatement;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
25 struct LabelStatement;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
26 struct ForeachStatement;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
27 struct ClassDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
28 struct AggregateDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
29 struct AnonymousAggregateDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
30 struct FuncDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
31 struct DocComment;
309
d59c363fccad [svn r330] Implemented synchronized statements.
lindquist
parents: 159
diff changeset
32 struct EnclosingHandler;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
33 enum LINK;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
34 enum PROT;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
35
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
36 struct Scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
37 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
38 Scope *enclosing; // enclosing Scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
40 Module *module; // Root module
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
41 ScopeDsymbol *scopesym; // current symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
42 ScopeDsymbol *sd; // if in static if, and declaring new symbols,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
43 // sd gets the addMember()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
44 FuncDeclaration *func; // function we are in
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
45 Dsymbol *parent; // parent to use
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
46 LabelStatement *slabel; // enclosing labelled statement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
47 SwitchStatement *sw; // enclosing switch statement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
48 TryFinallyStatement *tf; // enclosing try finally statement; set inside its finally block
309
d59c363fccad [svn r330] Implemented synchronized statements.
lindquist
parents: 159
diff changeset
49 EnclosingHandler *tfOfTry; // enclosing try-finally, volatile or synchronized statement; set inside its try or body block
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
50 Statement *sbreak; // enclosing statement that supports "break"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
51 Statement *scontinue; // enclosing statement that supports "continue"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
52 ForeachStatement *fes; // if nested function for ForeachStatement, this is it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
53 unsigned offset; // next offset to use in aggregate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
54 int inunion; // we're processing members of a union
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
55 int incontract; // we're inside contract code
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
56 int nofree; // set if shouldn't free it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
57 int noctor; // set if constructor calls aren't allowed
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
58 int intypeof; // in typeof(exp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
59 int parameterSpecialization; // if in template parameter specialization
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
60 int noaccesscheck; // don't do access checks
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
61
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
62 unsigned callSuper; // primitive flow analysis for constructors
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
63 #define CSXthis_ctor 1 // called this()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
64 #define CSXsuper_ctor 2 // called super()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
65 #define CSXthis 4 // referenced this
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
66 #define CSXsuper 8 // referenced super
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
67 #define CSXlabel 0x10 // seen a label
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
68 #define CSXreturn 0x20 // seen a return statement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
69 #define CSXany_ctor 0x40 // either this() or super() was called
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
70
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
71 unsigned structalign; // alignment for struct members
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
72 enum LINK linkage; // linkage for external functions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
73
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
74 enum PROT protection; // protection for class members
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
75 int explicitProtection; // set if in an explicit protection attribute
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
76
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
77 unsigned stc; // storage class
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
78
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
79 unsigned flags;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
80 #define SCOPEctor 1 // constructor type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
81 #define SCOPEstaticif 2 // inside static if
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
82 #define SCOPEfree 4 // is on free list
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
84 AnonymousAggregateDeclaration *anonAgg; // for temporary analysis
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
85
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
86 DocComment *lastdc; // documentation comment for last symbol at this scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
87 unsigned lastoffset; // offset in docbuf of where to insert next dec
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
88 OutBuffer *docbuf; // buffer for documentation output
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
89
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
90 static Scope *freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
91 static void *operator new(size_t sz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
92 static Scope *createGlobal(Module *module);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
93
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
94 Scope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
95 Scope(Module *module);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
96 Scope(Scope *enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
97
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
98 Scope *push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
99 Scope *push(ScopeDsymbol *ss);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
100 Scope *pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
102 void mergeCallSuper(Loc loc, unsigned cs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
104 Dsymbol *search(Loc loc, Identifier *ident, Dsymbol **pscopesym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
105 Dsymbol *insert(Dsymbol *s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
107 ClassDeclaration *getClassScope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
108 AggregateDeclaration *getStructClassScope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
109 void setNoFree();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
110 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
111
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
112 #endif /* DMD_SCOPE_H */