Mercurial > projects > ldc
annotate dmd2/statement.c @ 1622:a542ef277a84
Merge DMD r316: bugzilla 3628 can't cast null to int
---
dmd/constfold.c | 2 +-
dmd/optimize.c | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
author | Leandro Lucarella <llucax@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 15:18:22 -0300 |
parents | d8e558087001 |
children |
rev | line source |
---|---|
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2 // Compiler implementation of the D programming language |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3 // Copyright (c) 1999-2009 by Digital Mars |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4 // All Rights Reserved |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
5 // written by Walter Bright |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
6 // http://www.digitalmars.com |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
7 // License for redistribution is by either the Artistic License |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
8 // in artistic.txt, or the GNU General Public License in gnu.txt. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
9 // See the included readme.txt for details. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
10 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
11 #include <stdio.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
12 #include <stdlib.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
13 #include <assert.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
14 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
15 #include "rmem.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
16 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
17 #include "statement.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
18 #include "expression.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
19 #include "cond.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
20 #include "init.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
21 #include "staticassert.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
22 #include "mtype.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
23 #include "scope.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
24 #include "declaration.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
25 #include "aggregate.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
26 #include "id.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
27 #include "hdrgen.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
28 #include "parse.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
29 #include "template.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
30 #include "attrib.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
31 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
32 #if IN_LLVM |
1582
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
33 // sizes based on those from tollvm.cpp:DtoMutexType() |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
34 int os_critsecsize() |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
35 { |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
36 if (global.params.os == OSWindows) |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
37 return 68; |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
38 else if (global.params.os == OSFreeBSD) |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
39 return sizeof(size_t); |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
40 else |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
41 return sizeof(pthread_mutex_t); |
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
42 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
43 #elif IN_DMD |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
44 extern int os_critsecsize(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
45 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
46 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
47 /******************************** Statement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
48 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
49 Statement::Statement(Loc loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
50 : loc(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
51 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
52 #ifdef _DH |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
53 // If this is an in{} contract scope statement (skip for determining |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
54 // inlineStatus of a function body for header content) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
55 incontract = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
56 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
57 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
58 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
59 Statement *Statement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
60 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
61 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
62 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
63 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
64 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
65 void Statement::print() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
66 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
67 fprintf(stdmsg, "%s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
68 fflush(stdmsg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
69 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
70 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
71 char *Statement::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
72 { OutBuffer *buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
73 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
74 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
75 buf = new OutBuffer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
76 toCBuffer(buf, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
77 return buf->toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
78 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
79 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
80 void Statement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
81 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
82 buf->printf("Statement::toCBuffer()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
83 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
84 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
85 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
86 Statement *Statement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
87 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
88 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
89 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
90 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
91 // Same as semantic(), but do create a new scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
92 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
93 Statement *Statement::semanticScope(Scope *sc, Statement *sbreak, Statement *scontinue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
94 { Scope *scd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
95 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
96 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
97 scd = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
98 if (sbreak) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
99 scd->sbreak = sbreak; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
100 if (scontinue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
101 scd->scontinue = scontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
102 s = semantic(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
103 scd->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
104 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
105 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
106 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
107 void Statement::error(const char *format, ...) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
108 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
109 va_list ap; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
110 va_start(ap, format); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
111 ::verror(loc, format, ap); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
112 va_end( ap ); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
113 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
114 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
115 void Statement::warning(const char *format, ...) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
116 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
117 if (global.params.warnings && !global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
118 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
119 va_list ap; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
120 va_start(ap, format); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
121 ::vwarning(loc, format, ap); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
122 va_end( ap ); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
123 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
124 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
125 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
126 int Statement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
127 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
128 //printf("Statement::hasBreak()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
129 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
130 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
131 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
132 int Statement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
133 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
134 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
135 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
136 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
137 // TRUE if statement uses exception handling |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
138 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
139 int Statement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
140 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
141 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
142 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
143 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
144 /* Only valid after semantic analysis |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
145 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
146 int Statement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
147 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
148 printf("Statement::blockExit(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
149 printf("%s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
150 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
151 return BEany; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
152 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
153 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
154 // TRUE if statement 'comes from' somewhere else, like a goto |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
155 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
156 int Statement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
157 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
158 //printf("Statement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
159 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
160 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
161 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
162 // Return TRUE if statement has no code in it |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
163 int Statement::isEmpty() |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
164 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
165 //printf("Statement::isEmpty()\n"); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
166 return FALSE; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
167 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
168 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
169 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
170 * If this statement has code that needs to run in a finally clause |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
171 * at the end of the current scope, return that code in the form of |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
172 * a Statement. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
173 * Output: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
174 * *sentry code executed upon entry to the scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
175 * *sexception code executed upon exit from the scope via exception |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
176 * *sfinally code executed in finally block |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
177 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
178 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
179 void Statement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
180 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
181 //printf("Statement::scopeCode()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
182 //print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
183 *sentry = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
184 *sexception = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
185 *sfinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
186 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
187 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
188 /********************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
189 * Flatten out the scope by presenting the statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
190 * as an array of statements. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
191 * Returns NULL if no flattening necessary. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
192 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
193 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
194 Statements *Statement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
195 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
196 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
197 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
198 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
199 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
200 /******************************** PeelStatement ***************************/ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
201 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
202 PeelStatement::PeelStatement(Statement *s) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
203 : Statement(s->loc) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
204 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
205 this->s = s; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
206 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
207 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
208 Statement *PeelStatement::semantic(Scope *sc) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
209 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
210 /* "peel" off this wrapper, and don't run semantic() |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
211 * on the result. |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
212 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
213 return s; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
214 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
215 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
216 /******************************** ExpStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
217 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
218 ExpStatement::ExpStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
219 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
220 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
221 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
222 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
223 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
224 Statement *ExpStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
225 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
226 Expression *e = exp ? exp->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
227 ExpStatement *es = new ExpStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
228 return es; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
229 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
230 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
231 void ExpStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
232 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
233 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
234 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
235 buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
236 if (!hgs->FLinit.init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
237 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
238 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
239 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
240 Statement *ExpStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
241 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
242 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
243 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
244 //printf("ExpStatement::semantic() %s\n", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
245 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
246 exp = resolveProperties(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
247 exp->checkSideEffect(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
248 exp = exp->optimize(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
249 if (exp->op == TOKdeclaration && !isDeclarationStatement()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
250 { Statement *s = new DeclarationStatement(loc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
251 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
252 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
253 //exp = exp->optimize(isDeclarationStatement() ? WANTvalue : 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
254 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
255 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
256 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
257 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
258 int ExpStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
259 { int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
260 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
261 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
262 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
263 if (exp->op == TOKhalt) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
264 return BEhalt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
265 if (exp->op == TOKassert) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
266 { AssertExp *a = (AssertExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
267 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
268 if (a->e1->isBool(FALSE)) // if it's an assert(0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
269 return BEhalt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
270 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
271 if (exp->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
272 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
273 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
274 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
275 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
276 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
277 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
278 /******************************** CompileStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
279 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
280 CompileStatement::CompileStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
281 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
282 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
283 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
284 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
285 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
286 Statement *CompileStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
287 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
288 Expression *e = exp->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
289 CompileStatement *es = new CompileStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
290 return es; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
291 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
292 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
293 void CompileStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
294 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
295 buf->writestring("mixin("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
296 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
297 buf->writestring(");"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
298 if (!hgs->FLinit.init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
299 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
300 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
301 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
302 Statements *CompileStatement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
303 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
304 //printf("CompileStatement::flatten() %s\n", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
305 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
306 exp = resolveProperties(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
307 exp = exp->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
308 if (exp->op != TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
309 { error("argument to mixin must be a string, not (%s)", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
310 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
311 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
312 StringExp *se = (StringExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
313 se = se->toUTF8(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
314 Parser p(sc->module, (unsigned char *)se->string, se->len, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
315 p.loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
316 p.nextToken(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
317 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
318 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
319 while (p.token.value != TOKeof) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
320 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
321 Statement *s = p.parseStatement(PSsemi | PScurlyscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
322 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
323 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
324 return a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
325 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
326 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
327 Statement *CompileStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
328 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
329 //printf("CompileStatement::semantic() %s\n", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
330 Statements *a = flatten(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
331 if (!a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
332 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
333 Statement *s = new CompoundStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
334 return s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
335 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
336 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
337 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
338 /******************************** DeclarationStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
339 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
340 DeclarationStatement::DeclarationStatement(Loc loc, Dsymbol *declaration) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
341 : ExpStatement(loc, new DeclarationExp(loc, declaration)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
342 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
343 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
344 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
345 DeclarationStatement::DeclarationStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
346 : ExpStatement(loc, exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
347 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
348 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
349 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
350 Statement *DeclarationStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
351 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
352 DeclarationStatement *ds = new DeclarationStatement(loc, exp->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
353 return ds; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
354 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
355 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
356 void DeclarationStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
357 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
358 //printf("DeclarationStatement::scopeCode()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
359 //print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
360 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
361 *sentry = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
362 *sexception = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
363 *sfinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
364 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
365 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
366 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
367 if (exp->op == TOKdeclaration) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
368 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
369 DeclarationExp *de = (DeclarationExp *)(exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
370 VarDeclaration *v = de->declaration->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
371 if (v) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
372 { Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
373 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
374 e = v->callAutoDtor(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
375 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
376 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
377 //printf("dtor is: "); e->print(); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
378 #if 0 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
379 if (v->type->toBasetype()->ty == Tstruct) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
380 { /* Need a 'gate' to turn on/off destruction, |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
381 * in case v gets moved elsewhere. |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
382 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
383 Identifier *id = Lexer::uniqueId("__runDtor"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
384 ExpInitializer *ie = new ExpInitializer(loc, new IntegerExp(1)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
385 VarDeclaration *rd = new VarDeclaration(loc, Type::tint32, id, ie); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
386 *sentry = new DeclarationStatement(loc, rd); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
387 v->rundtor = rd; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
388 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
389 /* Rewrite e as: |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
390 * rundtor && e |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
391 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
392 Expression *ve = new VarExp(loc, v->rundtor); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
393 e = new AndAndExp(loc, ve, e); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
394 e->type = Type::tbool; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
395 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
396 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
397 *sfinally = new ExpStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
398 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
399 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
400 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
401 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
402 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
403 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
404 void DeclarationStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
405 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
406 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
407 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
409 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
410 /******************************** CompoundStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
411 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
412 CompoundStatement::CompoundStatement(Loc loc, Statements *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
413 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
414 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
415 statements = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
416 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
417 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
418 CompoundStatement::CompoundStatement(Loc loc, Statement *s1, Statement *s2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
419 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
420 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
421 statements = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
422 statements->reserve(2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
423 statements->push(s1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
424 statements->push(s2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
425 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
426 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
427 Statement *CompoundStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
428 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
429 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
430 a->setDim(statements->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
431 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
432 { Statement *s = (Statement *)statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
433 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
434 s = s->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
435 a->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
436 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
437 CompoundStatement *cs = new CompoundStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
438 return cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
439 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
440 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
441 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
442 Statement *CompoundStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
443 { Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
444 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
445 //printf("CompoundStatement::semantic(this = %p, sc = %p)\n", this, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
446 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
447 for (size_t i = 0; i < statements->dim; ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
448 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
449 s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
450 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
451 { Statements *a = s->flatten(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
452 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
453 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
454 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
455 statements->remove(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
456 statements->insert(i, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
457 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
458 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
459 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
460 statements->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
461 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
462 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
463 Statement *sentry; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
464 Statement *sexception; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
465 Statement *sfinally; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
466 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
467 s->scopeCode(sc, &sentry, &sexception, &sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
468 if (sentry) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
469 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
470 sentry = sentry->semantic(sc); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
471 if (s->isDeclarationStatement()) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
472 { statements->insert(i, sentry); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
473 i++; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
474 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
475 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
476 statements->data[i] = sentry; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
477 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
478 if (sexception) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
479 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
480 if (i + 1 == statements->dim && !sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
481 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
482 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
483 sexception = sexception->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
484 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
485 statements->push(sexception); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
486 if (sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
487 // Assume sexception does not throw |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
488 statements->push(sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
489 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
490 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
491 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
492 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
493 /* Rewrite: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
494 * s; s1; s2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
495 * As: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
496 * s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
497 * try { s1; s2; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
498 * catch (Object __o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
499 * { sexception; throw __o; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
500 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
501 Statement *body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
502 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
503 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
504 for (int j = i + 1; j < statements->dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
505 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
506 a->push(statements->data[j]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
507 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
508 body = new CompoundStatement(0, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
509 body = new ScopeStatement(0, body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
510 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
511 Identifier *id = Lexer::uniqueId("__o"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
512 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
513 Statement *handler = new ThrowStatement(0, new IdentifierExp(0, id)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
514 handler = new CompoundStatement(0, sexception, handler); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
515 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
516 Array *catches = new Array(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
517 Catch *ctch = new Catch(0, NULL, id, handler); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
518 catches->push(ctch); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
519 s = new TryCatchStatement(0, body, catches); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
520 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
521 if (sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
522 s = new TryFinallyStatement(0, s, sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
523 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
524 statements->setDim(i + 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
525 statements->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
526 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
527 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
528 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
529 else if (sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
530 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
531 if (0 && i + 1 == statements->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
532 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
533 statements->push(sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
534 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
535 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
536 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
537 /* Rewrite: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
538 * s; s1; s2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
539 * As: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
540 * s; try { s1; s2; } finally { sfinally; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
541 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
542 Statement *body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
543 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
544 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
545 for (int j = i + 1; j < statements->dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
546 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
547 a->push(statements->data[j]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
548 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
549 body = new CompoundStatement(0, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
550 s = new TryFinallyStatement(0, body, sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
551 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
552 statements->setDim(i + 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
553 statements->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
554 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
555 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
556 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
557 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
558 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
559 i++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
560 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
561 if (statements->dim == 1 && !isAsmBlockStatement()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
562 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
563 return (Statement *)statements->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
564 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
565 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
566 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
567 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
568 Statements *CompoundStatement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
569 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
570 return statements; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
571 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
572 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
573 ReturnStatement *CompoundStatement::isReturnStatement() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
574 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
575 ReturnStatement *rs = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
576 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
577 for (int i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
578 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
579 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
580 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
581 rs = s->isReturnStatement(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
582 if (rs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
583 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
584 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
585 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
586 return rs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
587 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
588 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
589 void CompoundStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
590 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
591 for (int i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
592 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
593 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
594 s->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
596 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
597 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
598 int CompoundStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
599 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
600 for (int i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
601 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
602 if (s && s->usesEH()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
603 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
604 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
605 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
606 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
607 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
608 int CompoundStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
609 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
610 //printf("CompoundStatement::blockExit(%p) %d\n", this, statements->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
611 int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
612 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
613 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
614 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
615 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
616 //printf("result = x%x\n", result); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
617 //printf("%s\n", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
618 if (!(result & BEfallthru) && !s->comeFrom()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
619 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
620 if (s->blockExit() != BEhalt) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
621 s->warning("statement is not reachable"); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
622 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
623 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
624 result &= ~BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
625 result |= s->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
626 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
627 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
628 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
629 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
630 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
631 int CompoundStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
632 { int comefrom = FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
633 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
634 //printf("CompoundStatement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
635 for (int i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
636 { Statement *s = (Statement *)statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
637 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
638 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
639 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
640 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
641 comefrom |= s->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
642 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
643 return comefrom; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
644 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
645 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
646 int CompoundStatement::isEmpty() |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
647 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
648 for (int i = 0; i < statements->dim; i++) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
649 { Statement *s = (Statement *) statements->data[i]; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
650 if (s && !s->isEmpty()) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
651 return FALSE; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
652 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
653 return TRUE; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
654 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
655 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
656 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
657 /******************************** CompoundDeclarationStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
658 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
659 CompoundDeclarationStatement::CompoundDeclarationStatement(Loc loc, Statements *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
660 : CompoundStatement(loc, s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
661 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
662 statements = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
663 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
664 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
665 Statement *CompoundDeclarationStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
666 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
667 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
668 a->setDim(statements->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
669 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
670 { Statement *s = (Statement *)statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
671 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
672 s = s->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
673 a->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
674 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
675 CompoundDeclarationStatement *cs = new CompoundDeclarationStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
676 return cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
677 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
678 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
679 void CompoundDeclarationStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
680 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
681 int nwritten = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
682 for (int i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
683 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
684 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
685 { DeclarationStatement *ds = s->isDeclarationStatement(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
686 assert(ds); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
687 DeclarationExp *de = (DeclarationExp *)ds->exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
688 assert(de->op == TOKdeclaration); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
689 Declaration *d = de->declaration->isDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
690 assert(d); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
691 VarDeclaration *v = d->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
692 if (v) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
693 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
694 /* This essentially copies the part of VarDeclaration::toCBuffer() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
695 * that does not print the type. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
696 * Should refactor this. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
697 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
698 if (nwritten) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
699 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
700 buf->writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
701 buf->writestring(v->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
702 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
703 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
704 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
705 StorageClassDeclaration::stcToCBuffer(buf, v->storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
706 if (v->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
707 v->type->toCBuffer(buf, v->ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
708 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
709 buf->writestring(v->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
710 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
711 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
712 if (v->init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
713 { buf->writestring(" = "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
714 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
715 ExpInitializer *ie = v->init->isExpInitializer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
716 if (ie && (ie->exp->op == TOKconstruct || ie->exp->op == TOKblit)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
717 ((AssignExp *)ie->exp)->e2->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
718 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
719 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
720 v->init->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
721 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
722 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
723 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
724 d->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
725 nwritten++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
726 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
727 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
728 buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
729 if (!hgs->FLinit.init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
730 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
731 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
732 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
733 /**************************** UnrolledLoopStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
734 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
735 UnrolledLoopStatement::UnrolledLoopStatement(Loc loc, Statements *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
736 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
737 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
738 statements = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
739 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
740 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
741 Statement *UnrolledLoopStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
742 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
743 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
744 a->setDim(statements->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
745 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
746 { Statement *s = (Statement *)statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
747 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
748 s = s->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
749 a->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
750 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
751 UnrolledLoopStatement *cs = new UnrolledLoopStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
752 return cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
753 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
754 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
755 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
756 Statement *UnrolledLoopStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
757 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
758 //printf("UnrolledLoopStatement::semantic(this = %p, sc = %p)\n", this, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
759 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
760 sc->noctor++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
761 Scope *scd = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
762 scd->sbreak = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
763 scd->scontinue = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
764 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
765 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
766 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
767 Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
768 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
769 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
770 s = s->semantic(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
771 statements->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
772 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
773 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
774 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
775 scd->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
776 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
777 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
778 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
779 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
780 void UnrolledLoopStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
781 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
782 buf->writestring("unrolled {"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
783 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
784 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
785 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
786 { Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
787 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
788 s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
789 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
790 s->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
791 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
792 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
793 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
794 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
795 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
796 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
797 int UnrolledLoopStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
798 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
799 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
800 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
801 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
802 int UnrolledLoopStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
803 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
804 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
805 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
806 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
807 int UnrolledLoopStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
808 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
809 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
810 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
811 if (s && s->usesEH()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
812 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
813 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
814 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
815 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
816 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
817 int UnrolledLoopStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
818 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
819 int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
820 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
821 { Statement *s = (Statement *) statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
822 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
823 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
824 int r = s->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
825 result |= r & ~(BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
826 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
827 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
828 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
829 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
830 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
831 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
832 int UnrolledLoopStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
833 { int comefrom = FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
834 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
835 //printf("UnrolledLoopStatement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
836 for (size_t i = 0; i < statements->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
837 { Statement *s = (Statement *)statements->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
838 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
839 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
840 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
841 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
842 comefrom |= s->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
843 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
844 return comefrom; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
845 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
846 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
847 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
848 /******************************** ScopeStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
849 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
850 ScopeStatement::ScopeStatement(Loc loc, Statement *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
851 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
852 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
853 this->statement = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
854 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
855 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
856 Statement *ScopeStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
857 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
858 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
859 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
860 s = statement ? statement->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
861 s = new ScopeStatement(loc, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
862 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
863 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
864 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
865 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
866 Statement *ScopeStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
867 { ScopeDsymbol *sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
868 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
869 //printf("ScopeStatement::semantic(sc = %p)\n", sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
870 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
871 { Statements *a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
872 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
873 sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
874 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
875 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
876 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
877 a = statement->flatten(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
878 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
879 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
880 statement = new CompoundStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
881 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
882 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
883 statement = statement->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
884 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
885 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
886 Statement *sentry; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
887 Statement *sexception; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
888 Statement *sfinally; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
889 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
890 statement->scopeCode(sc, &sentry, &sexception, &sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
891 if (sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
892 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
893 //printf("adding sfinally\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
894 statement = new CompoundStatement(loc, statement, sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
895 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
896 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
897 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
898 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
899 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
900 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
901 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
902 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
903 int ScopeStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
904 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
905 //printf("ScopeStatement::hasBreak() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
906 return statement ? statement->hasBreak() : FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
907 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
908 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
909 int ScopeStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
910 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
911 return statement ? statement->hasContinue() : FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
912 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
913 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
914 int ScopeStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
915 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
916 return statement ? statement->usesEH() : FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
917 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
918 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
919 int ScopeStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
920 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
921 //printf("ScopeStatement::blockExit(%p)\n", statement); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
922 return statement ? statement->blockExit() : BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
923 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
924 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
925 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
926 int ScopeStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
927 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
928 //printf("ScopeStatement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
929 return statement ? statement->comeFrom() : FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
930 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
931 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
932 int ScopeStatement::isEmpty() |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
933 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
934 //printf("ScopeStatement::isEmpty() %d\n", statement ? statement->isEmpty() : TRUE); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
935 return statement ? statement->isEmpty() : TRUE; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
936 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
937 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
938 void ScopeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
939 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
940 buf->writeByte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
941 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
942 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
943 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
944 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
945 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
946 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
947 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
948 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
949 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
950 /******************************** WhileStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
951 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
952 WhileStatement::WhileStatement(Loc loc, Expression *c, Statement *b) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
953 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
954 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
955 condition = c; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
956 body = b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
957 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
958 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
959 Statement *WhileStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
960 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
961 WhileStatement *s = new WhileStatement(loc, condition->syntaxCopy(), body ? body->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
962 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
963 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
964 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
965 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
966 Statement *WhileStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
967 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
968 /* Rewrite as a for(;condition;) loop |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
969 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
970 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
971 Statement *s = new ForStatement(loc, NULL, condition, NULL, body); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
972 s = s->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
973 return s; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
974 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
975 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
976 int WhileStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
977 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
978 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
979 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
980 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
981 int WhileStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
982 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
983 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
984 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
985 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
986 int WhileStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
987 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
988 assert(0); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
989 return body ? body->usesEH() : 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
990 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
991 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
992 int WhileStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
993 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
994 assert(0); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
995 //printf("WhileStatement::blockExit(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
996 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
997 int result = BEnone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
998 if (condition->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
999 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1000 if (condition->isBool(TRUE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1001 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1002 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1003 { result |= body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1004 if (result & BEbreak) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1005 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1006 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1007 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1008 else if (condition->isBool(FALSE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1009 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1010 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1011 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1012 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1013 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1014 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1015 result |= body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1016 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1017 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1018 result &= ~(BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1019 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1020 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1021 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1022 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1023 int WhileStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1024 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1025 assert(0); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1026 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1027 return body->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1028 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1029 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1030 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1031 void WhileStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1032 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1033 buf->writestring("while ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1034 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1035 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1036 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1037 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1038 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1039 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1040 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1041 /******************************** DoStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1042 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1043 DoStatement::DoStatement(Loc loc, Statement *b, Expression *c) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1044 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1045 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1046 body = b; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1047 condition = c; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1048 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1049 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1050 Statement *DoStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1051 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1052 DoStatement *s = new DoStatement(loc, body ? body->syntaxCopy() : NULL, condition->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1053 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1054 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1055 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1056 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1057 Statement *DoStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1058 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1059 sc->noctor++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1060 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1061 body = body->semanticScope(sc, this, this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1062 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1063 condition = condition->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1064 condition = resolveProperties(sc, condition); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1065 condition = condition->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1066 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1067 condition = condition->checkToBoolean(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1068 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1069 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1070 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1071 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1072 int DoStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1073 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1074 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1075 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1076 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1077 int DoStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1078 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1079 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1080 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1081 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1082 int DoStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1083 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1084 return body ? body->usesEH() : 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1085 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1086 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1087 int DoStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1088 { int result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1089 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1090 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1091 { result = body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1092 if (result == BEbreak) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1093 return BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1094 if (result & BEcontinue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1095 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1096 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1097 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1098 result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1099 if (result & BEfallthru) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1100 { if (condition->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1101 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1102 if (!(result & BEbreak) && condition->isBool(TRUE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1103 result &= ~BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1104 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1105 result &= ~(BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1106 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1107 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1108 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1109 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1110 int DoStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1111 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1112 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1113 return body->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1114 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1115 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1116 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1117 void DoStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1118 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1119 buf->writestring("do"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1120 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1121 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1122 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1123 buf->writestring("while ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1124 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1125 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1126 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1127 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1128 /******************************** ForStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1129 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1130 ForStatement::ForStatement(Loc loc, Statement *init, Expression *condition, Expression *increment, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1131 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1132 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1133 this->init = init; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1134 this->condition = condition; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1135 this->increment = increment; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1136 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1137 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1138 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1139 Statement *ForStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1140 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1141 Statement *i = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1142 if (init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1143 i = init->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1144 Expression *c = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1145 if (condition) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1146 c = condition->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1147 Expression *inc = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1148 if (increment) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1149 inc = increment->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1150 ForStatement *s = new ForStatement(loc, i, c, inc, body->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1151 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1152 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1153 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1154 Statement *ForStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1155 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1156 ScopeDsymbol *sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1157 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1158 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1159 if (init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1160 init = init->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1161 sc->noctor++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1162 if (condition) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1163 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1164 condition = condition->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1165 condition = resolveProperties(sc, condition); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1166 condition = condition->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1167 condition = condition->checkToBoolean(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1168 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1169 if (increment) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1170 { increment = increment->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1171 increment = resolveProperties(sc, increment); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1172 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1173 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1174 sc->sbreak = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1175 sc->scontinue = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1176 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1177 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1178 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1179 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1180 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1181 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1182 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1183 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1184 void ForStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1185 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1186 //printf("ForStatement::scopeCode()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1187 //print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1188 if (init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1189 init->scopeCode(sc, sentry, sexception, sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1190 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1191 Statement::scopeCode(sc, sentry, sexception, sfinally); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1192 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1193 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1194 int ForStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1195 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1196 //printf("ForStatement::hasBreak()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1197 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1198 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1200 int ForStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1201 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1202 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1203 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1204 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1205 int ForStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1206 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1207 return (init && init->usesEH()) || body->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1208 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1209 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1210 int ForStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1211 { int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1212 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1213 if (init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1214 { result = init->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1215 if (!(result & BEfallthru)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1216 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1217 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1218 if (condition) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1219 { if (condition->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1220 result |= BEthrow; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1221 if (condition->isBool(TRUE)) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1222 result &= ~BEfallthru; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1223 else if (condition->isBool(FALSE)) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1224 return result; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1225 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1226 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1227 result &= ~BEfallthru; // the body must do the exiting |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1228 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1229 { int r = body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1230 if (r & (BEbreak | BEgoto)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1231 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1232 result |= r & ~(BEfallthru | BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1233 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1234 if (increment && increment->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1235 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1236 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1237 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1238 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1239 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1240 int ForStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1241 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1242 //printf("ForStatement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1243 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1244 { int result = body->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1245 //printf("result = %d\n", result); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1246 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1247 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1248 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1249 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1250 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1251 void ForStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1252 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1253 buf->writestring("for ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1254 if (init) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1255 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1256 hgs->FLinit.init++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1257 init->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1258 hgs->FLinit.init--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1259 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1260 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1261 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1262 if (condition) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1263 { buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1264 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1265 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1266 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1267 if (increment) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1268 { buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1269 increment->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1270 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1271 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1272 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1273 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1274 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1275 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1276 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1277 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1278 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1279 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1280 /******************************** ForeachStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1281 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1282 ForeachStatement::ForeachStatement(Loc loc, enum TOK op, Arguments *arguments, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1283 Expression *aggr, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1284 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1285 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1286 this->op = op; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1287 this->arguments = arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1288 this->aggr = aggr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1289 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1290 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1291 this->key = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1292 this->value = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1293 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1294 this->func = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1295 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1296 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1297 Statement *ForeachStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1298 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1299 Arguments *args = Argument::arraySyntaxCopy(arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1300 Expression *exp = aggr->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1301 ForeachStatement *s = new ForeachStatement(loc, op, args, exp, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1302 body ? body->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1303 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1304 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1305 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1306 Statement *ForeachStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1307 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1308 //printf("ForeachStatement::semantic() %p\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1309 ScopeDsymbol *sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1310 Statement *s = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1311 size_t dim = arguments->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1312 TypeAArray *taa = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1313 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1314 Type *tn = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1315 Type *tnv = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1316 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1317 func = sc->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1318 if (func->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1319 func = func->fes->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1320 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1321 aggr = aggr->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1322 aggr = resolveProperties(sc, aggr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1323 aggr = aggr->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1324 if (!aggr->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1325 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1326 error("invalid foreach aggregate %s", aggr->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1327 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1328 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1329 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1330 inferApplyArgTypes(op, arguments, aggr, sc->module); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1331 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1332 /* Check for inference errors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1333 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1334 if (dim != arguments->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1335 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1336 //printf("dim = %d, arguments->dim = %d\n", dim, arguments->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1337 error("cannot uniquely infer foreach argument types"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1338 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1339 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1340 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1341 Type *tab = aggr->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1342 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1343 if (tab->ty == Ttuple) // don't generate new scope for tuple loops |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1344 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1345 if (dim < 1 || dim > 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1346 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1347 error("only one (value) or two (key,value) arguments for tuple foreach"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1348 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1349 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1350 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1351 TypeTuple *tuple = (TypeTuple *)tab; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1352 Statements *statements = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1353 //printf("aggr: op = %d, %s\n", aggr->op, aggr->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1354 size_t n; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1355 TupleExp *te = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1356 if (aggr->op == TOKtuple) // expression tuple |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1357 { te = (TupleExp *)aggr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1358 n = te->exps->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1359 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1360 else if (aggr->op == TOKtype) // type tuple |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1361 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1362 n = Argument::dim(tuple->arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1363 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1364 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1365 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1366 for (size_t j = 0; j < n; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1367 { size_t k = (op == TOKforeach) ? j : n - 1 - j; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1368 Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1369 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1370 if (te) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1371 e = (Expression *)te->exps->data[k]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1372 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1373 t = Argument::getNth(tuple->arguments, k)->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1374 Argument *arg = (Argument *)arguments->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1375 Statements *st = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1376 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1377 if (dim == 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1378 { // Declare key |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1379 if (arg->storageClass & (STCout | STCref | STClazy)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1380 error("no storage class for key %s", arg->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1381 TY keyty = arg->type->ty; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1382 if (keyty != Tint32 && keyty != Tuns32) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1383 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1384 if (global.params.is64bit) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1385 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1386 if (keyty != Tint64 && keyty != Tuns64) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1387 error("foreach: key type must be int or uint, long or ulong, not %s", arg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1388 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1389 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1390 error("foreach: key type must be int or uint, not %s", arg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1391 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1392 Initializer *ie = new ExpInitializer(0, new IntegerExp(k)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1393 VarDeclaration *var = new VarDeclaration(loc, arg->type, arg->ident, ie); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1394 var->storage_class |= STCmanifest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1395 DeclarationExp *de = new DeclarationExp(loc, var); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1396 st->push(new ExpStatement(loc, de)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1397 arg = (Argument *)arguments->data[1]; // value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1398 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1399 // Declare value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1400 if (arg->storageClass & (STCout | STCref | STClazy)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1401 error("no storage class for value %s", arg->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1402 Dsymbol *var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1403 if (te) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1404 { Type *tb = e->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1405 if ((tb->ty == Tfunction || tb->ty == Tsarray) && e->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1406 { VarExp *ve = (VarExp *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1407 var = new AliasDeclaration(loc, arg->ident, ve->var); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1408 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1409 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1410 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1411 arg->type = e->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1412 Initializer *ie = new ExpInitializer(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1413 VarDeclaration *v = new VarDeclaration(loc, arg->type, arg->ident, ie); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1414 if (e->isConst()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1415 v->storage_class |= STCconst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1416 var = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1417 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1418 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1419 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1420 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1421 var = new AliasDeclaration(loc, arg->ident, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1422 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1423 DeclarationExp *de = new DeclarationExp(loc, var); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1424 st->push(new ExpStatement(loc, de)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1425 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1426 st->push(body->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1427 s = new CompoundStatement(loc, st); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1428 s = new ScopeStatement(loc, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1429 statements->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1430 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1431 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1432 s = new UnrolledLoopStatement(loc, statements); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1433 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1434 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1436 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1437 sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1438 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1439 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1440 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1441 sc->noctor++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1442 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1443 switch (tab->ty) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1444 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1445 case Tarray: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1446 case Tsarray: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1447 if (!checkForArgTypes()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1448 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1449 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1450 if (dim < 1 || dim > 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1451 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1452 error("only one or two arguments for array foreach"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1453 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1454 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1455 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1456 /* Look for special case of parsing char types out of char type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1457 * array. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1458 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1459 tn = tab->nextOf()->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1460 if (tn->ty == Tchar || tn->ty == Twchar || tn->ty == Tdchar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1461 { Argument *arg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1462 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1463 int i = (dim == 1) ? 0 : 1; // index of value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1464 arg = (Argument *)arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1465 arg->type = arg->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1466 tnv = arg->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1467 if (tnv->ty != tn->ty && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1468 (tnv->ty == Tchar || tnv->ty == Twchar || tnv->ty == Tdchar)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1469 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1470 if (arg->storageClass & STCref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1471 error("foreach: value of UTF conversion cannot be ref"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1472 if (dim == 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1473 { arg = (Argument *)arguments->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1474 if (arg->storageClass & STCref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1475 error("foreach: key cannot be ref"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1476 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1477 goto Lapply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1478 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1479 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1480 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1481 for (size_t i = 0; i < dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1482 { // Declare args |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1483 Argument *arg = (Argument *)arguments->data[i]; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1484 Type *argtype = arg->type->semantic(loc, sc); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1485 VarDeclaration *var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1486 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1487 var = new VarDeclaration(loc, argtype, arg->ident, NULL); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1488 var->storage_class |= STCforeach; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1489 var->storage_class |= arg->storageClass & (STCin | STCout | STCref | STC_TYPECTOR); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1490 if (var->storage_class & (STCref | STCout)) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1491 var->storage_class |= STCnodtor; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1492 if (dim == 2 && i == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1493 { key = var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1494 //var->storage_class |= STCfinal; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1495 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1496 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1497 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1498 value = var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1499 /* Reference to immutable data should be marked as const |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1500 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1501 if (var->storage_class & STCref && !tn->isMutable()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1502 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1503 var->storage_class |= STCconst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1504 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1505 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1506 #if 0 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1507 DeclarationExp *de = new DeclarationExp(loc, var); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1508 de->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1509 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1510 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1511 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1512 #if 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1513 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1514 /* Convert to a ForStatement |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1515 * foreach (key, value; a) body => |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1516 * for (T[] tmp = a[], size_t key; key < tmp.length; ++key) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1517 * { T value = tmp[k]; body } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1518 * |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1519 * foreach_reverse (key, value; a) body => |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1520 * for (T[] tmp = a[], size_t key = tmp.length; key--; ) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1521 * { T value = tmp[k]; body } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1522 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1523 Identifier *id = Lexer::uniqueId("__aggr"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1524 ExpInitializer *ie = new ExpInitializer(loc, new SliceExp(loc, aggr, NULL, NULL)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1525 VarDeclaration *tmp = new VarDeclaration(loc, aggr->type->nextOf()->arrayOf(), id, ie); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1526 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1527 Expression *tmp_length = new DotIdExp(loc, new VarExp(loc, tmp), Id::length); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1528 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1529 if (!key) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1530 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1531 Identifier *id = Lexer::uniqueId("__key"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1532 key = new VarDeclaration(loc, Type::tsize_t, id, NULL); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1533 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1534 if (op == TOKforeach_reverse) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1535 key->init = new ExpInitializer(loc, tmp_length); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1536 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1537 key->init = new ExpInitializer(loc, new IntegerExp(0)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1538 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1539 Statements *cs = new Statements(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1540 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1541 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, key))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1542 Statement *forinit = new CompoundDeclarationStatement(loc, cs); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1543 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1544 Expression *cond; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1545 if (op == TOKforeach_reverse) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1546 // key-- |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1547 cond = new PostExp(TOKminusminus, loc, new VarExp(loc, key)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1548 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1549 // key < tmp.length |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1550 cond = new CmpExp(TOKlt, loc, new VarExp(loc, key), tmp_length); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1551 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1552 Expression *increment = NULL; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1553 if (op == TOKforeach) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1554 // key += 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1555 increment = new AddAssignExp(loc, new VarExp(loc, key), new IntegerExp(1)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1556 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1557 // T value = tmp[key]; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1558 value->init = new ExpInitializer(loc, new IndexExp(loc, new VarExp(loc, tmp), new VarExp(loc, key))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1559 Statement *ds = new DeclarationStatement(loc, new DeclarationExp(loc, value)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1560 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1561 body = new CompoundStatement(loc, ds, body); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1562 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1563 ForStatement *fs = new ForStatement(loc, forinit, cond, increment, body); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1564 s = fs->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1565 break; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1566 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1567 #else |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1568 if (tab->nextOf()->implicitConvTo(value->type) < MATCHconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1569 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1570 if (aggr->op == TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1571 aggr = aggr->implicitCastTo(sc, value->type->arrayOf()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1572 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1573 error("foreach: %s is not an array of %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1574 tab->toChars(), value->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1575 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1576 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1577 if (key) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1578 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1579 if (global.params.is64bit) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1580 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1581 if (key->type->ty != Tint64 && key->type->ty != Tuns64) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1582 error("foreach: key type must be int or uint, long or ulong, not %s", key->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1583 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1584 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1585 if (key->storage_class & (STCout | STCref)) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1586 error("foreach: key cannot be out or ref"); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1587 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1588 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1589 sc->sbreak = this; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1590 sc->scontinue = this; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1591 body = body->semantic(sc); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1592 break; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1593 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1594 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1595 case Taarray: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1596 if (!checkForArgTypes()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1597 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1598 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1599 taa = (TypeAArray *)tab; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1600 if (dim < 1 || dim > 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1601 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1602 error("only one or two arguments for associative array foreach"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1603 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1604 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1605 if (op == TOKforeach_reverse) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1606 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1607 error("no reverse iteration on associative arrays"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1608 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1609 goto Lapply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1610 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1611 case Tclass: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1612 case Tstruct: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1613 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1614 { /* Look for range iteration, i.e. the properties |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1615 * .empty, .next, .retreat, .head and .rear |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1616 * foreach (e; aggr) { ... } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1617 * translates to: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1618 * for (auto __r = aggr[]; !__r.empty; __r.next) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1619 * { auto e = __r.head; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1620 * ... |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1621 * } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1622 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1623 if (dim != 1) // only one argument allowed with ranges |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1624 goto Lapply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1625 AggregateDeclaration *ad = (tab->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1626 ? (AggregateDeclaration *)((TypeClass *)tab)->sym |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1627 : (AggregateDeclaration *)((TypeStruct *)tab)->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1628 Identifier *idhead; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1629 Identifier *idnext; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1630 if (op == TOKforeach) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1631 { idhead = Id::Fhead; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1632 idnext = Id::Fnext; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1633 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1634 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1635 { idhead = Id::Ftoe; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1636 idnext = Id::Fretreat; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1637 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1638 Dsymbol *shead = search_function(ad, idhead); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1639 if (!shead) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1640 goto Lapply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1641 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1642 /* Generate a temporary __r and initialize it with the aggregate. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1643 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1644 Identifier *id = Identifier::generateId("__r"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1645 Expression *rinit = new SliceExp(loc, aggr, NULL, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1646 rinit = rinit->trySemantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1647 if (!rinit) // if application of [] failed |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1648 rinit = aggr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1649 VarDeclaration *r = new VarDeclaration(loc, NULL, id, new ExpInitializer(loc, rinit)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1650 // r->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1651 //printf("r: %s, init: %s\n", r->toChars(), r->init->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1652 Statement *init = new DeclarationStatement(loc, r); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1653 //printf("init: %s\n", init->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1654 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1655 // !__r.empty |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1656 Expression *e = new VarExp(loc, r); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1657 e = new DotIdExp(loc, e, Id::Fempty); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1658 Expression *condition = new NotExp(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1659 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1660 // __r.next |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1661 e = new VarExp(loc, r); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1662 Expression *increment = new DotIdExp(loc, e, idnext); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1663 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1664 /* Declaration statement for e: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1665 * auto e = __r.idhead; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1666 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1667 e = new VarExp(loc, r); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1668 Expression *einit = new DotIdExp(loc, e, idhead); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1669 // einit = einit->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1670 Argument *arg = (Argument *)arguments->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1671 VarDeclaration *ve = new VarDeclaration(loc, arg->type, arg->ident, new ExpInitializer(loc, einit)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1672 ve->storage_class |= STCforeach; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1673 ve->storage_class |= arg->storageClass & (STCin | STCout | STCref | STC_TYPECTOR); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1674 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1675 DeclarationExp *de = new DeclarationExp(loc, ve); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1676 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1677 Statement *body = new CompoundStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1678 new DeclarationStatement(loc, de), this->body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1679 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1680 s = new ForStatement(loc, init, condition, increment, body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1681 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1682 printf("init: %s\n", init->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1683 printf("condition: %s\n", condition->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1684 printf("increment: %s\n", increment->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1685 printf("body: %s\n", body->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1686 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1687 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1688 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1689 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1690 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1691 case Tdelegate: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1692 Lapply: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1693 { FuncDeclaration *fdapply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1694 Arguments *args; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1695 Expression *ec; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1696 Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1697 FuncLiteralDeclaration *fld; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1698 Argument *a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1699 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1700 Expression *flde; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1701 Identifier *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1702 Type *tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1703 TypeDelegate* dgty; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1704 TypeDelegate* dgty2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1705 TypeDelegate* fldeTy; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1706 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1707 if (!checkForArgTypes()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1708 { body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1709 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1710 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1711 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1712 tret = func->type->nextOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1713 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1714 // Need a variable to hold value from any return statements in body. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1715 if (!sc->func->vresult && tret && tret != Type::tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1716 { VarDeclaration *v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1717 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1718 v = new VarDeclaration(loc, tret, Id::result, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1719 v->noauto = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1720 v->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1721 if (!sc->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1722 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1723 v->parent = sc->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1724 sc->func->vresult = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1725 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1726 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1727 /* Turn body into the function literal: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1728 * int delegate(ref T arg) { body } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1729 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1730 args = new Arguments(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1731 for (size_t i = 0; i < dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1732 { Argument *arg = (Argument *)arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1733 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1734 arg->type = arg->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1735 if (arg->storageClass & STCref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1736 id = arg->ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1737 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1738 { // Make a copy of the ref argument so it isn't |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1739 // a reference. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1740 VarDeclaration *v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1741 Initializer *ie; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1742 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1743 id = Lexer::uniqueId("__applyArg", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1744 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1745 ie = new ExpInitializer(0, new IdentifierExp(0, id)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1746 v = new VarDeclaration(0, arg->type, arg->ident, ie); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1747 s = new DeclarationStatement(0, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1748 body = new CompoundStatement(loc, s, body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1749 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1750 a = new Argument(STCref, arg->type, id, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1751 args->push(a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1752 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1753 t = new TypeFunction(args, Type::tint32, 0, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1754 fld = new FuncLiteralDeclaration(loc, 0, t, TOKdelegate, this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1755 fld->fbody = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1756 flde = new FuncExp(loc, fld); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1757 flde = flde->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1758 fld->tookAddressOf = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1759 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1760 // Resolve any forward referenced goto's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1761 for (int i = 0; i < gotos.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1762 { CompoundStatement *cs = (CompoundStatement *)gotos.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1763 GotoStatement *gs = (GotoStatement *)cs->statements->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1764 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1765 if (!gs->label->statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1766 { // 'Promote' it to this scope, and replace with a return |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1767 cases.push(gs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1768 s = new ReturnStatement(0, new IntegerExp(cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1769 cs->statements->data[0] = (void *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1770 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1771 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1772 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1773 if (tab->ty == Taarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1774 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1775 // Check types |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1776 Argument *arg = (Argument *)arguments->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1777 if (dim == 2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1778 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1779 if (arg->storageClass & STCref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1780 error("foreach: index cannot be ref"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1781 if (!arg->type->equals(taa->index)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1782 error("foreach: index must be type %s, not %s", taa->index->toChars(), arg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1783 arg = (Argument *)arguments->data[1]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1784 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1785 if (!arg->type->equals(taa->nextOf())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1786 error("foreach: value must be type %s, not %s", taa->nextOf()->toChars(), arg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1787 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1788 /* Call: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1789 * _aaApply(aggr, keysize, flde) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1790 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1791 //LDC: Build arguments. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1792 static FuncDeclaration *aaApply2_fd = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1793 static TypeDelegate* aaApply2_dg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1794 if(!aaApply2_fd) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1795 Arguments* args = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1796 args->push(new Argument(STCin, Type::tvoid->pointerTo(), NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1797 args->push(new Argument(STCin, Type::tsize_t, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1798 Arguments* dgargs = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1799 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1800 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1801 aaApply2_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1802 args->push(new Argument(STCin, aaApply2_dg, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1803 aaApply2_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply2"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1804 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1805 static FuncDeclaration *aaApply_fd = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1806 static TypeDelegate* aaApply_dg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1807 if(!aaApply_fd) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1808 Arguments* args = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1809 args->push(new Argument(STCin, Type::tvoid->pointerTo(), NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1810 args->push(new Argument(STCin, Type::tsize_t, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1811 Arguments* dgargs = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1812 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1813 aaApply_dg = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1814 args->push(new Argument(STCin, aaApply_dg, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1815 aaApply_fd = FuncDeclaration::genCfunc(args, Type::tindex, "_aaApply"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1816 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1817 if (dim == 2) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1818 fdapply = aaApply2_fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1819 fldeTy = aaApply2_dg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1820 } else { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1821 fdapply = aaApply_fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1822 fldeTy = aaApply_dg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1823 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1824 ec = new VarExp(0, fdapply); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1825 Expressions *exps = new Expressions(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1826 exps->push(aggr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1827 size_t keysize = taa->index->size(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1828 keysize = (keysize + (PTRSIZE-1)) & ~(PTRSIZE-1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1829 exps->push(new IntegerExp(0, keysize, Type::tsize_t)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1830 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1831 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1832 // LDC paint delegate argument to the type runtime expects |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1833 if (!fldeTy->equals(flde->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1834 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1835 flde = new CastExp(loc, flde, flde->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1836 flde->type = fldeTy; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1837 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1838 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1839 exps->push(flde); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1840 e = new CallExp(loc, ec, exps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1841 e->type = Type::tindex; // don't run semantic() on e |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1842 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1843 else if (tab->ty == Tarray || tab->ty == Tsarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1844 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1845 /* Call: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1846 * _aApply(aggr, flde) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1847 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1848 static char fntab[9][3] = |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1849 { "cc","cw","cd", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1850 "wc","cc","wd", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1851 "dc","dw","dd" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1852 }; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1853 char fdname[7+1+2+ sizeof(dim)*3 + 1]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1854 int flag; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1855 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1856 switch (tn->ty) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1857 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1858 case Tchar: flag = 0; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1859 case Twchar: flag = 3; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1860 case Tdchar: flag = 6; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1861 default: assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1862 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1863 switch (tnv->ty) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1864 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1865 case Tchar: flag += 0; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1866 case Twchar: flag += 1; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1867 case Tdchar: flag += 2; break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1868 default: assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1869 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1870 const char *r = (op == TOKforeach_reverse) ? "R" : ""; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1871 #ifdef __MINGW32__ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1872 int j = sprintf(fdname, "_aApply%s%.*s%lu", r, 2, fntab[flag], dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1873 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1874 int j = sprintf(fdname, "_aApply%s%.*s%zu", r, 2, fntab[flag], dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1875 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1876 assert(j < sizeof(fdname)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1877 //LDC: Build arguments. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1878 Arguments* args = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1879 args->push(new Argument(STCin, tn->arrayOf(), NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1880 if (dim == 2) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1881 Arguments* dgargs = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1882 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1883 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1884 dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1885 args->push(new Argument(STCin, dgty, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1886 fdapply = FuncDeclaration::genCfunc(args, Type::tindex, fdname); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1887 } else { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1888 Arguments* dgargs = new Arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1889 dgargs->push(new Argument(STCin, Type::tvoidptr, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1890 dgty = new TypeDelegate(new TypeFunction(dgargs, Type::tindex, 0, LINKd)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1891 args->push(new Argument(STCin, dgty, NULL, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1892 fdapply = FuncDeclaration::genCfunc(args, Type::tindex, fdname); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1893 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1894 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1895 ec = new VarExp(0, fdapply); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1896 Expressions *exps = new Expressions(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1897 if (tab->ty == Tsarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1898 aggr = aggr->castTo(sc, tn->arrayOf()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1899 exps->push(aggr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1900 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1901 // LDC paint delegate argument to the type runtime expects |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1902 if (!dgty->equals(flde->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1903 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1904 flde = new CastExp(loc, flde, flde->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1905 flde->type = dgty; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1906 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1907 exps->push(flde); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1908 e = new CallExp(loc, ec, exps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1909 e->type = Type::tindex; // don't run semantic() on e |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1910 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1911 else if (tab->ty == Tdelegate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1912 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1913 /* Call: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1914 * aggr(flde) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1915 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1916 Expressions *exps = new Expressions(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1917 exps->push(flde); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1918 e = new CallExp(loc, aggr, exps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1919 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1920 if (e->type != Type::tint32) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1921 error("opApply() function for %s must return an int", tab->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1922 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1923 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1924 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1925 assert(tab->ty == Tstruct || tab->ty == Tclass); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1926 Identifier *idapply = (op == TOKforeach_reverse) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1927 ? Id::applyReverse : Id::apply; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1928 Dsymbol *sapply = search_function((AggregateDeclaration *)tab->toDsymbol(sc), idapply); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1929 Expressions *exps = new Expressions(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1930 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1931 TemplateDeclaration *td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1932 if (sapply && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1933 (td = sapply->isTemplateDeclaration()) != NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1934 { /* Call: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1935 * aggr.apply!(fld)() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1936 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1937 TemplateInstance *ti = new TemplateInstance(loc, idapply); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1938 Objects *tiargs = new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1939 tiargs->push(fld); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1940 ti->tiargs = tiargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1941 ec = new DotTemplateInstanceExp(loc, aggr, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1942 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1943 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1944 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1945 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1946 /* Call: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1947 * aggr.apply(flde) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1948 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1949 ec = new DotIdExp(loc, aggr, idapply); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1950 exps->push(flde); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1951 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1952 e = new CallExp(loc, ec, exps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1953 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1954 if (e->type != Type::tint32) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1955 error("opApply() function for %s must return an int", tab->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1956 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1957 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1958 if (!cases.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1959 // Easy case, a clean exit from the loop |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1960 s = new ExpStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1961 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1962 { // Construct a switch statement around the return value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1963 // of the apply function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1964 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1965 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1966 // default: break; takes care of cases 0 and 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1967 s = new BreakStatement(0, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1968 s = new DefaultStatement(0, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1969 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1970 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1971 // cases 2... |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1972 for (int i = 0; i < cases.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1973 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1974 s = (Statement *)cases.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1975 s = new CaseStatement(0, new IntegerExp(i + 2), s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1976 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1977 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1978 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1979 s = new CompoundStatement(loc, a); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1980 s = new SwitchStatement(loc, e, s, FALSE); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1981 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1982 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1983 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1984 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1985 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1986 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1987 error("foreach: %s is not an aggregate type", aggr->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1988 s = NULL; // error recovery |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1989 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1990 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1991 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1992 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1993 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1994 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1995 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1996 bool ForeachStatement::checkForArgTypes() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1997 { bool result = TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1998 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1999 for (size_t i = 0; i < arguments->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2000 { Argument *arg = (Argument *)arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2001 if (!arg->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2002 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2003 error("cannot infer type for %s", arg->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2004 arg->type = Type::terror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2005 result = FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2006 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2007 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2008 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2009 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2010 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2011 int ForeachStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2012 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2013 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2014 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2015 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2016 int ForeachStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2017 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2018 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2019 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2020 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2021 int ForeachStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2022 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2023 return body->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2024 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2025 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2026 int ForeachStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2027 { int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2028 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2029 if (aggr->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2030 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2031 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2032 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2033 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2034 result |= body->blockExit() & ~(BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2035 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2036 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2037 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2038 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2039 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2040 int ForeachStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2041 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2042 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2043 return body->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2044 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2045 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2046 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2047 void ForeachStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2048 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2049 buf->writestring(Token::toChars(op)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2050 buf->writestring(" ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2051 for (int i = 0; i < arguments->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2052 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2053 Argument *a = (Argument *)arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2054 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2055 buf->writestring(", "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2056 if (a->storageClass & STCref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2057 buf->writestring((global.params.Dversion == 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2058 ? (char*)"inout " : (char*)"ref "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2059 if (a->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2060 a->type->toCBuffer(buf, a->ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2061 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2062 buf->writestring(a->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2063 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2064 buf->writestring("; "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2065 aggr->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2066 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2067 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2068 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2069 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2070 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2071 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2072 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2073 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2074 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2075 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2076 /**************************** ForeachRangeStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2077 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2078 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2079 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2080 ForeachRangeStatement::ForeachRangeStatement(Loc loc, enum TOK op, Argument *arg, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2081 Expression *lwr, Expression *upr, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2082 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2083 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2084 this->op = op; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2085 this->arg = arg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2086 this->lwr = lwr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2087 this->upr = upr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2088 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2089 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2090 this->key = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2091 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2092 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2093 Statement *ForeachRangeStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2094 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2095 ForeachRangeStatement *s = new ForeachRangeStatement(loc, op, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2096 arg->syntaxCopy(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2097 lwr->syntaxCopy(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2098 upr->syntaxCopy(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2099 body ? body->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2100 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2101 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2102 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2103 Statement *ForeachRangeStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2104 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2105 //printf("ForeachRangeStatement::semantic() %p\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2106 ScopeDsymbol *sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2107 Statement *s = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2108 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2109 lwr = lwr->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2110 lwr = resolveProperties(sc, lwr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2111 lwr = lwr->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2112 if (!lwr->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2113 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2114 error("invalid range lower bound %s", lwr->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2115 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2116 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2117 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2118 upr = upr->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2119 upr = resolveProperties(sc, upr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2120 upr = upr->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2121 if (!upr->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2122 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2123 error("invalid range upper bound %s", upr->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2124 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2125 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2126 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2127 if (arg->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2128 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2129 arg->type = arg->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2130 lwr = lwr->implicitCastTo(sc, arg->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2131 upr = upr->implicitCastTo(sc, arg->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2132 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2133 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2134 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2135 /* Must infer types from lwr and upr |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2136 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2137 AddExp ea(loc, lwr, upr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2138 ea.typeCombine(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2139 arg->type = ea.type->mutableOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2140 lwr = ea.e1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2141 upr = ea.e2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2142 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2143 #if 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2144 /* Convert to a for loop: |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2145 * foreach (key; lwr .. upr) => |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2146 * for (auto key = lwr, auto tmp = upr; key < tmp; ++key) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2147 * |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2148 * foreach_reverse (key; lwr .. upr) => |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2149 * for (auto tmp = lwr, auto key = upr; key-- > tmp;) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2150 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2151 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2152 ExpInitializer *ie = new ExpInitializer(loc, (op == TOKforeach) ? lwr : upr); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2153 key = new VarDeclaration(loc, arg->type, arg->ident, ie); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2154 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2155 Identifier *id = Lexer::uniqueId("__limit"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2156 ie = new ExpInitializer(loc, (op == TOKforeach) ? upr : lwr); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2157 VarDeclaration *tmp = new VarDeclaration(loc, arg->type, id, ie); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2158 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2159 Statements *cs = new Statements(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2160 // Keep order of evaluation as lwr, then upr |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2161 if (op == TOKforeach) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2162 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2163 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, key))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2164 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2165 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2166 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2167 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2168 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2169 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, key))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2170 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2171 Statement *forinit = new CompoundDeclarationStatement(loc, cs); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2172 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2173 Expression *cond; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2174 if (op == TOKforeach_reverse) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2175 { // key-- > tmp |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2176 cond = new PostExp(TOKminusminus, loc, new VarExp(loc, key)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2177 cond = new CmpExp(TOKgt, loc, cond, new VarExp(loc, tmp)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2178 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2179 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2180 // key < tmp |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2181 cond = new CmpExp(TOKlt, loc, new VarExp(loc, key), new VarExp(loc, tmp)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2182 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2183 Expression *increment = NULL; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2184 if (op == TOKforeach) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2185 // key += 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2186 increment = new AddAssignExp(loc, new VarExp(loc, key), new IntegerExp(1)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2187 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2188 ForStatement *fs = new ForStatement(loc, forinit, cond, increment, body); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2189 s = fs->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2190 return s; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2191 #else |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2192 if (!arg->type->isscalar()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2193 error("%s is not a scalar type", arg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2194 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2195 sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2196 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2197 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2198 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2199 sc->noctor++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2200 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2201 key = new VarDeclaration(loc, arg->type, arg->ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2202 DeclarationExp *de = new DeclarationExp(loc, key); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2203 de->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2204 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2205 if (key->storage_class) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2206 error("foreach range: key cannot have storage class"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2207 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2208 sc->sbreak = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2209 sc->scontinue = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2210 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2211 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2212 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2213 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2214 return s; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2215 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2216 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2217 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2218 int ForeachRangeStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2219 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2220 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2221 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2222 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2223 int ForeachRangeStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2224 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2225 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2226 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2227 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2228 int ForeachRangeStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2229 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2230 assert(0); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2231 return body->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2232 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2233 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2234 int ForeachRangeStatement::blockExit() |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2235 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2236 assert(0); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2237 int result = BEfallthru; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2238 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2239 if (lwr && lwr->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2240 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2241 else if (upr && upr->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2242 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2243 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2244 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2245 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2246 result |= body->blockExit() & ~(BEbreak | BEcontinue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2247 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2248 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2249 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2250 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2251 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2252 int ForeachRangeStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2253 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2254 assert(0); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2255 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2256 return body->comeFrom(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2257 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2258 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2259 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2260 void ForeachRangeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2261 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2262 buf->writestring(Token::toChars(op)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2263 buf->writestring(" ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2264 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2265 if (arg->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2266 arg->type->toCBuffer(buf, arg->ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2267 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2268 buf->writestring(arg->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2269 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2270 buf->writestring("; "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2271 lwr->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2272 buf->writestring(" .. "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2273 upr->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2274 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2275 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2276 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2277 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2278 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2279 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2280 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2281 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2282 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2283 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2284 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2285 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2286 /******************************** IfStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2287 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2288 IfStatement::IfStatement(Loc loc, Argument *arg, Expression *condition, Statement *ifbody, Statement *elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2289 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2290 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2291 this->arg = arg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2292 this->condition = condition; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2293 this->ifbody = ifbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2294 this->elsebody = elsebody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2295 this->match = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2296 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2297 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2298 Statement *IfStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2299 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2300 Statement *i = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2301 if (ifbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2302 i = ifbody->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2304 Statement *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2305 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2306 e = elsebody->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2307 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2308 Argument *a = arg ? arg->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2309 IfStatement *s = new IfStatement(loc, a, condition->syntaxCopy(), i, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2310 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2311 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2312 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2313 Statement *IfStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2314 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2315 condition = condition->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2316 condition = resolveProperties(sc, condition); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2317 condition = condition->checkToBoolean(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2318 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2319 // If we can short-circuit evaluate the if statement, don't do the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2320 // semantic analysis of the skipped code. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2321 // This feature allows a limited form of conditional compilation. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2322 condition = condition->optimize(WANTflags); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2323 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2324 // Evaluate at runtime |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2325 unsigned cs0 = sc->callSuper; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2326 unsigned cs1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2327 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2328 Scope *scd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2329 if (arg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2330 { /* Declare arg, which we will set to be the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2331 * result of condition. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2332 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2333 ScopeDsymbol *sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2334 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2335 scd = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2336 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2337 Type *t = arg->type ? arg->type : condition->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2338 match = new VarDeclaration(loc, t, arg->ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2339 match->noauto = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2340 match->semantic(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2341 if (!scd->insert(match)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2342 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2343 match->parent = sc->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2344 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2345 /* Generate: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2346 * (arg = condition) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2347 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2348 VarExp *v = new VarExp(0, match); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2349 condition = new AssignExp(loc, v, condition); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2350 condition = condition->semantic(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2351 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2352 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2353 scd = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2354 ifbody = ifbody->semantic(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2355 scd->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2356 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2357 cs1 = sc->callSuper; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2358 sc->callSuper = cs0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2359 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2360 elsebody = elsebody->semanticScope(sc, NULL, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2361 sc->mergeCallSuper(loc, cs1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2362 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2363 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2364 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2365 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2366 int IfStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2367 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2368 return (ifbody && ifbody->usesEH()) || (elsebody && elsebody->usesEH()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2369 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2370 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2371 int IfStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2372 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2373 //printf("IfStatement::blockExit(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2374 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2375 int result = BEnone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2376 if (condition->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2377 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2378 if (condition->isBool(TRUE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2379 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2380 if (ifbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2381 result |= ifbody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2382 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2383 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2384 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2385 else if (condition->isBool(FALSE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2386 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2387 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2388 result |= elsebody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2389 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2390 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2391 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2392 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2393 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2394 if (ifbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2395 result |= ifbody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2396 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2397 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2398 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2399 result |= elsebody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2400 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2401 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2402 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2403 //printf("IfStatement::blockExit(%p) = x%x\n", this, result); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2404 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2405 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2406 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2407 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2408 void IfStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2409 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2410 buf->writestring("if ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2411 if (arg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2412 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2413 if (arg->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2414 arg->type->toCBuffer(buf, arg->ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2415 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2416 { buf->writestring("auto "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2417 buf->writestring(arg->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2418 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2419 buf->writestring(" = "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2420 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2421 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2422 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2423 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2424 ifbody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2425 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2426 { buf->writestring("else"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2427 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2428 elsebody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2429 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2430 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2431 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2432 /******************************** ConditionalStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2433 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2434 ConditionalStatement::ConditionalStatement(Loc loc, Condition *condition, Statement *ifbody, Statement *elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2435 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2436 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2437 this->condition = condition; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2438 this->ifbody = ifbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2439 this->elsebody = elsebody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2440 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2441 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2442 Statement *ConditionalStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2443 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2444 Statement *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2445 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2446 e = elsebody->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2447 ConditionalStatement *s = new ConditionalStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2448 condition->syntaxCopy(), ifbody->syntaxCopy(), e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2449 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2450 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2451 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2452 Statement *ConditionalStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2453 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2454 //printf("ConditionalStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2455 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2456 // If we can short-circuit evaluate the if statement, don't do the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2457 // semantic analysis of the skipped code. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2458 // This feature allows a limited form of conditional compilation. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2459 if (condition->include(sc, NULL)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2460 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2461 ifbody = ifbody->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2462 return ifbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2463 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2464 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2465 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2466 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2467 elsebody = elsebody->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2468 return elsebody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2469 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2470 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2471 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2472 Statements *ConditionalStatement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2473 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2474 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2475 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2476 if (condition->include(sc, NULL)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2477 s = ifbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2478 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2479 s = elsebody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2480 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2481 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2482 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2483 return a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2484 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2485 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2486 int ConditionalStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2487 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2488 return (ifbody && ifbody->usesEH()) || (elsebody && elsebody->usesEH()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2489 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2490 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2491 int ConditionalStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2492 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2493 int result = ifbody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2494 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2495 result |= elsebody->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2496 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2497 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2498 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2499 void ConditionalStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2500 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2501 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2502 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2503 buf->writeByte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2504 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2505 if (ifbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2506 ifbody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2507 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2508 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2509 if (elsebody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2510 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2511 buf->writestring("else"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2512 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2513 buf->writeByte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2514 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2515 elsebody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2516 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2517 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2518 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2519 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2520 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2521 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2522 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2523 /******************************** PragmaStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2524 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2525 PragmaStatement::PragmaStatement(Loc loc, Identifier *ident, Expressions *args, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2526 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2527 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2528 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2529 this->args = args; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2530 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2531 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2532 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2533 Statement *PragmaStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2534 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2535 Statement *b = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2536 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2537 b = body->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2538 PragmaStatement *s = new PragmaStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2539 ident, Expression::arraySyntaxCopy(args), b); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2540 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2541 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2542 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2543 Statement *PragmaStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2544 { // Should be merged with PragmaDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2545 //printf("PragmaStatement::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2546 //printf("body = %p\n", body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2547 if (ident == Id::msg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2548 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2549 if (args) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2550 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2551 for (size_t i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2552 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2553 Expression *e = (Expression *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2554 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2555 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2556 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2557 if (e->op == TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2558 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2559 StringExp *se = (StringExp *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2560 fprintf(stdmsg, "%.*s", (int)se->len, (char*)se->string); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2561 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2562 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2563 error("string expected for message, not '%s'", e->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2564 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2565 fprintf(stdmsg, "\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2566 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2567 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2568 else if (ident == Id::lib) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2569 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2570 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2571 /* Should this be allowed? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2572 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2573 error("pragma(lib) not allowed as statement"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2574 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2575 if (!args || args->dim != 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2576 error("string expected for library name"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2577 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2578 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2579 Expression *e = (Expression *)args->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2580 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2581 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2582 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2583 args->data[0] = (void *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2584 if (e->op != TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2585 error("string expected for library name, not '%s'", e->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2586 else if (global.params.verbose) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2587 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2588 StringExp *se = (StringExp *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2589 char *name = (char *)mem.malloc(se->len + 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2590 memcpy(name, se->string, se->len); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2591 name[se->len] = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2592 printf("library %s\n", name); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2593 mem.free(name); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2594 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2596 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2597 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2598 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2599 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2600 else if (ident == Id::allow_inline) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2601 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2602 sc->func->allowInlining = true; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2603 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2604 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2605 else if (ident == Id::startaddress) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2606 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2607 if (!args || args->dim != 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2608 error("function name expected for start address"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2609 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2610 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2611 Expression *e = (Expression *)args->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2612 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2613 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2614 args->data[0] = (void *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2615 Dsymbol *sa = getDsymbol(e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2616 if (!sa || !sa->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2617 error("function name expected for start address, not '%s'", e->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2618 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2619 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2620 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2621 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2622 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2623 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2624 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2625 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2626 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2627 error("unrecognized pragma(%s)", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2628 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2629 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2630 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2631 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2632 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2633 return body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2634 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2635 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2636 int PragmaStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2637 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2638 return body && body->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2639 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2640 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2641 int PragmaStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2642 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2643 int result = BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2644 #if 0 // currently, no code is generated for Pragma's, so it's just fallthru |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2645 if (arrayExpressionCanThrow(args)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2646 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2647 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2648 result |= body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2649 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2650 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2651 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2652 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2653 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2654 void PragmaStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2655 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2656 buf->writestring("pragma ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2657 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2658 if (args && args->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2659 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2660 buf->writestring(", "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2661 argsToCBuffer(buf, args, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2662 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2663 buf->writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2664 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2665 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2666 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2667 buf->writeByte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2668 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2669 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2670 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2671 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2672 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2673 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2674 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2675 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2676 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2677 buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2678 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2679 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2680 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2681 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2682 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2683 /******************************** StaticAssertStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2684 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2685 StaticAssertStatement::StaticAssertStatement(StaticAssert *sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2686 : Statement(sa->loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2687 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2688 this->sa = sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2689 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2690 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2691 Statement *StaticAssertStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2692 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2693 StaticAssertStatement *s = new StaticAssertStatement((StaticAssert *)sa->syntaxCopy(NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2694 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2695 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2696 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2697 Statement *StaticAssertStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2698 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2699 sa->semantic2(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2700 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2701 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2702 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2703 void StaticAssertStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2704 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2705 sa->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2706 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2707 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2708 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2709 /******************************** SwitchStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2710 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2711 SwitchStatement::SwitchStatement(Loc loc, Expression *c, Statement *b, bool isFinal) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2712 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2713 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2714 this->condition = c; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2715 this->body = b; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2716 this->isFinal = isFinal; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2717 sdefault = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2718 cases = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2719 hasNoDefault = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2720 hasVars = 0; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2721 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2722 enclosingScopeExit = NULL; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2723 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2724 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2725 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2726 Statement *SwitchStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2727 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2728 SwitchStatement *s = new SwitchStatement(loc, |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2729 condition->syntaxCopy(), body->syntaxCopy(), isFinal); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2730 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2731 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2732 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2733 Statement *SwitchStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2734 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2735 //printf("SwitchStatement::semantic(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2736 assert(!cases); // ensure semantic() is only run once |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2737 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2738 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2739 enclosingScopeExit = sc->enclosingScopeExit; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2740 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2741 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2742 condition = condition->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2743 condition = resolveProperties(sc, condition); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2744 if (condition->type->isString()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2745 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2746 // If it's not an array, cast it to one |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2747 if (condition->type->ty != Tarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2748 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2749 condition = condition->implicitCastTo(sc, condition->type->nextOf()->arrayOf()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2750 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2751 condition->type = condition->type->constOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2752 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2753 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2754 { condition = condition->integralPromotions(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2755 condition->checkIntegral(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2756 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2757 condition = condition->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2758 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2759 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2760 sc->sbreak = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2761 sc->sw = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2762 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2763 cases = new Array(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2764 sc->noctor++; // BUG: should use Scope::mergeCallSuper() for each case instead |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2765 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2766 sc->noctor--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2767 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2768 // Resolve any goto case's with exp |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2769 for (int i = 0; i < gotoCases.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2770 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2771 GotoCaseStatement *gcs = (GotoCaseStatement *)gotoCases.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2772 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2773 if (!gcs->exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2774 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2775 gcs->error("no case statement following goto case;"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2776 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2777 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2778 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2779 for (Scope *scx = sc; scx; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2780 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2781 if (!scx->sw) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2782 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2783 for (int j = 0; j < scx->sw->cases->dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2784 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2785 CaseStatement *cs = (CaseStatement *)scx->sw->cases->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2786 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2787 if (cs->exp->equals(gcs->exp)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2788 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2789 gcs->cs = cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2790 goto Lfoundcase; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2791 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2792 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2793 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2794 gcs->error("case %s not found", gcs->exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2795 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2796 Lfoundcase: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2797 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2798 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2799 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2800 if (!sc->sw->sdefault && !isFinal) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2801 { hasNoDefault = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2802 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2803 warning("switch statement has no default"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2804 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2805 // Generate runtime error if the default is hit |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2806 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2807 CompoundStatement *cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2808 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2809 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2810 if (global.params.useSwitchError) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2811 s = new SwitchErrorStatement(loc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2812 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2813 { Expression *e = new HaltExp(loc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2814 s = new ExpStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2815 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2816 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2817 a->reserve(4); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2818 a->push(body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2819 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2820 // LDC needs semantic to be run on break |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2821 Statement *breakstmt = new BreakStatement(loc, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2822 breakstmt->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2823 a->push(breakstmt); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2824 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2825 sc->sw->sdefault = new DefaultStatement(loc, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2826 a->push(sc->sw->sdefault); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2827 cs = new CompoundStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2828 body = cs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2829 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2830 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2831 #if DMDV2 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2832 if (isFinal) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2833 { Type *t = condition->type; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2834 while (t->ty == Ttypedef) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2835 { // Don't use toBasetype() because that will skip past enums |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2836 t = ((TypeTypedef *)t)->sym->basetype; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2837 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2838 if (condition->type->ty == Tenum) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2839 { TypeEnum *te = (TypeEnum *)condition->type; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2840 EnumDeclaration *ed = te->toDsymbol(sc)->isEnumDeclaration(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2841 assert(ed); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2842 size_t dim = ed->members->dim; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2843 for (size_t i = 0; i < dim; i++) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2844 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2845 EnumMember *em = ((Dsymbol *)ed->members->data[i])->isEnumMember(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2846 if (em) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2847 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2848 for (size_t j = 0; j < cases->dim; j++) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2849 { CaseStatement *cs = (CaseStatement *)cases->data[j]; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2850 if (cs->exp->equals(em->value)) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2851 goto L1; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2852 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2853 error("enum member %s not represented in final switch", em->toChars()); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2854 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2855 L1: |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2856 ; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2857 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2858 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2859 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2860 #endif |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2861 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2862 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2863 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2864 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2865 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2866 int SwitchStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2867 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2868 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2869 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2870 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2871 int SwitchStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2872 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2873 return body ? body->usesEH() : 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2874 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2875 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2876 int SwitchStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2877 { int result = BEnone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2878 if (condition->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2879 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2880 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2881 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2882 { result |= body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2883 if (result & BEbreak) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2884 { result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2885 result &= ~BEbreak; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2886 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2887 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2888 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2889 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2890 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2891 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2892 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2893 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2894 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2895 void SwitchStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2896 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2897 buf->writestring("switch ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2898 condition->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2899 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2900 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2901 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2902 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2903 if (!body->isScopeStatement()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2904 { buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2905 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2906 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2907 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2908 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2909 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2910 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2911 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2912 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2913 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2914 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2915 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2916 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2917 /******************************** CaseStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2918 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2919 CaseStatement::CaseStatement(Loc loc, Expression *exp, Statement *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2920 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2921 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2922 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2923 this->statement = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2924 index = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2925 cblock = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2926 bodyBB = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2927 llvmIdx = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2928 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2929 enclosingScopeExit = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2930 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2931 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2932 Statement *CaseStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2933 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2934 CaseStatement *s = new CaseStatement(loc, exp->syntaxCopy(), statement->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2935 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2936 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2937 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2938 Statement *CaseStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2939 { SwitchStatement *sw = sc->sw; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2940 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2941 //printf("CaseStatement::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2942 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2943 if (sw) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2944 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2945 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2946 enclosingScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2947 if (enclosingScopeExit != sw->enclosingScopeExit) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2948 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2949 error("case must be inside the same try, synchronized or volatile level as switch"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2950 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2951 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2952 exp = exp->implicitCastTo(sc, sw->condition->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2953 exp = exp->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2954 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2955 /* This is where variables are allowed as case expressions. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2956 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2957 if (exp->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2958 { VarExp *ve = (VarExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2959 VarDeclaration *v = ve->var->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2960 Type *t = exp->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2961 if (v && (t->isintegral() || t->ty == Tclass)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2962 { /* Flag that we need to do special code generation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2963 * for this, i.e. generate a sequence of if-then-else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2964 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2965 sw->hasVars = 1; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2966 if (sw->isFinal) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
2967 error("case variables not allowed in final switch statements"); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2968 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2969 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2970 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2971 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2972 if (exp->op != TOKstring && exp->op != TOKint64) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2973 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2974 error("case must be a string or an integral constant, not %s", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2975 exp = new IntegerExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2976 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2977 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2978 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2979 for (int i = 0; i < sw->cases->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2980 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2981 CaseStatement *cs = (CaseStatement *)sw->cases->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2982 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2983 //printf("comparing '%s' with '%s'\n", exp->toChars(), cs->exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2984 if (cs->exp->equals(exp)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2985 { error("duplicate case %s in switch statement", exp->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2986 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2987 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2988 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2989 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2990 sw->cases->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2991 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2992 // Resolve any goto case's with no exp to this case statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2993 for (int i = 0; i < sw->gotoCases.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2994 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2995 GotoCaseStatement *gcs = (GotoCaseStatement *)sw->gotoCases.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2996 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2997 if (!gcs->exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2998 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2999 gcs->cs = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3000 sw->gotoCases.remove(i); // remove from array |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3001 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3002 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3003 #if IN_DMD |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3004 if (sc->sw->tf != sc->tf) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3005 error("switch and case are in different finally blocks"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3006 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3007 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3008 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3009 error("case not in switch statement"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3010 statement = statement->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3011 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3012 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3013 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3014 int CaseStatement::compare(Object *obj) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3015 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3016 // Sort cases so we can do an efficient lookup |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3017 CaseStatement *cs2 = (CaseStatement *)(obj); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3018 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3019 return exp->compare(cs2->exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3020 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3021 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3022 int CaseStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3023 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3024 return statement->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3025 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3026 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3027 int CaseStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3028 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3029 return statement->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3030 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3031 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3032 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3033 int CaseStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3034 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3035 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3036 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3037 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3038 void CaseStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3039 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3040 buf->writestring("case "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3041 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3042 buf->writebyte(':'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3043 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3044 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3045 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3046 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3047 /******************************** CaseRangeStatement ***************************/ |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3048 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3049 #if DMDV2 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3050 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3051 CaseRangeStatement::CaseRangeStatement(Loc loc, Expression *first, |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3052 Expression *last, Statement *s) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3053 : Statement(loc) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3054 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3055 this->first = first; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3056 this->last = last; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3057 this->statement = s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3058 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3059 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3060 Statement *CaseRangeStatement::syntaxCopy() |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3061 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3062 CaseRangeStatement *s = new CaseRangeStatement(loc, |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3063 first->syntaxCopy(), last->syntaxCopy(), statement->syntaxCopy()); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3064 return s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3065 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3066 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3067 Statement *CaseRangeStatement::semantic(Scope *sc) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3068 { SwitchStatement *sw = sc->sw; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3069 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3070 //printf("CaseRangeStatement::semantic() %s\n", toChars()); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3071 if (sw->isFinal) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3072 error("case ranges not allowed in final switch"); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3073 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3074 first = first->semantic(sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3075 first = first->implicitCastTo(sc, sw->condition->type); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3076 first = first->optimize(WANTvalue | WANTinterpret); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3077 dinteger_t fval = first->toInteger(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3078 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3079 last = last->semantic(sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3080 last = last->implicitCastTo(sc, sw->condition->type); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3081 last = last->optimize(WANTvalue | WANTinterpret); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3082 dinteger_t lval = last->toInteger(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3083 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3084 if (lval - fval > 256) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3085 { error("more than 256 cases in case range"); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3086 lval = fval + 256; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3087 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3088 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3089 /* This works by replacing the CaseRange with an array of Case's. |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3090 * |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3091 * case a: .. case b: s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3092 * => |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3093 * case a: |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3094 * [...] |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3095 * case b: |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3096 * s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3097 */ |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3098 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3099 Statements *statements = new Statements(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3100 for (dinteger_t i = fval; i <= lval; i++) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3101 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3102 Statement *s = statement; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3103 if (i != lval) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3104 s = new ExpStatement(loc, NULL); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3105 Expression *e = new IntegerExp(loc, i, first->type); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3106 Statement *cs = new CaseStatement(loc, e, s); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3107 statements->push(cs); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3108 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3109 Statement *s = new CompoundStatement(loc, statements); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3110 s = s->semantic(sc); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3111 return s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3112 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3113 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3114 void CaseRangeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3115 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3116 buf->writestring("case "); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3117 first->toCBuffer(buf, hgs); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3118 buf->writestring(": .. case "); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3119 last->toCBuffer(buf, hgs); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3120 buf->writenl(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3121 statement->toCBuffer(buf, hgs); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3122 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3123 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3124 #endif |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3125 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3126 /******************************** DefaultStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3127 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3128 DefaultStatement::DefaultStatement(Loc loc, Statement *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3129 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3130 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3131 this->statement = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3132 #if IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3133 + cblock = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3134 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3135 bodyBB = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3136 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3137 enclosingScopeExit = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3138 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3139 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3140 Statement *DefaultStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3141 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3142 DefaultStatement *s = new DefaultStatement(loc, statement->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3143 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3144 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3145 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3146 Statement *DefaultStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3147 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3148 //printf("DefaultStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3149 if (sc->sw) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3150 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3151 if (sc->sw->sdefault) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3152 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3153 error("switch statement already has a default"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3154 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3155 sc->sw->sdefault = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3156 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3157 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3158 enclosingScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3159 if (enclosingScopeExit != sc->sw->enclosingScopeExit) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3160 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3161 error("default must be inside the same try, synchronized or volatile level as switch"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3162 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3163 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3164 if (sc->sw->isFinal) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3165 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3166 error("default statement not allowed in final switch statement"); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3167 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3168 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3169 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3170 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3171 error("default not in switch statement"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3172 statement = statement->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3173 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3174 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3175 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3176 int DefaultStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3177 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3178 return statement->usesEH(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3179 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3181 int DefaultStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3182 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3183 return statement->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3184 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3185 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3186 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3187 int DefaultStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3188 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3189 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3190 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3191 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3192 void DefaultStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3193 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3194 buf->writestring("default:\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3195 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3196 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3197 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3198 /******************************** GotoDefaultStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3200 GotoDefaultStatement::GotoDefaultStatement(Loc loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3201 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3202 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3203 sw = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3204 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3205 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3206 Statement *GotoDefaultStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3207 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3208 GotoDefaultStatement *s = new GotoDefaultStatement(loc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3209 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3210 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3211 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3212 Statement *GotoDefaultStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3213 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3214 sw = sc->sw; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3215 if (!sw) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3216 error("goto default not in switch statement"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3217 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3218 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3219 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3220 int GotoDefaultStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3221 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3222 return BEgoto; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3223 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3224 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3225 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3226 void GotoDefaultStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3227 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3228 buf->writestring("goto default;\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3229 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3230 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3231 /******************************** GotoCaseStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3232 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3233 GotoCaseStatement::GotoCaseStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3234 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3235 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3236 cs = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3237 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3238 sw = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3239 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3240 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3241 Statement *GotoCaseStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3242 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3243 Expression *e = exp ? exp->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3244 GotoCaseStatement *s = new GotoCaseStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3245 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3246 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3247 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3248 Statement *GotoCaseStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3249 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3250 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3251 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3252 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3253 if (!sc->sw) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3254 error("goto case not in switch statement"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3255 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3256 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3257 sw = sc->sw; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3258 sc->sw->gotoCases.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3259 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3260 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3261 exp = exp->implicitCastTo(sc, sc->sw->condition->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3262 exp = exp->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3263 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3264 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3265 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3266 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3267 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3268 int GotoCaseStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3269 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3270 return BEgoto; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3271 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3272 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3273 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3274 void GotoCaseStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3275 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3276 buf->writestring("goto case"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3277 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3278 { buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3279 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3280 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3281 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3282 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3283 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3284 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3285 /******************************** SwitchErrorStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3286 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3287 SwitchErrorStatement::SwitchErrorStatement(Loc loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3288 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3289 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3290 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3291 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3292 int SwitchErrorStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3293 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3294 return BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3295 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3296 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3297 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3298 void SwitchErrorStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3299 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3300 buf->writestring("SwitchErrorStatement::toCBuffer()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3301 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3302 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3304 /******************************** ReturnStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3305 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3306 ReturnStatement::ReturnStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3307 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3308 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3309 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3310 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3311 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3312 Statement *ReturnStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3313 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3314 Expression *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3315 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3316 e = exp->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3317 ReturnStatement *s = new ReturnStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3318 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3319 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3320 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3321 Statement *ReturnStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3322 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3323 //printf("ReturnStatement::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3324 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3325 FuncDeclaration *fd = sc->parent->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3326 Scope *scx = sc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3327 int implicit0 = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3328 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3329 if (sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3330 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3331 // Find scope of function foreach is in |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3332 for (; 1; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3333 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3334 assert(scx); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3335 if (scx->func != fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3336 { fd = scx->func; // fd is now function enclosing foreach |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3337 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3338 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3339 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3340 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3341 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3342 Type *tret = fd->type->nextOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3343 if (fd->tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3344 /* We'll be implicitly casting the return expression to tintro |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3345 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3346 tret = fd->tintro->nextOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3347 Type *tbret = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3348 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3349 if (tret) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3350 tbret = tret->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3351 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3352 // main() returns 0, even if it returns void |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3353 if (!exp && (!tbret || tbret->ty == Tvoid) && fd->isMain()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3354 { implicit0 = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3355 exp = new IntegerExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3356 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3357 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3358 if (sc->incontract || scx->incontract) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3359 error("return statements cannot be in contracts"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3360 if (sc->enclosingFinally || scx->enclosingFinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3361 error("return statements cannot be in finally, scope(exit) or scope(success) bodies"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3362 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3363 if (fd->isCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3364 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3365 // Constructors implicitly do: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3366 // return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3367 if (exp && exp->op != TOKthis) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3368 error("cannot return expression from constructor"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3369 exp = new ThisExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3370 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3371 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3372 if (!exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3373 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3374 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3375 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3376 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3377 fd->hasReturnExp |= 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3378 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3379 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3380 exp = resolveProperties(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3381 exp = exp->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3382 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3383 if (fd->nrvo_can && exp->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3384 { VarExp *ve = (VarExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3385 VarDeclaration *v = ve->var->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3386 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3387 if (((TypeFunction *)fd->type)->isref) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3388 // Function returns a reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3389 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3390 else if (!v || v->isOut() || v->isRef()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3391 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3392 else if (tbret->ty == Tstruct && ((TypeStruct *)tbret)->sym->dtor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3393 // Struct being returned has destructors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3394 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3395 else if (fd->nrvo_var == NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3396 { if (!v->isDataseg() && !v->isParameter() && v->toParent2() == fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3397 { //printf("Setting nrvo to %s\n", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3398 fd->nrvo_var = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3399 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3400 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3401 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3402 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3403 else if (fd->nrvo_var != v) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3404 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3405 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3406 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3407 fd->nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3409 if (fd->returnLabel && tbret->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3410 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3411 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3412 else if (fd->inferRetType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3413 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3414 if (fd->type->nextOf()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3415 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3416 if (!exp->type->equals(fd->type->nextOf())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3417 error("mismatched function return type inference of %s and %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3418 exp->type->toChars(), fd->type->nextOf()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3419 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3420 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3421 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3422 ((TypeFunction *)fd->type)->next = exp->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3423 fd->type = fd->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3424 if (!fd->tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3425 { tret = fd->type->nextOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3426 tbret = tret->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3427 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3428 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3429 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3430 else if (tbret->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3431 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3432 exp = exp->implicitCastTo(sc, tret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3433 exp = exp->optimize(WANTvalue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3434 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3436 else if (fd->inferRetType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3437 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3438 if (fd->type->nextOf()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3439 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3440 if (fd->type->nextOf()->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3441 error("mismatched function return type inference of void and %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3442 fd->type->nextOf()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3443 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3444 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3445 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3446 ((TypeFunction *)fd->type)->next = Type::tvoid; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3447 fd->type = fd->type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3448 if (!fd->tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3449 { tret = Type::tvoid; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3450 tbret = tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3451 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3452 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3453 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3454 else if (tbret->ty != Tvoid) // if non-void return |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3455 error("return expression expected"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3456 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3457 if (sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3458 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3459 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3460 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3461 if (exp && !implicit0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3462 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3463 exp = exp->implicitCastTo(sc, tret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3464 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3465 if (!exp || exp->op == TOKint64 || exp->op == TOKfloat64 || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3466 exp->op == TOKimaginary80 || exp->op == TOKcomplex80 || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3467 exp->op == TOKthis || exp->op == TOKsuper || exp->op == TOKnull || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3468 exp->op == TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3469 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3470 sc->fes->cases.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3471 // Construct: return cases.dim+1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3472 s = new ReturnStatement(0, new IntegerExp(sc->fes->cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3473 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3474 else if (fd->type->nextOf()->toBasetype() == Type::tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3475 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3476 s = new ReturnStatement(0, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3477 sc->fes->cases.push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3478 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3479 // Construct: { exp; return cases.dim + 1; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3480 Statement *s1 = new ExpStatement(loc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3481 Statement *s2 = new ReturnStatement(0, new IntegerExp(sc->fes->cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3482 s = new CompoundStatement(loc, s1, s2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3483 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3484 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3485 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3486 // Construct: return vresult; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3487 if (!fd->vresult) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3488 { // Declare vresult |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3489 VarDeclaration *v = new VarDeclaration(loc, tret, Id::result, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3490 v->noauto = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3491 v->semantic(scx); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3492 if (!scx->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3493 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3494 v->parent = fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3495 fd->vresult = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3496 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3497 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3498 s = new ReturnStatement(0, new VarExp(0, fd->vresult)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3499 sc->fes->cases.push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3500 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3501 // Construct: { vresult = exp; return cases.dim + 1; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3502 exp = new AssignExp(loc, new VarExp(0, fd->vresult), exp); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3503 exp->op = TOKconstruct; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3504 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3505 Statement *s1 = new ExpStatement(loc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3506 Statement *s2 = new ReturnStatement(0, new IntegerExp(sc->fes->cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3507 s = new CompoundStatement(loc, s1, s2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3508 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3509 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3510 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3511 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3512 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3513 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3514 if (fd->returnLabel && tbret->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3515 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3516 assert(fd->vresult); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3517 VarExp *v = new VarExp(0, fd->vresult); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3518 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3519 exp = new AssignExp(loc, v, exp); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3520 exp->op = TOKconstruct; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3521 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3522 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3523 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3524 if (((TypeFunction *)fd->type)->isref && !fd->isCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3525 { // Function returns a reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3526 if (tbret->isMutable()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3527 exp = exp->modifiableLvalue(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3528 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3529 exp = exp->toLvalue(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3530 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3531 if (exp->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3532 { VarExp *ve = (VarExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3533 VarDeclaration *v = ve->var->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3534 if (v && !v->isDataseg() && !(v->storage_class & (STCref | STCout))) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3535 error("escaping reference to local variable %s", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3536 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3537 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3538 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3539 //exp->dump(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3540 //exp->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3541 exp->checkEscape(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3542 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3543 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3544 /* BUG: need to issue an error on: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3545 * this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3546 * { if (x) return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3547 * super(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3548 * } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3549 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3550 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3551 if (sc->callSuper & CSXany_ctor && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3552 !(sc->callSuper & (CSXthis_ctor | CSXsuper_ctor))) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3553 error("return without calling constructor"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3554 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3555 sc->callSuper |= CSXreturn; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3556 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3557 // See if all returns are instead to be replaced with a goto returnLabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3558 if (fd->returnLabel) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3559 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3560 GotoStatement *gs = new GotoStatement(loc, Id::returnLabel); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3561 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3562 gs->label = fd->returnLabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3563 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3564 { /* Replace: return exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3565 * with: exp; goto returnLabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3566 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3567 Statement *s = new ExpStatement(0, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3568 return new CompoundStatement(loc, s, gs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3569 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3570 return gs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3571 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3572 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3573 if (exp && tbret->ty == Tvoid && !fd->isMain()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3574 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3575 /* Replace: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3576 * return exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3577 * with: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3578 * exp; return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3579 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3580 Statement *s = new ExpStatement(loc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3581 loc = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3582 exp = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3583 return new CompoundStatement(loc, s, this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3584 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3585 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3586 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3587 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3588 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3589 int ReturnStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3590 { int result = BEreturn; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3591 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3592 if (exp && exp->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3593 result |= BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3594 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3596 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3597 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3598 void ReturnStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3599 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3600 buf->printf("return "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3601 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3602 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3603 buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3604 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3605 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3606 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3607 /******************************** BreakStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3608 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3609 BreakStatement::BreakStatement(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3610 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3611 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3612 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3613 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3614 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3615 Statement *BreakStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3616 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3617 BreakStatement *s = new BreakStatement(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3618 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3619 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3620 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3621 Statement *BreakStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3622 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3623 //printf("BreakStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3624 // If: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3625 // break Identifier; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3626 if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3627 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3628 Scope *scx; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3629 FuncDeclaration *thisfunc = sc->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3630 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3631 for (scx = sc; scx; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3632 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3633 LabelStatement *ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3634 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3635 if (scx->func != thisfunc) // if in enclosing function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3636 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3637 if (sc->fes) // if this is the body of a foreach |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3638 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3639 /* Post this statement to the fes, and replace |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3640 * it with a return value that caller will put into |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3641 * a switch. Caller will figure out where the break |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3642 * label actually is. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3643 * Case numbers start with 2, not 0, as 0 is continue |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3644 * and 1 is break. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3645 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3646 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3647 sc->fes->cases.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3648 s = new ReturnStatement(0, new IntegerExp(sc->fes->cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3649 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3650 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3651 break; // can't break to it |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3652 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3653 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3654 ls = scx->slabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3655 if (ls && ls->ident == ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3656 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3657 Statement *s = ls->statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3658 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3659 if (!s->hasBreak()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3660 error("label '%s' has no break", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3661 if (ls->enclosingFinally != sc->enclosingFinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3662 error("cannot break out of finally block"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3663 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3664 this->target = ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3665 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3666 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3667 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3668 error("enclosing label '%s' for break not found", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3669 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3670 else if (!sc->sbreak) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3671 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3672 if (sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3673 { Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3674 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3675 // Replace break; with return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3676 s = new ReturnStatement(0, new IntegerExp(1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3677 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3678 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3679 error("break is not inside a loop or switch"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3680 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3681 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3682 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3683 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3684 int BreakStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3685 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3686 //printf("BreakStatement::blockExit(%p) = x%x\n", this, ident ? BEgoto : BEbreak); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3687 return ident ? BEgoto : BEbreak; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3688 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3689 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3690 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3691 void BreakStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3692 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3693 buf->writestring("break"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3694 if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3695 { buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3696 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3697 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3698 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3699 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3700 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3701 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3702 /******************************** ContinueStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3703 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3704 ContinueStatement::ContinueStatement(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3705 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3706 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3707 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3708 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3709 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3710 Statement *ContinueStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3711 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3712 ContinueStatement *s = new ContinueStatement(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3713 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3714 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3715 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3716 Statement *ContinueStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3717 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3718 //printf("ContinueStatement::semantic() %p\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3719 if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3720 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3721 Scope *scx; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3722 FuncDeclaration *thisfunc = sc->func; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3723 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3724 for (scx = sc; scx; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3725 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3726 LabelStatement *ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3727 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3728 if (scx->func != thisfunc) // if in enclosing function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3729 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3730 if (sc->fes) // if this is the body of a foreach |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3731 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3732 for (; scx; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3733 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3734 ls = scx->slabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3735 if (ls && ls->ident == ident && ls->statement == sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3736 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3737 // Replace continue ident; with return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3738 return new ReturnStatement(0, new IntegerExp(0)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3739 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3740 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3741 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3742 /* Post this statement to the fes, and replace |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3743 * it with a return value that caller will put into |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3744 * a switch. Caller will figure out where the break |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3745 * label actually is. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3746 * Case numbers start with 2, not 0, as 0 is continue |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3747 * and 1 is break. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3748 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3749 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3750 sc->fes->cases.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3751 s = new ReturnStatement(0, new IntegerExp(sc->fes->cases.dim + 1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3752 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3753 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3754 break; // can't continue to it |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3755 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3756 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3757 ls = scx->slabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3758 if (ls && ls->ident == ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3759 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3760 Statement *s = ls->statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3761 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3762 if (!s->hasContinue()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3763 error("label '%s' has no continue", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3764 if (ls->enclosingFinally != sc->enclosingFinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3765 error("cannot continue out of finally block"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3766 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3767 this->target = ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3768 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3769 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3770 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3771 error("enclosing label '%s' for continue not found", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3772 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3773 else if (!sc->scontinue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3774 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3775 if (sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3776 { Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3777 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3778 // Replace continue; with return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3779 s = new ReturnStatement(0, new IntegerExp(0)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3780 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3781 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3782 error("continue is not inside a loop"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3783 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3784 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3785 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3786 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3787 int ContinueStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3788 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3789 return ident ? BEgoto : BEcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3790 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3791 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3792 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3793 void ContinueStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3794 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3795 buf->writestring("continue"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3796 if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3797 { buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3798 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3799 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3800 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3801 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3802 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3803 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3804 /******************************** SynchronizedStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3805 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3806 SynchronizedStatement::SynchronizedStatement(Loc loc, Expression *exp, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3807 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3808 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3809 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3810 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3811 this->esync = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3812 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3813 this->llsync = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3814 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3815 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3816 SynchronizedStatement::SynchronizedStatement(Loc loc, elem *esync, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3817 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3818 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3819 this->exp = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3820 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3821 this->esync = esync; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3822 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3823 this->llsync = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3824 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3826 Statement *SynchronizedStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3827 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3828 Expression *e = exp ? exp->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3829 SynchronizedStatement *s = new SynchronizedStatement(loc, e, body ? body->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3830 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3831 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3832 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3833 Statement *SynchronizedStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3834 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3835 if (exp) |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3836 { |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3837 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3838 exp = resolveProperties(sc, exp); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3839 ClassDeclaration *cd = exp->type->isClassHandle(); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3840 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3841 error("can only synchronize on class objects, not '%s'", exp->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3842 else if (cd->isInterfaceDeclaration()) |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3843 { /* Cast the interface to an object, as the object has the monitor, |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3844 * not the interface. |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3845 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3846 Type *t = new TypeIdentifier(0, Id::Object); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3847 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3848 t = t->semantic(0, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3849 exp = new CastExp(loc, exp, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3850 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3851 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3852 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3853 #if 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3854 /* Rewrite as: |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3855 * auto tmp = exp; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3856 * _d_monitorenter(tmp); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3857 * try { body } finally { _d_monitorexit(tmp); } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3858 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3859 Identifier *id = Lexer::uniqueId("__sync"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3860 ExpInitializer *ie = new ExpInitializer(loc, exp); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3861 VarDeclaration *tmp = new VarDeclaration(loc, exp->type, id, ie); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3862 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3863 Statements *cs = new Statements(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3864 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3865 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3866 #if IN_LLVM |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3867 // LDC: Build args |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3868 Arguments* args = new Arguments; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3869 args->push(new Argument(STCin, ClassDeclaration::object->type, NULL, NULL)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3870 FuncDeclaration *fdenter = FuncDeclaration::genCfunc(args, Type::tvoid, Id::monitorenter); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3871 #else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3872 FuncDeclaration *fdenter = FuncDeclaration::genCfunc(Type::tvoid, Id::monitorenter); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3873 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3874 Expression *e = new CallExp(loc, new VarExp(loc, fdenter), new VarExp(loc, tmp)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3875 e->type = Type::tvoid; // do not run semantic on e |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3876 cs->push(new ExpStatement(loc, e)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3877 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3878 #if IN_LLVM |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3879 FuncDeclaration *fdexit = FuncDeclaration::genCfunc(args, Type::tvoid, Id::monitorexit); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3880 #else |
1582
d8e558087001
Fixed a segfault in ldc2 when compiling synchronized{} blocks.
Robert Clipsham <robert@octarineparrot.com>
parents:
1578
diff
changeset
|
3881 FuncDeclaration *fdexit = FuncDeclaration::genCfunc(Type::tvoid, Id::monitorexit); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3882 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3883 e = new CallExp(loc, new VarExp(loc, fdexit), new VarExp(loc, tmp)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3884 e->type = Type::tvoid; // do not run semantic on e |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3885 Statement *s = new ExpStatement(loc, e); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3886 s = new TryFinallyStatement(loc, body, s); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3887 cs->push(s); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3888 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3889 s = new CompoundStatement(loc, cs); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3890 return s->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3891 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3892 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3893 #if 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3894 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3895 { /* Generate our own critical section, then rewrite as: |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3896 * __gshared byte[CriticalSection.sizeof] critsec; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3897 * _d_criticalenter(critsec.ptr); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3898 * try { body } finally { _d_criticalexit(critsec.ptr); } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3899 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3900 Identifier *id = Lexer::uniqueId("__critsec"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3901 Type *t = new TypeSArray(Type::tint8, new IntegerExp(PTRSIZE + os_critsecsize())); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3902 VarDeclaration *tmp = new VarDeclaration(loc, t, id, NULL); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3903 tmp->storage_class |= STCgshared | STCstatic; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3904 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3905 Statements *cs = new Statements(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3906 cs->push(new DeclarationStatement(loc, new DeclarationExp(loc, tmp))); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3907 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3908 #if IN_LLVM |
1578
1dee66f6ec0b
Removed a chunk of code in favour of a shorter and more portable method
Robert Clipsham <robert@octarineparrot.com>
parents:
1577
diff
changeset
|
3909 // LDC: Build args |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3910 Arguments* args = new Arguments; |
1578
1dee66f6ec0b
Removed a chunk of code in favour of a shorter and more portable method
Robert Clipsham <robert@octarineparrot.com>
parents:
1577
diff
changeset
|
3911 args->push(new Argument(STCin, t->pointerTo(), NULL, NULL)); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3912 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3913 FuncDeclaration *fdenter = FuncDeclaration::genCfunc(args, Type::tvoid, Id::criticalenter); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3914 #else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3915 FuncDeclaration *fdenter = FuncDeclaration::genCfunc(Type::tvoid, Id::criticalenter); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3916 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3917 Expression *e = new DotIdExp(loc, new VarExp(loc, tmp), Id::ptr); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3918 e = e->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3919 e = new CallExp(loc, new VarExp(loc, fdenter), e); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3920 e->type = Type::tvoid; // do not run semantic on e |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3921 cs->push(new ExpStatement(loc, e)); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3922 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3923 #if IN_LLVM |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3924 FuncDeclaration *fdexit = FuncDeclaration::genCfunc(args, Type::tvoid, Id::criticalexit); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3925 #else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3926 FuncDeclaration *fdexit = FuncDeclaration::genCfunc(Type::tvoid, Id::criticalexit); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3927 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3928 e = new DotIdExp(loc, new VarExp(loc, tmp), Id::ptr); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3929 e = e->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3930 e = new CallExp(loc, new VarExp(loc, fdexit), e); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3931 e->type = Type::tvoid; // do not run semantic on e |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3932 Statement *s = new ExpStatement(loc, e); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3933 s = new TryFinallyStatement(loc, body, s); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3934 cs->push(s); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3935 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3936 s = new CompoundStatement(loc, cs); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3937 return s->semantic(sc); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3938 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
3939 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3940 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3941 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3942 Statement* oldScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3943 sc->enclosingScopeExit = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3944 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3945 sc->enclosingScopeExit = oldScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3946 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3947 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3948 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3949 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3950 int SynchronizedStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3951 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3952 return FALSE; //TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3953 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3954 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3955 int SynchronizedStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3956 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3957 return FALSE; //TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3958 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3959 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3960 int SynchronizedStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3961 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3962 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3963 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3964 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3965 int SynchronizedStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3966 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3967 return body ? body->blockExit() : BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3968 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3969 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3970 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3971 void SynchronizedStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3972 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3973 buf->writestring("synchronized"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3974 if (exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3975 { buf->writebyte('('); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3976 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3977 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3978 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3979 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3980 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3981 buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3982 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3983 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3984 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3985 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3986 /******************************** WithStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3987 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3988 WithStatement::WithStatement(Loc loc, Expression *exp, Statement *body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3989 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3990 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3991 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3992 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3993 wthis = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3994 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3995 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3996 Statement *WithStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3997 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3998 WithStatement *s = new WithStatement(loc, exp->syntaxCopy(), body ? body->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3999 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4000 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4001 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4002 Statement *WithStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4003 { ScopeDsymbol *sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4004 Initializer *init; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4005 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4006 //printf("WithStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4007 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4008 exp = resolveProperties(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4009 if (exp->op == TOKimport) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4010 { ScopeExp *es = (ScopeExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4011 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4012 sym = es->sds; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4013 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4014 else if (exp->op == TOKtype) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4015 { TypeExp *es = (TypeExp *)exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4016 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4017 sym = es->type->toDsymbol(sc)->isScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4018 if (!sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4019 { error("%s has no members", es->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4020 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4021 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4022 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4023 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4024 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4025 { Type *t = exp->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4026 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4027 assert(t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4028 t = t->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4029 if (t->isClassHandle()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4030 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4031 init = new ExpInitializer(loc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4032 wthis = new VarDeclaration(loc, exp->type, Id::withSym, init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4033 wthis->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4034 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4035 sym = new WithScopeSymbol(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4036 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4037 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4038 else if (t->ty == Tstruct) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4039 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4040 Expression *e = exp->addressOf(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4041 init = new ExpInitializer(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4042 wthis = new VarDeclaration(loc, e->type, Id::withSym, init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4043 wthis->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4044 sym = new WithScopeSymbol(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4045 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4046 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4047 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4048 { error("with expressions must be class objects, not '%s'", exp->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4049 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4050 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4051 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4052 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4053 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4054 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4055 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4056 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4057 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4058 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4059 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4060 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4061 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4062 void WithStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4063 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4064 buf->writestring("with ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4065 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4066 buf->writestring(")\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4067 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4068 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4069 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4070 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4071 int WithStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4072 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4073 return body ? body->usesEH() : 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4074 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4075 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4076 int WithStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4077 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4078 int result = BEnone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4079 if (exp->canThrow()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4080 result = BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4081 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4082 result |= body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4083 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4084 result |= BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4085 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4086 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4087 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4088 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4089 /******************************** TryCatchStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4090 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4091 TryCatchStatement::TryCatchStatement(Loc loc, Statement *body, Array *catches) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4092 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4093 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4094 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4095 this->catches = catches; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4096 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4097 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4098 Statement *TryCatchStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4099 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4100 Array *a = new Array(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4101 a->setDim(catches->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4102 for (int i = 0; i < a->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4103 { Catch *c; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4104 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4105 c = (Catch *)catches->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4106 c = c->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4107 a->data[i] = c; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4108 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4109 TryCatchStatement *s = new TryCatchStatement(loc, body->syntaxCopy(), a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4110 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4111 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4112 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4113 Statement *TryCatchStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4114 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4115 body = body->semanticScope(sc, NULL /*this*/, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4116 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4117 /* Even if body is NULL, still do semantic analysis on catches |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4118 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4119 for (size_t i = 0; i < catches->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4120 { Catch *c = (Catch *)catches->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4121 c->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4122 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4123 // Determine if current catch 'hides' any previous catches |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4124 for (size_t j = 0; j < i; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4125 { Catch *cj = (Catch *)catches->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4126 char *si = c->loc.toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4127 char *sj = cj->loc.toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4128 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4129 if (c->type->toBasetype()->implicitConvTo(cj->type->toBasetype())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4130 error("catch at %s hides catch at %s", sj, si); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4131 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4132 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4133 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4134 if (!body || body->isEmpty()) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4135 { |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4136 return NULL; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4137 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4138 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4139 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4140 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4141 int TryCatchStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4142 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4143 return FALSE; //TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4144 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4145 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4146 int TryCatchStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4147 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4148 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4149 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4150 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4151 int TryCatchStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4152 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4153 assert(body); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4154 int result = body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4155 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4156 int catchresult = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4157 for (size_t i = 0; i < catches->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4158 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4159 Catch *c = (Catch *)catches->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4160 catchresult |= c->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4161 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4162 /* If we're catching Object, then there is no throwing |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4163 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4164 Identifier *id = c->type->toBasetype()->isClassHandle()->ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4165 if (i == 0 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4166 (id == Id::Object || id == Id::Throwable || id == Id::Exception)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4167 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4168 result &= ~BEthrow; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4169 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4170 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4171 return result | catchresult; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4172 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4173 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4174 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4175 void TryCatchStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4176 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4177 buf->writestring("try"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4178 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4179 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4180 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4181 for (size_t i = 0; i < catches->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4182 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4183 Catch *c = (Catch *)catches->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4184 c->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4185 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4186 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4187 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4188 /******************************** Catch ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4189 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4190 Catch::Catch(Loc loc, Type *t, Identifier *id, Statement *handler) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4191 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4192 //printf("Catch(%s, loc = %s)\n", id->toChars(), loc.toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4193 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4194 this->type = t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4195 this->ident = id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4196 this->handler = handler; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4197 var = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4198 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4200 Catch *Catch::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4201 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4202 Catch *c = new Catch(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4203 (type ? type->syntaxCopy() : NULL), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4204 ident, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4205 (handler ? handler->syntaxCopy() : NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4206 return c; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4207 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4208 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4209 void Catch::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4210 { ScopeDsymbol *sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4211 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4212 //printf("Catch::semantic(%s)\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4213 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4214 #ifndef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4215 if (sc->enclosingFinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4216 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4217 /* This is because the _d_local_unwind() gets the stack munged |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4218 * up on this. The workaround is to place any try-catches into |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4219 * a separate function, and call that. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4220 * To fix, have the compiler automatically convert the finally |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4221 * body into a nested function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4222 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4223 error(loc, "cannot put catch statement inside finally block"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4224 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4225 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4226 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4227 sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4228 sym->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4229 sc = sc->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4230 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4231 if (!type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4232 type = new TypeIdentifier(0, Id::Object); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4233 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4234 if (!type->toBasetype()->isClassHandle()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4235 error("can only catch class objects, not '%s'", type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4236 else if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4237 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4238 var = new VarDeclaration(loc, type, ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4239 var->parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4240 sc->insert(var); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4241 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4242 handler = handler->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4243 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4244 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4245 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4246 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4247 int Catch::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4248 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4249 return handler ? handler->blockExit() : BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4250 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4251 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4252 void Catch::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4253 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4254 buf->writestring("catch"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4255 if (type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4256 { buf->writebyte('('); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4257 type->toCBuffer(buf, ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4258 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4259 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4260 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4261 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4262 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4263 if (handler) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4264 handler->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4265 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4266 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4267 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4268 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4269 /****************************** TryFinallyStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4270 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4271 TryFinallyStatement::TryFinallyStatement(Loc loc, Statement *body, Statement *finalbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4272 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4273 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4274 this->body = body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4275 this->finalbody = finalbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4276 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4277 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4278 Statement *TryFinallyStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4279 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4280 TryFinallyStatement *s = new TryFinallyStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4281 body->syntaxCopy(), finalbody->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4282 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4283 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4284 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4285 Statement *TryFinallyStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4286 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4287 //printf("TryFinallyStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4288 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4289 Statement* oldScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4290 sc->enclosingScopeExit = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4291 body = body->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4292 sc->enclosingScopeExit = oldScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4293 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4294 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4295 sc->enclosingFinally = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4296 sc->sbreak = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4297 sc->scontinue = NULL; // no break or continue out of finally block |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4298 finalbody = finalbody->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4299 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4300 if (!body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4301 return finalbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4302 if (!finalbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4303 return body; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4304 if (body->blockExit() == BEfallthru) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4305 { Statement *s = new CompoundStatement(loc, body, finalbody); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4306 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4307 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4308 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4309 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4310 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4311 void TryFinallyStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4312 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4313 buf->printf("try\n{\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4314 body->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4315 buf->printf("}\nfinally\n{\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4316 finalbody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4317 buf->writeByte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4318 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4319 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4320 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4321 int TryFinallyStatement::hasBreak() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4322 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4323 return FALSE; //TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4324 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4325 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4326 int TryFinallyStatement::hasContinue() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4327 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4328 return FALSE; //TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4329 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4330 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4331 int TryFinallyStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4332 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4333 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4334 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4335 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4336 int TryFinallyStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4337 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4338 if (body) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4339 return body->blockExit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4340 return BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4341 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4342 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4343 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4344 /****************************** OnScopeStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4345 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4346 OnScopeStatement::OnScopeStatement(Loc loc, TOK tok, Statement *statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4347 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4348 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4349 this->tok = tok; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4350 this->statement = statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4351 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4352 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4353 Statement *OnScopeStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4354 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4355 OnScopeStatement *s = new OnScopeStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4356 tok, statement->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4357 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4358 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4359 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4360 Statement *OnScopeStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4361 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4362 /* semantic is called on results of scopeCode() */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4363 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4364 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4365 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4366 int OnScopeStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4367 { // At this point, this statement is just an empty placeholder |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4368 return BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4369 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4370 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4371 void OnScopeStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4372 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4373 buf->writestring(Token::toChars(tok)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4374 buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4375 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4376 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4377 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4378 int OnScopeStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4379 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4380 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4381 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4382 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4383 void OnScopeStatement::scopeCode(Scope *sc, Statement **sentry, Statement **sexception, Statement **sfinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4384 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4385 //printf("OnScopeStatement::scopeCode()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4386 //print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4387 *sentry = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4388 *sexception = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4389 *sfinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4390 switch (tok) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4391 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4392 case TOKon_scope_exit: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4393 *sfinally = statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4394 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4395 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4396 case TOKon_scope_failure: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4397 *sexception = statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4398 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4399 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4400 case TOKon_scope_success: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4401 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4402 /* Create: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4403 * sentry: int x = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4404 * sexception: x = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4405 * sfinally: if (!x) statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4406 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4407 Identifier *id = Lexer::uniqueId("__os"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4409 ExpInitializer *ie = new ExpInitializer(loc, new IntegerExp(0)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4410 VarDeclaration *v = new VarDeclaration(loc, Type::tint32, id, ie); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4411 *sentry = new DeclarationStatement(loc, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4412 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4413 Expression *e = new IntegerExp(1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4414 e = new AssignExp(0, new VarExp(0, v), e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4415 *sexception = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4416 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4417 e = new VarExp(0, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4418 e = new NotExp(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4419 *sfinally = new IfStatement(0, NULL, e, statement, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4420 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4421 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4422 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4423 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4424 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4425 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4426 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4427 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4428 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4429 /******************************** ThrowStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4430 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4431 ThrowStatement::ThrowStatement(Loc loc, Expression *exp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4432 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4433 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4434 this->exp = exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4436 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4437 Statement *ThrowStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4438 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4439 ThrowStatement *s = new ThrowStatement(loc, exp->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4440 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4441 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4442 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4443 Statement *ThrowStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4444 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4445 //printf("ThrowStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4446 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4447 FuncDeclaration *fd = sc->parent->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4448 fd->hasReturnExp |= 2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4449 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4450 if (sc->incontract) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4451 error("Throw statements cannot be in contracts"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4452 exp = exp->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4453 exp = resolveProperties(sc, exp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4454 if (!exp->type->toBasetype()->isClassHandle()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4455 error("can only throw class objects, not type %s", exp->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4456 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4457 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4458 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4459 int ThrowStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4460 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4461 return BEthrow; // obviously |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4462 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4463 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4464 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4465 void ThrowStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4466 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4467 buf->printf("throw "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4468 exp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4469 buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4470 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4471 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4472 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4473 /******************************** VolatileStatement **************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4474 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4475 VolatileStatement::VolatileStatement(Loc loc, Statement *statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4476 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4477 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4478 this->statement = statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4479 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4480 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4481 Statement *VolatileStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4482 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4483 VolatileStatement *s = new VolatileStatement(loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4484 statement ? statement->syntaxCopy() : NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4485 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4486 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4487 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4488 Statement *VolatileStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4489 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4490 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4491 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4492 Statement* oldScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4493 sc->enclosingScopeExit = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4494 statement = statement->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4495 sc->enclosingScopeExit = oldScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4496 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4497 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4498 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4499 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4500 Statements *VolatileStatement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4501 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4502 Statements *a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4503 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4504 a = statement ? statement->flatten(sc) : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4505 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4506 { for (int i = 0; i < a->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4507 { Statement *s = (Statement *)a->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4508 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4509 s = new VolatileStatement(loc, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4510 a->data[i] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4511 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4512 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4513 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4514 return a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4515 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4516 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4517 int VolatileStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4518 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4519 return statement ? statement->blockExit() : BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4520 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4521 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4522 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4523 void VolatileStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4524 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4525 buf->writestring("volatile"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4526 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4527 { if (statement->isScopeStatement()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4528 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4529 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4530 buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4531 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4532 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4533 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4534 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4535 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4536 /******************************** GotoStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4537 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4538 GotoStatement::GotoStatement(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4539 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4540 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4541 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4542 this->label = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4543 this->enclosingFinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4544 this->enclosingScopeExit = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4545 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4546 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4547 Statement *GotoStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4548 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4549 GotoStatement *s = new GotoStatement(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4550 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4551 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4552 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4553 Statement *GotoStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4554 { FuncDeclaration *fd = sc->parent->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4555 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4556 //printf("GotoStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4557 enclosingFinally = sc->enclosingFinally; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4558 enclosingScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4559 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4560 label = fd->searchLabel(ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4561 if (!label->statement && sc->fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4562 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4563 /* Either the goto label is forward referenced or it |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4564 * is in the function that the enclosing foreach is in. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4565 * Can't know yet, so wrap the goto in a compound statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4566 * so we can patch it later, and add it to a 'look at this later' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4567 * list. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4568 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4569 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4570 Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4571 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4572 a->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4573 s = new CompoundStatement(loc, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4574 sc->fes->gotos.push(s); // 'look at this later' list |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4575 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4576 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4577 if (label->statement && label->statement->enclosingFinally != sc->enclosingFinally) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4578 error("cannot goto in or out of finally block"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4579 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4580 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4581 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4582 int GotoStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4583 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4584 //printf("GotoStatement::blockExit(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4585 return BEgoto; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4586 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4587 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4588 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4589 void GotoStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4590 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4591 buf->writestring("goto "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4592 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4593 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4594 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4596 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4597 /******************************** LabelStatement ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4598 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4599 LabelStatement::LabelStatement(Loc loc, Identifier *ident, Statement *statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4600 : Statement(loc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4601 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4602 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4603 this->statement = statement; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4604 this->enclosingFinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4605 this->enclosingScopeExit = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4606 this->lblock = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4607 this->isReturnLabel = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4608 this->asmLabel = false; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4609 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4610 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4611 Statement *LabelStatement::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4612 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4613 LabelStatement *s = new LabelStatement(loc, ident, statement->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4614 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4615 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4616 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4617 Statement *LabelStatement::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4618 { LabelDsymbol *ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4619 FuncDeclaration *fd = sc->parent->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4620 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4621 //printf("LabelStatement::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4622 ls = fd->searchLabel(ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4623 if (ls->statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4624 error("Label '%s' already defined", ls->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4625 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4626 ls->statement = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4627 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4628 enclosingFinally = sc->enclosingFinally; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4629 enclosingScopeExit = sc->enclosingScopeExit; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4630 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4631 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4632 sc->scopesym = sc->enclosing->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4633 sc->callSuper |= CSXlabel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4634 sc->slabel = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4635 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4636 statement = statement->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4637 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4638 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4639 // LDC put in labmap |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4640 fd->labmap[ident->toChars()] = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4641 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4642 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4643 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4644 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4645 Statements *LabelStatement::flatten(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4646 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4647 Statements *a = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4648 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4649 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4650 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4651 a = statement->flatten(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4652 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4653 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4654 if (!a->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4655 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4656 a->push(new ExpStatement(loc, NULL)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4657 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4658 Statement *s = (Statement *)a->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4659 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4660 s = new LabelStatement(loc, ident, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4661 a->data[0] = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4662 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4663 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4664 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4665 return a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4666 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4667 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4668 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4669 int LabelStatement::usesEH() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4670 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4671 return statement ? statement->usesEH() : FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4672 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4673 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4674 int LabelStatement::blockExit() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4675 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4676 //printf("LabelStatement::blockExit(%p)\n", this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4677 return statement ? statement->blockExit() : BEfallthru; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4678 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4679 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4680 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4681 int LabelStatement::comeFrom() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4682 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4683 //printf("LabelStatement::comeFrom()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4684 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4685 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4686 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4687 void LabelStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4688 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4689 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4690 buf->writebyte(':'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4691 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4692 if (statement) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4693 statement->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4694 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4695 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4696 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4697 /******************************** LabelDsymbol ***************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4698 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4699 LabelDsymbol::LabelDsymbol(Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4700 : Dsymbol(ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4701 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4702 statement = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4703 #if IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4704 asmLabelNum = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4705 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4706 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4707 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4708 LabelDsymbol *LabelDsymbol::isLabel() // is this a LabelDsymbol()? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4709 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4710 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4711 } |