annotate dmd/interpret.c @ 1587:def7a1d494fd

Merge DMD 1.051
author Christian Kamm <kamm incasoftware de>
date Fri, 06 Nov 2009 23:58:01 +0100
parents 8026319762be
children 8aa756a00228
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2 // Compiler implementation of the D programming language
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
4 // All Rights Reserved
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
5 // written by Walter Bright
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
6 // http://www.digitalmars.com
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
7 // License for redistribution is by either the Artistic License
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
9 // See the included readme.txt for details.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
10
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
11 #include <stdio.h>
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
12 #include <stdlib.h>
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
13 #include <assert.h>
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
14
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 913
diff changeset
15 #include "rmem.h"
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
16
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
17 #include "statement.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
18 #include "expression.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
19 #include "cond.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
20 #include "init.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
21 #include "staticassert.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
22 #include "mtype.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
23 #include "scope.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
24 #include "declaration.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
25 #include "aggregate.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
26 #include "id.h"
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
27
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
28 #define LOG 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
29
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
30 struct InterState
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
31 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
32 InterState *caller; // calling function's InterState
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
33 FuncDeclaration *fd; // function being interpreted
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
34 Dsymbols vars; // variables used in this function
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
35 Statement *start; // if !=NULL, start execution at this statement
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
36 Statement *gotoTarget; // target of EXP_GOTO_INTERPRET result
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
37 Expression *localThis; // value of 'this', or NULL if none
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
38
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
39 InterState();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
40 };
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
41
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
42 InterState::InterState()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
43 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
44 memset(this, 0, sizeof(InterState));
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
45 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
46
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
47 Expression *interpret_aaLen(InterState *istate, Expressions *arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
48 Expression *interpret_aaKeys(InterState *istate, Expressions *arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
49 Expression *interpret_aaValues(InterState *istate, Expressions *arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
50
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
51 /*************************************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
52 * Attempt to interpret a function given the arguments.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
53 * Input:
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
54 * istate state for calling function (NULL if none)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
55 * arguments function arguments
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
56 * thisarg 'this', if a needThis() function, NULL if not.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
57 *
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
58 * Return result expression if successful, NULL if not.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
59 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
60
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
61 Expression *FuncDeclaration::interpret(InterState *istate, Expressions *arguments, Expression *thisarg)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
62 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
63 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
64 printf("\n********\nFuncDeclaration::interpret(istate = %p) %s\n", istate, toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
65 printf("cantInterpret = %d, semanticRun = %d\n", cantInterpret, semanticRun);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
66 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
67 if (global.errors)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
68 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
69 if (ident == Id::aaLen)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
70 return interpret_aaLen(istate, arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
71 else if (ident == Id::aaKeys)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
72 return interpret_aaKeys(istate, arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
73 else if (ident == Id::aaValues)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
74 return interpret_aaValues(istate, arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
75
1367
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
76 if (cantInterpret || semanticRun == 3)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
77 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
78
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
79 if (!fbody)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
80 { cantInterpret = 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
81 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
82 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
83
1367
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
84 if (semanticRun < 3 && scope)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
85 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
86 semantic3(scope);
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 913
diff changeset
87 if (global.errors) // if errors compiling this function
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 913
diff changeset
88 return NULL;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
89 }
1367
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
90 if (semanticRun < 4)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
91 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
92
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
93 Type *tb = type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
94 assert(tb->ty == Tfunction);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
95 TypeFunction *tf = (TypeFunction *)tb;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
96 Type *tret = tf->next->toBasetype();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
97 if (tf->varargs)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
98 { cantInterpret = 1;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
99 error("Variadic functions are not yet implemented in CTFE");
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
100 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
101 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
102
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
103 // Ensure there are no lazy parameters
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
104 if (tf->parameters)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
105 { size_t dim = Argument::dim(tf->parameters);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
106 for (size_t i = 0; i < dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
107 { Argument *arg = Argument::getNth(tf->parameters, i);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
108 if (arg->storageClass & STClazy)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
109 { cantInterpret = 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
110 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
111 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
112 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
113 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
114
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
115 InterState istatex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
116 istatex.caller = istate;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
117 istatex.fd = this;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
118 istatex.localThis = thisarg;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
119
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
120 Expressions vsave; // place to save previous parameter values
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
121 size_t dim = 0;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
122 if (needThis() && !thisarg)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
123 { cantInterpret = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
124 // error, no this. Prevent segfault.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
125 error("need 'this' to access member %s", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
126 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
127 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
128 if (arguments)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
129 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
130 dim = arguments->dim;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
131 assert(!dim || (parameters && (parameters->dim == dim)));
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
132 vsave.setDim(dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
133
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
134 /* Evaluate all the arguments to the function,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
135 * store the results in eargs[]
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
136 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
137 Expressions eargs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
138 eargs.setDim(dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
139
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
140 for (size_t i = 0; i < dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
141 { Expression *earg = (Expression *)arguments->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
142 Argument *arg = Argument::getNth(tf->parameters, i);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
143
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
144 if (arg->storageClass & (STCout | STCref))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
145 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
146 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
147 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
148 { /* Value parameters
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
149 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
150 Type *ta = arg->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
151 if (ta->ty == Tsarray && earg->op == TOKaddress)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
152 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
153 /* Static arrays are passed by a simple pointer.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
154 * Skip past this to get at the actual arg.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
155 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
156 earg = ((AddrExp *)earg)->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
157 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
158 earg = earg->interpret(istate ? istate : &istatex);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
159 if (earg == EXP_CANT_INTERPRET)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
160 { cantInterpret = 1;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
161 return NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
162 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
163 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
164 eargs.data[i] = earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
165 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
166
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
167 for (size_t i = 0; i < dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
168 { Expression *earg = (Expression *)eargs.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
169 Argument *arg = Argument::getNth(tf->parameters, i);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
170 VarDeclaration *v = (VarDeclaration *)parameters->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
171 vsave.data[i] = v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
172 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
173 printf("arg[%d] = %s\n", i, earg->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
174 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
175 if (arg->storageClass & (STCout | STCref) && earg->op==TOKvar)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
176 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
177 /* Bind out or ref parameter to the corresponding
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
178 * variable v2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
179 */
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
180 if (!istate)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
181 { cantInterpret = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
182 error("%s cannot be by passed by reference at compile time", earg->toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
183 return NULL; // can't bind to non-interpreted vars
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
184 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
185 // We need to chase down all of the the passed parameters until
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
186 // we find something that isn't a TOKvar, then create a variable
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
187 // containg that expression.
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
188 VarDeclaration *v2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
189 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
190 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
191 VarExp *ve = (VarExp *)earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
192 v2 = ve->var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
193 if (!v2)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
194 { cantInterpret = 1;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
195 return NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
196 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
197 if (!v2->value || v2->value->op != TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
198 break;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
199 //TODO
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
200 #ifdef IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
201 if (((VarExp *)v2->value)->var->isSymbolDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
202 { // This can happen if v is a struct initialized to
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
203 // 0 using an __initZ SymbolDeclaration from
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
204 // TypeStruct::defaultInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
205 break; // eg default-initialized variable
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
206 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
207 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
208 earg = v2->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
209 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
210
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
211 v->value = new VarExp(earg->loc, v2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
212
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
213 /* Don't restore the value of v2 upon function return
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
214 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
215 assert(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
216 for (size_t i = 0; i < istate->vars.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
217 { VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
218 if (v == v2)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
219 { istate->vars.data[i] = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
220 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
221 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
222 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
223 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
224 else
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
225 { // Value parameters and non-trivial references
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
226 v->value = earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
227 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
228 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
229 printf("interpreted arg[%d] = %s\n", i, earg->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
230 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
231 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
232 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
233 // Don't restore the value of 'this' upon function return
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
234 if (needThis() && thisarg->op==TOKvar) {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
235 VarDeclaration *thisvar = ((VarExp *)(thisarg))->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
236 for (size_t i = 0; i < istate->vars.dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
237 { VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
238 if (v == thisvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
239 { istate->vars.data[i] = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
240 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
241 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
242 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
243 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
244
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
245 /* Save the values of the local variables used
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
246 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
247 Expressions valueSaves;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
248 if (istate && !isNested())
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
249 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
250 //printf("saving local variables...\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
251 valueSaves.setDim(istate->vars.dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
252 for (size_t i = 0; i < istate->vars.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
253 { VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
254 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
255 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
256 //printf("\tsaving [%d] %s = %s\n", i, v->toChars(), v->value ? v->value->toChars() : "");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
257 valueSaves.data[i] = v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
258 v->value = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
259 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
260 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
261 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
262
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
263 Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
264 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
265 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
266 e = fbody->interpret(&istatex);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
267 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
268 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
269 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
270 printf("function body failed to interpret\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
271 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
272 e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
273 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
274
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
275 /* This is how we deal with a recursive statement AST
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
276 * that has arbitrary goto statements in it.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
277 * Bubble up a 'result' which is the target of the goto
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
278 * statement, then go recursively down the AST looking
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
279 * for that statement, then execute starting there.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
280 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
281 if (e == EXP_GOTO_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
282 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
283 istatex.start = istatex.gotoTarget; // set starting statement
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
284 istatex.gotoTarget = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
285 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
286 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
287 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
288 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
289 /* Restore the parameter values
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
290 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
291 for (size_t i = 0; i < dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
292 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
293 VarDeclaration *v = (VarDeclaration *)parameters->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
294 v->value = (Expression *)vsave.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
295 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
296
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
297 if (istate && !isNested())
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
298 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
299 /* Restore the variable values
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
300 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
301 //printf("restoring local variables...\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
302 for (size_t i = 0; i < istate->vars.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
303 { VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
304 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
305 { v->value = (Expression *)valueSaves.data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
306 //printf("\trestoring [%d] %s = %s\n", i, v->toChars(), v->value ? v->value->toChars() : "");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
307 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
308 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
309 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
310 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
311 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
312
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
313 /******************************** Statement ***************************/
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
314
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
315 #define START() \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
316 if (istate->start) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
317 { if (istate->start != this) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
318 return NULL; \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
319 istate->start = NULL; \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
320 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
321
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
322 /***********************************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
323 * Interpret the statement.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
324 * Returns:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
325 * NULL continue to next statement
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
326 * EXP_CANT_INTERPRET cannot interpret statement at compile time
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
327 * !NULL expression from return statement
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
328 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
329
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
330 Expression *Statement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
331 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
332 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
333 printf("Statement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
334 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
335 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
336 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
337 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
338
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
339 Expression *ExpStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
340 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
341 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
342 printf("ExpStatement::interpret(%s)\n", exp ? exp->toChars() : "");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
343 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
344 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
345 if (exp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
346 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
347 Expression *e = exp->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
348 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
349 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
350 //printf("-ExpStatement::interpret(): %p\n", e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
351 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
352 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
353 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
354 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
355 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
356
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
357 Expression *CompoundStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
358 { Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
359
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
360 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
361 printf("CompoundStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
362 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
363 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
364 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
365 if (statements)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
366 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
367 for (size_t i = 0; i < statements->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
368 { Statement *s = (Statement *)statements->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
369
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
370 if (s)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
371 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
372 e = s->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
373 if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
374 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
375 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
376 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
377 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
378 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
379 printf("-CompoundStatement::interpret() %p\n", e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
380 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
381 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
382 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
383
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
384 Expression *UnrolledLoopStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
385 { Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
386
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
387 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
388 printf("UnrolledLoopStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
389 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
390 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
391 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
392 if (statements)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
393 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
394 for (size_t i = 0; i < statements->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
395 { Statement *s = (Statement *)statements->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
396
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
397 e = s->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
398 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
399 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
400 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
401 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
402 continue;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
403 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
404 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
405 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
406 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
407 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
408 if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
409 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
410 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
411 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
412 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
413 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
414
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
415 Expression *IfStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
416 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
417 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
418 printf("IfStatement::interpret(%s)\n", condition->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
419 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
420
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
421 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
422 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
423 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
424 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
425 Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
426 if (ifbody)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
427 e = ifbody->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
428 if (istate->start && elsebody)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
429 e = elsebody->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
430 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
431 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
432
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
433 Expression *e = condition->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
434 assert(e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
435 //if (e == EXP_CANT_INTERPRET) printf("cannot interpret\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
436 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
437 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
438 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
439 e = ifbody ? ifbody->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
440 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
441 e = elsebody ? elsebody->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
442 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
443 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
444 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
445 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
446 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
447 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
448 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
449
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
450 Expression *ScopeStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
451 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
452 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
453 printf("ScopeStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
454 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
455 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
456 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
457 return statement ? statement->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
458 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
459
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
460 Expression *ReturnStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
461 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
462 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
463 printf("ReturnStatement::interpret(%s)\n", exp ? exp->toChars() : "");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
464 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
465 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
466 if (!exp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
467 return EXP_VOID_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
468 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
469 Expression *e = exp->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
470 printf("e = %p\n", e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
471 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
472 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
473 return exp->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
474 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
475 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
476
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
477 Expression *BreakStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
478 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
479 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
480 printf("BreakStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
481 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
482 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
483 if (ident)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
484 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
485 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
486 return EXP_BREAK_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
487 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
488
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
489 Expression *ContinueStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
490 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
491 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
492 printf("ContinueStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
493 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
494 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
495 if (ident)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
496 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
497 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
498 return EXP_CONTINUE_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
499 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
500
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
501 Expression *WhileStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
502 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
503 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
504 printf("WhileStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
505 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
506 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
507 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
508 Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
509
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
510 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
511 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
512 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
513 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
514 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
515 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
516 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
517 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
518 return NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
519 if (e && e != EXP_CONTINUE_INTERPRET)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
520 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
521 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
522
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
523 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
524 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
525 e = condition->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
526 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
527 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
528 if (!e->isConst())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
529 { e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
530 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
531 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
532 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
533 { e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
534 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
535 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
536 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
537 continue;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
538 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
539 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
540 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
541 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
542 if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
543 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
544 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
545 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
546 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
547 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
548 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
549 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
550 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
551 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
552 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
553 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
554
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
555 Expression *DoStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
556 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
557 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
558 printf("DoStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
559 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
560 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
561 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
562 Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
563
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
564 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
565 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
566 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
567 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
568 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
569 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
570 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
571 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
572 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
573 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
574 goto Lcontinue;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
575 if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
576 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
577 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
578
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
579 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
580 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
581 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
582 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
583 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
584 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
585 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
586 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
587 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
588 if (e && e != EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
589 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
590
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
591 Lcontinue:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
592 e = condition->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
593 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
594 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
595 if (!e->isConst())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
596 { e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
597 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
598 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
599 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
600 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
601 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
602 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
603 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
604 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
605 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
606 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
607 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
608 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
609 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
610 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
611
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
612 Expression *ForStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
613 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
614 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
615 printf("ForStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
616 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
617 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
618 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
619 Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
620
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
621 if (init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
622 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
623 e = init->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
624 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
625 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
626 assert(!e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
627 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
628
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
629 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
630 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
631 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
632 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
633 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
634 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
635 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
636 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
637 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
638 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
639 goto Lcontinue;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
640 if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
641 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
642 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
643
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
644 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
645 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
646 if (!condition)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
647 goto Lhead;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
648 e = condition->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
649 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
650 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
651 if (!e->isConst())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
652 { e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
653 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
654 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
655 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
656 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
657 Lhead:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
658 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
659 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
660 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
661 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
662 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
663 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
664 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
665 if (e && e != EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
666 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
667 Lcontinue:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
668 if (increment)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
669 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
670 e = increment->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
671 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
672 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
673 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
674 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
675 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
676 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
677 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
678 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
679 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
680 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
681 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
682 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
683 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
684
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
685 Expression *ForeachStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
686 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
687 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
688 printf("ForeachStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
689 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
690 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
691 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
692 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
693 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
694
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
695 Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
696 Expression *eaggr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
697
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
698 if (value->isOut() || value->isRef())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
699 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
700
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
701 eaggr = aggr->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
702 if (eaggr == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
703 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
704
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
705 Expression *dim = ArrayLength(Type::tsize_t, eaggr);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
706 if (dim == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
707 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
708
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
709 Expression *keysave = key ? key->value : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
710 Expression *valuesave = value->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
711
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
712 uinteger_t d = dim->toUInteger();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
713 uinteger_t index;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
714
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
715 if (op == TOKforeach)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
716 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
717 for (index = 0; index < d; index++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
718 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
719 Expression *ekey = new IntegerExp(loc, index, Type::tsize_t);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
720 if (key)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
721 key->value = ekey;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
722 e = Index(value->type, eaggr, ekey);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
723 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
724 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
725 value->value = e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
726
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
727 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
728 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
729 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
730 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
731 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
732 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
733 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
734 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
735 e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
736 else if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
737 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
738 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
739 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
740 else // TOKforeach_reverse
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
741 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
742 for (index = d; index-- != 0;)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
743 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
744 Expression *ekey = new IntegerExp(loc, index, Type::tsize_t);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
745 if (key)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
746 key->value = ekey;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
747 e = Index(value->type, eaggr, ekey);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
748 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
749 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
750 value->value = e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
751
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
752 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
753 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
754 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
755 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
756 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
757 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
758 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
759 if (e == EXP_CONTINUE_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
760 e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
761 else if (e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
762 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
763 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
764 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
765 value->value = valuesave;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
766 if (key)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
767 key->value = keysave;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
768 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
769 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
770
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
771 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
772 Expression *ForeachRangeStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
773 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
774 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
775 printf("ForeachRangeStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
776 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
777 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
778 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
779 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
780 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
781
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
782 Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
783 Expression *elwr = lwr->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
784 if (elwr == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
785 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
786
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
787 Expression *eupr = upr->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
788 if (eupr == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
789 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
790
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
791 Expression *keysave = key->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
792
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
793 if (op == TOKforeach)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
794 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
795 key->value = elwr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
796
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
797 while (1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
798 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
799 e = Cmp(TOKlt, key->value->type, key->value, eupr);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
800 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
801 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
802 if (e->isBool(TRUE) == FALSE)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
803 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
804 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
805 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
806
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
807 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
808 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
809 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
810 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
811 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
812 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
813 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
814 if (e == NULL || e == EXP_CONTINUE_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
815 { e = Add(key->value->type, key->value, new IntegerExp(loc, 1, key->value->type));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
816 if (e == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
817 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
818 key->value = e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
819 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
820 else
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
821 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
822 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
823 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
824 else // TOKforeach_reverse
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
825 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
826 key->value = eupr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
827
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
828 do
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
829 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
830 e = Cmp(TOKgt, key->value->type, key->value, elwr);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
831 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
832 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
833 if (e->isBool(TRUE) == FALSE)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
834 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
835 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
836 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
837
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
838 e = Min(key->value->type, key->value, new IntegerExp(loc, 1, key->value->type));
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
839 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
840 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
841 key->value = e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
842
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
843 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
844 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
845 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
846 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
847 { e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
848 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
849 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
850 } while (e == NULL || e == EXP_CONTINUE_INTERPRET);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
851 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
852 key->value = keysave;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
853 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
854 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
855 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
856
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
857 Expression *SwitchStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
858 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
859 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
860 printf("SwitchStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
861 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
862 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
863 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
864 Expression *e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
865
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
866 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
867 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
868 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
869 if (istate->start)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
870 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
871 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
872 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
873 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
874 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
875 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
876 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
877
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
878
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
879 Expression *econdition = condition->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
880 if (econdition == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
881 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
882
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
883 Statement *s = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
884 if (cases)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
885 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
886 for (size_t i = 0; i < cases->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
887 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
888 CaseStatement *cs = (CaseStatement *)cases->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
889 e = Equal(TOKequal, Type::tint32, econdition, cs->exp);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
890 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
891 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
892 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
893 { s = cs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
894 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
895 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
896 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
897 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
898 if (!s)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
899 { if (hasNoDefault)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
900 error("no default or case for %s in switch statement", econdition->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
901 s = sdefault;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
902 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
903
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
904 assert(s);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
905 istate->start = s;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
906 e = body ? body->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
907 assert(!istate->start);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
908 if (e == EXP_BREAK_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
909 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
910 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
911 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
912
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
913 Expression *CaseStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
914 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
915 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
916 printf("CaseStatement::interpret(%s) this = %p\n", exp->toChars(), this);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
917 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
918 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
919 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
920 if (statement)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
921 return statement->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
922 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
923 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
924 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
925
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
926 Expression *DefaultStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
927 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
928 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
929 printf("DefaultStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
930 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
931 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
932 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
933 if (statement)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
934 return statement->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
935 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
936 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
937 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
938
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
939 Expression *GotoStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
940 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
941 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
942 printf("GotoStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
943 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
944 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
945 assert(label && label->statement);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
946 istate->gotoTarget = label->statement;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
947 return EXP_GOTO_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
948 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
949
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
950 Expression *GotoCaseStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
951 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
952 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
953 printf("GotoCaseStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
954 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
955 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
956 assert(cs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
957 istate->gotoTarget = cs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
958 return EXP_GOTO_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
959 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
960
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
961 Expression *GotoDefaultStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
962 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
963 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
964 printf("GotoDefaultStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
965 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
966 START()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
967 assert(sw && sw->sdefault);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
968 istate->gotoTarget = sw->sdefault;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
969 return EXP_GOTO_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
970 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
971
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
972 Expression *LabelStatement::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
973 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
974 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
975 printf("LabelStatement::interpret()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
976 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
977 if (istate->start == this)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
978 istate->start = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
979 return statement ? statement->interpret(istate) : NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
980 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
981
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
982 /******************************** Expression ***************************/
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
983
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
984 Expression *Expression::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
985 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
986 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
987 printf("Expression::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
988 printf("type = %s\n", type->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
989 dump(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
990 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
991 error("Cannot interpret %s at compile time", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
992 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
993 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
994
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
995 Expression *ThisExp::interpret(InterState *istate)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
996 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
997 if (istate->localThis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
998 return istate->localThis->interpret(istate);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
999 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1000 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1001
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1002 Expression *NullExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1003 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1004 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1005 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1006
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1007 Expression *IntegerExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1008 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1009 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1010 printf("IntegerExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1011 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1012 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1013 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1014
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1015 Expression *RealExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1016 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1017 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1018 printf("RealExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1019 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1020 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1021 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1022
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1023 Expression *ComplexExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1024 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1025 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1026 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1027
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1028 Expression *StringExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1029 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1030 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1031 printf("StringExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1032 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1033 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1034 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1035
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1036 Expression *getVarExp(Loc loc, InterState *istate, Declaration *d)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1037 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1038 Expression *e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1039 VarDeclaration *v = d->isVarDeclaration();
913
29c0d1194033 Fix #198 and #199 by making CTFE on static struct initializers work.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1040 StaticStructInitDeclaration *s = d->isStaticStructInitDeclaration();
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1041 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1042 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1043 #if DMDV2
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1044 if ((v->isConst() || v->isInvariant() || v->storage_class & STCmanifest) && v->init && !v->value)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1045 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1046 if (v->isConst() && v->init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1047 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1048 { e = v->init->toExpression();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1049 if (e && !e->type)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1050 e->type = v->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1051 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1052 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1053 { e = v->value;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1054 if (v->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1055 { error(loc, "static variable %s cannot be read at compile time", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1056 e = EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1057 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1058 else if (!e)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1059 error(loc, "variable %s is used before initialization", v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1060 else if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1061 e = e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1062 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1063 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1064 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1065 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1066 else if (s)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1067 {
913
29c0d1194033 Fix #198 and #199 by making CTFE on static struct initializers work.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1068 Expressions *exps = new Expressions();
29c0d1194033 Fix #198 and #199 by making CTFE on static struct initializers work.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1069 e = new StructLiteralExp(0, s->dsym, exps);
29c0d1194033 Fix #198 and #199 by making CTFE on static struct initializers work.
Christian Kamm <kamm incasoftware de>
parents: 875
diff changeset
1070 e = e->semantic(NULL);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1071 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1072 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1073 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1074
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1075 Expression *VarExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1076 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1077 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1078 printf("VarExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1079 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1080 return getVarExp(loc, istate, var);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1081 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1082
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1083 Expression *DeclarationExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1084 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1085 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1086 printf("DeclarationExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1087 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1088 Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1089 VarDeclaration *v = declaration->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1090 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1091 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1092 Dsymbol *s = v->toAlias();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1093 if (s == v && !v->isStatic() && v->init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1094 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1095 ExpInitializer *ie = v->init->isExpInitializer();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1096 if (ie)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1097 e = ie->exp->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1098 else if (v->init->isVoidInitializer())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1099 e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1100 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1101 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1102 else if (s == v && (v->isConst() || v->isInvariant()) && v->init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1103 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1104 else if (s == v && v->isConst() && v->init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1105 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1106 { e = v->init->toExpression();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1107 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1108 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1109 else if (!e->type)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1110 e->type = v->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1111 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1112 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1113 else if (declaration->isAttribDeclaration() ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1114 declaration->isTemplateMixin() ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1115 declaration->isTupleDeclaration())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1116 { // These can be made to work, too lazy now
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1117 error("Declaration %s is not yet implemented in CTFE", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1118
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1119 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1120 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1121 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1122 { // Others should not contain executable code, so are trivial to evaluate
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1123 e = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1124 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1125 #if LOG
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1126 printf("-DeclarationExp::interpret(%s): %p\n", toChars(), e);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1127 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1128 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1129 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1130
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1131 Expression *TupleExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1132 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1133 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1134 printf("TupleExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1135 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1136 Expressions *expsx = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1137
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1138 for (size_t i = 0; i < exps->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1139 { Expression *e = (Expression *)exps->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1140 Expression *ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1141
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1142 ex = e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1143 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1144 { delete expsx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1145 return ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1146 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1147
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1148 /* If any changes, do Copy On Write
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1149 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1150 if (ex != e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1151 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1152 if (!expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1153 { expsx = new Expressions();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1154 expsx->setDim(exps->dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1155 for (size_t j = 0; j < i; j++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1156 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1157 expsx->data[j] = exps->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1158 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1159 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1160 expsx->data[i] = (void *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1161 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1162 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1163 if (expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1164 { TupleExp *te = new TupleExp(loc, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1165 expandTuples(te->exps);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1166 te->type = new TypeTuple(te->exps);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1167 return te;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1168 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1169 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1170 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1171
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1172 Expression *ArrayLiteralExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1173 { Expressions *expsx = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1174
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1175 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1176 printf("ArrayLiteralExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1177 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1178 if (elements)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1179 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1180 for (size_t i = 0; i < elements->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1181 { Expression *e = (Expression *)elements->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1182 Expression *ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1183
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1184 ex = e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1185 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1186 { delete expsx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1187 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1188 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1189
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1190 /* If any changes, do Copy On Write
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1191 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1192 if (ex != e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1193 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1194 if (!expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1195 { expsx = new Expressions();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1196 expsx->setDim(elements->dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1197 for (size_t j = 0; j < elements->dim; j++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1198 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1199 expsx->data[j] = elements->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1200 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1201 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1202 expsx->data[i] = (void *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1203 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1204 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1205 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1206 if (elements && expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1207 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1208 expandTuples(expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1209 if (expsx->dim != elements->dim)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1210 { delete expsx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1211 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1212 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1213 ArrayLiteralExp *ae = new ArrayLiteralExp(loc, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1214 ae->type = type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1215 return ae;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1216 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1217 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1218 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1219
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1220 Expression *AssocArrayLiteralExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1221 { Expressions *keysx = keys;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1222 Expressions *valuesx = values;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1223
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1224 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1225 printf("AssocArrayLiteralExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1226 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1227 for (size_t i = 0; i < keys->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1228 { Expression *ekey = (Expression *)keys->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1229 Expression *evalue = (Expression *)values->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1230 Expression *ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1231
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1232 ex = ekey->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1233 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1234 goto Lerr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1235
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1236 /* If any changes, do Copy On Write
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1237 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1238 if (ex != ekey)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1239 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1240 if (keysx == keys)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1241 keysx = (Expressions *)keys->copy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1242 keysx->data[i] = (void *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1243 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1244
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1245 ex = evalue->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1246 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1247 goto Lerr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1248
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1249 /* If any changes, do Copy On Write
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1250 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1251 if (ex != evalue)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1252 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1253 if (valuesx == values)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1254 valuesx = (Expressions *)values->copy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1255 valuesx->data[i] = (void *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1256 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1257 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1258 if (keysx != keys)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1259 expandTuples(keysx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1260 if (valuesx != values)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1261 expandTuples(valuesx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1262 if (keysx->dim != valuesx->dim)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1263 goto Lerr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1264
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1265 /* Remove duplicate keys
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1266 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1267 for (size_t i = 1; i < keysx->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1268 { Expression *ekey = (Expression *)keysx->data[i - 1];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1269
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1270 for (size_t j = i; j < keysx->dim; j++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1271 { Expression *ekey2 = (Expression *)keysx->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1272 Expression *ex = Equal(TOKequal, Type::tbool, ekey, ekey2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1273 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1274 goto Lerr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1275 if (ex->isBool(TRUE)) // if a match
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1276 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1277 // Remove ekey
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1278 if (keysx == keys)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1279 keysx = (Expressions *)keys->copy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1280 if (valuesx == values)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1281 valuesx = (Expressions *)values->copy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1282 keysx->remove(i - 1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1283 valuesx->remove(i - 1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1284 i -= 1; // redo the i'th iteration
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1285 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1286 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1287 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1288 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1289
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1290 if (keysx != keys || valuesx != values)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1291 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1292 AssocArrayLiteralExp *ae;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1293 ae = new AssocArrayLiteralExp(loc, keysx, valuesx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1294 ae->type = type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1295 return ae;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1296 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1297 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1298
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1299 Lerr:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1300 if (keysx != keys)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1301 delete keysx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1302 if (valuesx != values)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1303 delete values;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1304 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1305 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1306
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1307 Expression *StructLiteralExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1308 { Expressions *expsx = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1309
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1310 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1311 printf("StructLiteralExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1312 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1313 /* We don't know how to deal with overlapping fields
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1314 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1315 if (sd->hasUnions)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1316 { error("Unions with overlapping fields are not yet supported in CTFE");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1317 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1318 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1319
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1320 if (elements)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1321 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1322 for (size_t i = 0; i < elements->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1323 { Expression *e = (Expression *)elements->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1324 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1325 continue;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1326
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1327 Expression *ex = e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1328 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1329 { delete expsx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1330 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1331 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1332
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1333 /* If any changes, do Copy On Write
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1334 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1335 if (ex != e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1336 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1337 if (!expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1338 { expsx = new Expressions();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1339 expsx->setDim(elements->dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1340 for (size_t j = 0; j < elements->dim; j++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1341 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1342 expsx->data[j] = elements->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1343 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1344 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1345 expsx->data[i] = (void *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1346 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1347 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1348 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1349 if (elements && expsx)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1350 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1351 expandTuples(expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1352 if (expsx->dim != elements->dim)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1353 { delete expsx;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1354 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1355 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1356 StructLiteralExp *se = new StructLiteralExp(loc, sd, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1357 se->type = type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1358 return se;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1359 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1360 return this;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1361 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1362
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1363 Expression *UnaExp::interpretCommon(InterState *istate, Expression *(*fp)(Type *, Expression *))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1364 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1365 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1366
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1367 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1368 printf("UnaExp::interpretCommon() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1369 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1370 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1371 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1372 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1373 if (e1->isConst() != 1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1374 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1375
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1376 e = (*fp)(type, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1377 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1378
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1379 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1380 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1381 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1382
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1383 #define UNA_INTERPRET(op) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1384 Expression *op##Exp::interpret(InterState *istate) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1385 { \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1386 return interpretCommon(istate, &op); \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1387 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1388
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1389 UNA_INTERPRET(Neg)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1390 UNA_INTERPRET(Com)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1391 UNA_INTERPRET(Not)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1392 UNA_INTERPRET(Bool)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1393
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1394
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1395 typedef Expression *(*fp_t)(Type *, Expression *, Expression *);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1396
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1397 Expression *BinExp::interpretCommon(InterState *istate, fp_t fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1398 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1399 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1400 Expression *e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1401
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1402 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1403 printf("BinExp::interpretCommon() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1404 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1405 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1406 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1407 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1408 if (e1->isConst() != 1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1409 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1410
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1411 e2 = this->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1412 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1413 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1414 if (e2->isConst() != 1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1415 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1416
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1417 e = (*fp)(type, e1, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1418 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1419
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1420 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1421 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1422 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1423
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1424 #define BIN_INTERPRET(op) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1425 Expression *op##Exp::interpret(InterState *istate) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1426 { \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1427 return interpretCommon(istate, &op); \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1428 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1429
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1430 BIN_INTERPRET(Add)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1431 BIN_INTERPRET(Min)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1432 BIN_INTERPRET(Mul)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1433 BIN_INTERPRET(Div)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1434 BIN_INTERPRET(Mod)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1435 BIN_INTERPRET(Shl)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1436 BIN_INTERPRET(Shr)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1437 BIN_INTERPRET(Ushr)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1438 BIN_INTERPRET(And)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1439 BIN_INTERPRET(Or)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1440 BIN_INTERPRET(Xor)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1441
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1442
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1443 typedef Expression *(*fp2_t)(enum TOK, Type *, Expression *, Expression *);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1444
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1445 Expression *BinExp::interpretCommon2(InterState *istate, fp2_t fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1446 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1447 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1448 Expression *e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1449
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1450 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1451 printf("BinExp::interpretCommon2() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1452 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1453 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1454 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1455 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1456 if (e1->isConst() != 1 &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1457 e1->op != TOKnull &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1458 e1->op != TOKstring &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1459 e1->op != TOKarrayliteral &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1460 e1->op != TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1461 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1462
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1463 e2 = this->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1464 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1465 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1466 if (e2->isConst() != 1 &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1467 e2->op != TOKnull &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1468 e2->op != TOKstring &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1469 e2->op != TOKarrayliteral &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1470 e2->op != TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1471 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1472
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1473 e = (*fp)(op, type, e1, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1474 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1475
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1476 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1477 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1478 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1479
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1480 #define BIN_INTERPRET2(op) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1481 Expression *op##Exp::interpret(InterState *istate) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1482 { \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1483 return interpretCommon2(istate, &op); \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1484 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1485
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1486 BIN_INTERPRET2(Equal)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1487 BIN_INTERPRET2(Identity)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1488 BIN_INTERPRET2(Cmp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1489
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1490 /* Helper functions for BinExp::interpretAssignCommon
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1491 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1492
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1493 /***************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1494 * Duplicate the elements array, then set field 'indexToChange' = newelem.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1495 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1496 Expressions *changeOneElement(Expressions *oldelems, size_t indexToChange, void *newelem)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1497 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1498 Expressions *expsx = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1499 expsx->setDim(oldelems->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1500 for (size_t j = 0; j < expsx->dim; j++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1501 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1502 if (j == indexToChange)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1503 expsx->data[j] = newelem;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1504 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1505 expsx->data[j] = oldelems->data[j];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1506 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1507 return expsx;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1508 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1509
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1510 /***************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1511 * Returns oldelems[0..insertpoint] ~ newelems ~ oldelems[insertpoint..$]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1512 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1513 Expressions *spliceElements(Expressions *oldelems,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1514 Expressions *newelems, size_t insertpoint)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1515 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1516 Expressions *expsx = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1517 expsx->setDim(oldelems->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1518 for (size_t j = 0; j < expsx->dim; j++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1519 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1520 if (j >= insertpoint && j < insertpoint + newelems->dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1521 expsx->data[j] = newelems->data[j - insertpoint];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1522 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1523 expsx->data[j] = oldelems->data[j];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1524 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1525 return expsx;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1526 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1527
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1528 /******************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1529 * Create an array literal consisting of 'elem' duplicated 'dim' times.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1530 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1531 ArrayLiteralExp *createBlockDuplicatedArrayLiteral(Type *type,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1532 Expression *elem, size_t dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1533 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1534 Expressions *elements = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1535 elements->setDim(dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1536 for (size_t i = 0; i < dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1537 elements->data[i] = elem;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1538 ArrayLiteralExp *ae = new ArrayLiteralExp(0, elements);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1539 ae->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1540 return ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1541 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1542
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1543
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1544 /********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1545 * Necessary because defaultInit() for a struct is a VarExp, not a StructLiteralExp.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1546 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1547 StructLiteralExp *createDefaultInitStructLiteral(Loc loc, StructDeclaration *sym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1548 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1549 Expressions *structelems = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1550 structelems->setDim(sym->fields.dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1551 for (size_t j = 0; j < structelems->dim; j++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1552 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1553 structelems->data[j] = ((VarDeclaration *)(sym->fields.data[j]))->type->defaultInit();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1554 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1555 StructLiteralExp *structinit = new StructLiteralExp(loc, sym, structelems);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1556 // Why doesn't the StructLiteralExp constructor do this, when
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1557 // sym->type != NULL ?
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1558 structinit->type = sym->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1559 return structinit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1560 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1561
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1562 /********************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1563 * Add v to the istate list, unless it already exists there.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1564 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1565 void addVarToInterstate(InterState *istate, VarDeclaration *v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1566 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1567 if (!v->isParameter())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1568 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1569 for (size_t i = 0; 1; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1570 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1571 if (i == istate->vars.dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1572 { istate->vars.push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1573 //printf("\tadding %s to istate\n", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1574 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1575 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1576 if (v == (VarDeclaration *)istate->vars.data[i])
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1577 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1578 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1579 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1580 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1581
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1582 Expression *BinExp::interpretAssignCommon(InterState *istate, fp_t fp, int post)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1583 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1584 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1585 printf("BinExp::interpretAssignCommon() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1586 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1587 Expression *e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1588 Expression *e1 = this->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1589
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1590 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1591 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1592 if (e1->op == TOKcast)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1593 { CastExp *ce = (CastExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1594 e1 = ce->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1595 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1596 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1597 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1598 return e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1599 Expression *e2 = this->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1600 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1601 return e2;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1602
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1603 // Chase down rebinding of out and ref.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1604 if (e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1605 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1606 VarExp *ve = (VarExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1607 VarDeclaration *v = ve->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1608 if (v && v->value && v->value->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1609 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1610 VarExp *ve2 = (VarExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1611 //TODO
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1612 #ifdef IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1613 if (ve2->var->isSymbolDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1614 { // This can happen if v is a struct initialized to
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1615 // 0 using an __initZ SymbolDeclaration from
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1616 // TypeStruct::defaultInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1617 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1618 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1619 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1620 e1 = v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1621 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1622 else if (v && v->value && (v->value->op==TOKindex || v->value->op == TOKdotvar))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1623 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1624 // It is no longer be a TOKvar, eg when a[4] is passed by ref.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1625 e1 = v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1626 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1627 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1628
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1629 // To reduce code complexity of handling dotvar expressions,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1630 // extract the aggregate now.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1631 Expression *aggregate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1632 if (e1->op == TOKdotvar) {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1633 aggregate = ((DotVarExp *)e1)->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1634 // Get rid of 'this'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1635 if (aggregate->op == TOKthis && istate->localThis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1636 aggregate = istate->localThis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1637 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1638
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1639 /* Assignment to variable of the form:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1640 * v = e2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1641 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1642 if (e1->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1643 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1644 VarExp *ve = (VarExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1645 VarDeclaration *v = ve->var->isVarDeclaration();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1646 assert(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1647 if (v && v->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1648 { // Can't modify global or static data
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1649 error("%s cannot be modified at compile time", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1650 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1651 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1652 if (v && !v->isDataseg())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1653 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1654 Expression *ev = v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1655 if (fp && !ev)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1656 { error("variable %s is used before initialization", v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1657 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1658 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1659 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1660 e2 = (*fp)(v->type, ev, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1661 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1662 { /* Look for special case of struct being initialized with 0.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1663 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1664 if (v->type->toBasetype()->ty == Tstruct && e2->op == TOKint64)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1665 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1666 e2 = v->type->defaultInit();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1667 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1668 e2 = Cast(v->type, v->type, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1669 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1670 if (e2 == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1671 return e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1672
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1673 addVarToInterstate(istate, v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1674 v->value = e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1675 e = Cast(type, type, post ? ev : e2);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1676 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1677 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1678 else if (e1->op == TOKdotvar && aggregate->op == TOKdotvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1679 { // eg v.u.var = e2, v[3].u.var = e2, etc.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1680 error("Nested struct assignment %s is not yet supported in CTFE", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1681 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1682 /* Assignment to struct member of the form:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1683 * v.var = e2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1684 */
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1685 else if (e1->op == TOKdotvar && aggregate->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1686 { VarDeclaration *v = ((VarExp *)aggregate)->var->isVarDeclaration();
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1687
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1688 if (v->isDataseg())
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1689 { // Can't modify global or static data
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1690 error("%s cannot be modified at compile time", v->toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1691 return EXP_CANT_INTERPRET;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1692 } else {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1693 // Chase down rebinding of out and ref
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1694 if (v->value && v->value->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1695 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1696 VarExp *ve2 = (VarExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1697 //TODO
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1698 #ifdef IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1699 if (ve2->var->isSymbolDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1700 { // This can happen if v is a struct initialized to
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1701 // 0 using an __initZ SymbolDeclaration from
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1702 // TypeStruct::defaultInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1703 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1704 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1705 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1706 v = ve2->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1707 assert(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1708 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1709 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1710 if (fp && !v->value)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1711 { error("variable %s is used before initialization", v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1712 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1713 }
1367
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1714 if (v->value == NULL && v->init->isVoidInitializer())
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1715 { /* Since a void initializer initializes to undefined
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1716 * values, it is valid here to use the default initializer.
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1717 * No attempt is made to determine if someone actually relies
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1718 * on the void value - to do that we'd need a VoidExp.
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1719 * That's probably a good enhancement idea.
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1720 */
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1721 v->value = v->type->defaultInit();
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1334
diff changeset
1722 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1723 Expression *vie = v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1724 if (vie->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1725 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1726 Declaration *d = ((VarExp *)vie)->var;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1727 vie = getVarExp(e1->loc, istate, d);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1728 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1729 if (vie->op != TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1730 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1731 StructLiteralExp *se = (StructLiteralExp *)vie;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1732 VarDeclaration *vf = ((DotVarExp *)e1)->var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1733 if (!vf)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1734 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1735 int fieldi = se->getFieldIndex(type, vf->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1736 if (fieldi == -1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1737 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1738 Expression *ev = se->getField(type, vf->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1739 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1740 e2 = (*fp)(type, ev, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1741 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1742 e2 = Cast(type, type, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1743 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1744 return e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1745
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1746 addVarToInterstate(istate, v);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1747
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1748 /* Create new struct literal reflecting updated fieldi
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1749 */
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1750 Expressions *expsx = changeOneElement(se->elements, fieldi, e2);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1751 v->value = new StructLiteralExp(se->loc, se->sd, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1752 v->value->type = se->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1753
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1754 e = Cast(type, type, post ? ev : e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1755 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1756 /* Assignment to struct member of the form:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1757 * *(symoffexp) = e2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1758 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1759 else if (e1->op == TOKstar && ((PtrExp *)e1)->e1->op == TOKsymoff)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1760 { SymOffExp *soe = (SymOffExp *)((PtrExp *)e1)->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1761 VarDeclaration *v = soe->var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1762
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1763 if (v->isDataseg())
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1764 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1765 error("%s cannot be modified at compile time", v->toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1766 return EXP_CANT_INTERPRET;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1767 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1768 if (fp && !v->value)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1769 { error("variable %s is used before initialization", v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1770 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1771 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1772 Expression *vie = v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1773 if (vie->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1774 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1775 Declaration *d = ((VarExp *)vie)->var;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1776 vie = getVarExp(e1->loc, istate, d);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1777 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1778 if (vie->op != TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1779 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1780 StructLiteralExp *se = (StructLiteralExp *)vie;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1781 int fieldi = se->getFieldIndex(type, soe->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1782 if (fieldi == -1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1783 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1784 Expression *ev = se->getField(type, soe->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1785 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1786 e2 = (*fp)(type, ev, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1787 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1788 e2 = Cast(type, type, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1789 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1790 return e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1791
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1792 addVarToInterstate(istate, v);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1793
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1794 /* Create new struct literal reflecting updated fieldi
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1795 */
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1796 Expressions *expsx = changeOneElement(se->elements, fieldi, e2);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1797 v->value = new StructLiteralExp(se->loc, se->sd, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1798 v->value->type = se->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1799
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1800 e = Cast(type, type, post ? ev : e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1801 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1802 /* Assignment to array element of the form:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1803 * a[i] = e2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1804 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1805 else if (e1->op == TOKindex && ((IndexExp *)e1)->e1->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1806 { IndexExp *ie = (IndexExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1807 VarExp *ve = (VarExp *)ie->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1808 VarDeclaration *v = ve->var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1809 if (!v || v->isDataseg())
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1810 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1811 error("%s cannot be modified at compile time", v ? v->toChars(): "void");
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1812 return EXP_CANT_INTERPRET;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1813 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1814 if (v->value && v->value->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1815 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1816 VarExp *ve2 = (VarExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1817 // TODO
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1818 #ifdef IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1819 if (ve2->var->isSymbolDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1820 { // This can happen if v is a struct initialized to
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1821 // 0 using an __initZ SymbolDeclaration from
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1822 // TypeStruct::defaultInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1823 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1824 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1825 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1826 v = ve2->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1827 assert(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1828 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1829 if (!v->value)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1830 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1831 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1832 { error("variable %s is used before initialization", v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1833 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1834 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1835
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1836 Type *t = v->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1837 if (t->ty == Tsarray)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1838 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1839 /* This array was void initialized. Create a
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1840 * default initializer for it.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1841 * What we should do is fill the array literal with
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1842 * NULL data, so use-before-initialized can be detected.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1843 * But we're too lazy at the moment to do it, as that
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1844 * involves redoing Index() and whoever calls it.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1845 */
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1846
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1847 size_t dim = ((TypeSArray *)t)->dim->toInteger();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1848 v->value = createBlockDuplicatedArrayLiteral(v->type,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1849 v->type->defaultInit(), dim);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1850 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1851 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1852 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1853 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1854
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1855 ArrayLiteralExp *ae = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1856 AssocArrayLiteralExp *aae = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1857 StringExp *se = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1858 if (v->value->op == TOKarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1859 ae = (ArrayLiteralExp *)v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1860 else if (v->value->op == TOKassocarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1861 aae = (AssocArrayLiteralExp *)v->value;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1862 else if (v->value->op == TOKstring)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1863 se = (StringExp *)v->value;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1864 else if (v->value->op == TOKnull)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1865 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1866 // This would be a runtime segfault
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1867 error("Cannot index null array %s", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1868 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1869 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1870 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1871 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1872
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1873 /* Set the $ variable
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1874 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1875 Expression *ee = ArrayLength(Type::tsize_t, v->value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1876 if (ee != EXP_CANT_INTERPRET && ie->lengthVar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1877 ie->lengthVar->value = ee;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1878 Expression *index = ie->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1879 if (index == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1880 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1881 Expression *ev;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1882 if (fp || ae || se) // not for aae, because key might not be there
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1883 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1884 ev = Index(type, v->value, index);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1885 if (ev == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1886 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1887 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1888
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1889 if (fp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1890 e2 = (*fp)(type, ev, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1891 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1892 e2 = Cast(type, type, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1893 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1894 return e2;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1895
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1896 addVarToInterstate(istate, v);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1897 if (ae)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1898 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1899 /* Create new array literal reflecting updated elem
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1900 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1901 int elemi = index->toInteger();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1902 Expressions *expsx = changeOneElement(ae->elements, elemi, e2);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1903 v->value = new ArrayLiteralExp(ae->loc, expsx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1904 v->value->type = ae->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1905 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1906 else if (aae)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1907 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1908 /* Create new associative array literal reflecting updated key/value
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1909 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1910 Expressions *keysx = aae->keys;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1911 Expressions *valuesx = new Expressions();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1912 valuesx->setDim(aae->values->dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1913 int updated = 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1914 for (size_t j = valuesx->dim; j; )
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1915 { j--;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1916 Expression *ekey = (Expression *)aae->keys->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1917 Expression *ex = Equal(TOKequal, Type::tbool, ekey, index);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1918 if (ex == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1919 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1920 if (ex->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1921 { valuesx->data[j] = (void *)e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1922 updated = 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1923 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1924 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1925 valuesx->data[j] = aae->values->data[j];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1926 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1927 if (!updated)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1928 { // Append index/e2 to keysx[]/valuesx[]
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1929 valuesx->push(e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1930 keysx = (Expressions *)keysx->copy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1931 keysx->push(index);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1932 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1933 v->value = new AssocArrayLiteralExp(aae->loc, keysx, valuesx);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1934 v->value->type = aae->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1935 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1936 else if (se)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1937 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1938 /* Create new string literal reflecting updated elem
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1939 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1940 int elemi = index->toInteger();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1941 unsigned char *s;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1942 s = (unsigned char *)mem.calloc(se->len + 1, se->sz);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1943 memcpy(s, se->string, se->len * se->sz);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1944 unsigned value = e2->toInteger();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1945 switch (se->sz)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1946 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1947 case 1: s[elemi] = value; break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1948 case 2: ((unsigned short *)s)[elemi] = value; break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1949 case 4: ((unsigned *)s)[elemi] = value; break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1950 default:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1951 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1952 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1953 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1954 StringExp *se2 = new StringExp(se->loc, s, se->len);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1955 se2->committed = se->committed;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1956 se2->postfix = se->postfix;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1957 se2->type = se->type;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1958 v->value = se2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1959 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1960 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1961 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1962
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1963 e = Cast(type, type, post ? ev : e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
1964 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1965
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1966 /* Assignment to struct element in array, of the form:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1967 * a[i].var = e2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1968 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1969 else if (e1->op == TOKdotvar && aggregate->op == TOKindex &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1970 ((IndexExp *)aggregate)->e1->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1971 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1972 IndexExp * ie = (IndexExp *)aggregate;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1973 VarExp *ve = (VarExp *)(ie->e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1974 VarDeclaration *v = ve->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1975 if (!v || v->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1976 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1977 error("%s cannot be modified at compile time", v ? v->toChars(): "void");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1978 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1979 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1980 Type *t = ve->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1981 ArrayLiteralExp *ae = (ArrayLiteralExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1982 if (!ae)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1983 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1984 // assignment to one element in an uninitialized (static) array.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1985 // This is quite difficult, because defaultInit() for a struct is a VarExp,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1986 // not a StructLiteralExp.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1987 Type *t = v->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1988 if (t->ty != Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1989 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1990 error("Cannot index an uninitialized variable");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1991 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1992 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1993
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1994 Type *telem = ((TypeSArray *)t)->nextOf()->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1995 if (telem->ty != Tstruct) { return EXP_CANT_INTERPRET; }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1996
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1997 // Create a default struct literal...
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1998 StructDeclaration *sym = ((TypeStruct *)telem)->sym;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1999 StructLiteralExp *structinit = createDefaultInitStructLiteral(v->loc, sym);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2000
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2001 // ... and use to create a blank array literal
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2002 size_t dim = ((TypeSArray *)t)->dim->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2003 ae = createBlockDuplicatedArrayLiteral(v->type, structinit, dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2004 v->value = ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2005 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2006 if ((Expression *)(ae->elements) == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2007 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2008 // Note that this would be a runtime segfault
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2009 error("Cannot index null array %s", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2010 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2011 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2012 // Set the $ variable
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2013 Expression *ee = ArrayLength(Type::tsize_t, v->value);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2014 if (ee != EXP_CANT_INTERPRET && ie->lengthVar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2015 ie->lengthVar->value = ee;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2016 // Determine the index, and check that it's OK.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2017 Expression *index = ie->e2->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2018 if (index == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2019 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2020
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2021 int elemi = index->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2022 if (elemi >= ae->elements->dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2023 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2024 error("array index %d is out of bounds %s[0..%d]", elemi,
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2025 v->toChars(), ae->elements->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2026 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2027 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2028 // Get old element
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2029 Expression *vie = (Expression *)(ae->elements->data[elemi]);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2030 if (vie->op != TOKstructliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2031 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2032
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2033 // Work out which field needs to be changed
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2034 StructLiteralExp *se = (StructLiteralExp *)vie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2035 VarDeclaration *vf = ((DotVarExp *)e1)->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2036 if (!vf)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2037 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2038
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2039 int fieldi = se->getFieldIndex(type, vf->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2040 if (fieldi == -1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2041 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2042
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2043 Expression *ev = se->getField(type, vf->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2044 if (fp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2045 e2 = (*fp)(type, ev, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2046 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2047 e2 = Cast(type, type, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2048 if (e2 == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2049 return e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2050
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2051 // Create new struct literal reflecting updated field
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2052 Expressions *expsx = changeOneElement(se->elements, fieldi, e2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2053 Expression * newstruct = new StructLiteralExp(se->loc, se->sd, expsx);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2054
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2055 // Create new array literal reflecting updated struct elem
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2056 ae->elements = changeOneElement(ae->elements, elemi, newstruct);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2057 return ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2058 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2059 /* Slice assignment, initialization of static arrays
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2060 * a[] = e
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2061 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2062 else if (e1->op == TOKslice && ((SliceExp *)e1)->e1->op==TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2063 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2064 SliceExp * sexp = (SliceExp *)e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2065 VarExp *ve = (VarExp *)(sexp->e1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2066 VarDeclaration *v = ve->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2067 if (!v || v->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2068 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2069 error("%s cannot be modified at compile time", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2070 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2071 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2072 // Chase down rebinding of out and ref
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2073 if (v->value && v->value->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2074 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2075 VarExp *ve2 = (VarExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2076 // TODO
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2077 #ifdef IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2078 if (ve2->var->isSymbolDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2079 { // This can happen if v is a struct initialized to
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2080 // 0 using an __initZ SymbolDeclaration from
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2081 // TypeStruct::defaultInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2082 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2083 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2084 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2085 v = ve2->var->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2086 assert(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2087 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2088 /* Set the $ variable
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2089 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2090 Expression *ee = v->value ? ArrayLength(Type::tsize_t, v->value)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2091 : EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2092 if (ee != EXP_CANT_INTERPRET && sexp->lengthVar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2093 sexp->lengthVar->value = ee;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2094 Expression *upper = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2095 Expression *lower = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2096 if (sexp->upr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2097 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2098 upper = sexp->upr->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2099 if (upper == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2100 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2101 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2102 if (sexp->lwr)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2103 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2104 lower = sexp->lwr->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2105 if (lower == EXP_CANT_INTERPRET)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2106 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2107 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2108 Type *t = v->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2109 size_t dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2110 if (t->ty == Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2111 dim = ((TypeSArray *)t)->dim->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2112 else if (t->ty == Tarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2113 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2114 if (!v->value || v->value->op == TOKnull)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2115 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2116 error("cannot assign to null array %s", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2117 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2118 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2119 if (v->value->op == TOKarrayliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2120 dim = ((ArrayLiteralExp *)v->value)->elements->dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2121 else if (v->value->op ==TOKstring)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2122 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2123 error("String slice assignment is not yet supported in CTFE");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2124 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2125 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2126 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2127 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2128 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2129 error("%s cannot be evaluated at compile time", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2130 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2131 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2132 int upperbound = upper ? upper->toInteger() : dim;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2133 int lowerbound = lower ? lower->toInteger() : 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2134
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2135 ArrayLiteralExp *existing;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2136 if (((int)lowerbound < 0) || (upperbound > dim))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2137 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2138 error("Array bounds [0..%d] exceeded in slice [%d..%d]", dim, lowerbound, upperbound);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2139 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2140 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2141 if (upperbound-lowerbound != dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2142 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2143 // Only modifying part of the array. Must create a new array literal.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2144 // If the existing array is uninitialized (this can only happen
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2145 // with static arrays), create it.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2146 if (v->value && v->value->op == TOKarrayliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2147 existing = (ArrayLiteralExp *)v->value;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2148 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2149 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2150 // this can only happen with static arrays
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2151 existing = createBlockDuplicatedArrayLiteral(v->type, v->type->defaultInit(), dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2152 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2153 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2154
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2155 if (e2->op == TOKarrayliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2156 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2157 // Static array assignment from literal
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2158 ArrayLiteralExp *ae = (ArrayLiteralExp *)e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2159 if (ae->elements->dim != (upperbound - lowerbound))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2160 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2161 error("Array length mismatch assigning [0..%d] to [%d..%d]", ae->elements->dim, lowerbound, upperbound);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2162 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2163 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2164 if (upperbound - lowerbound == dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2165 v->value = ae;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2166 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2167 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2168 // value[] = value[0..lower] ~ ae ~ value[upper..$]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2169 existing->elements = spliceElements(existing->elements, ae->elements, lowerbound);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2170 v->value = existing;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2171 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2172 return e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2173 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2174 else if (t->nextOf()->ty == e2->type->ty)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2175 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2176 // Static array block assignment
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2177 if (upperbound-lowerbound ==dim)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2178 v->value = createBlockDuplicatedArrayLiteral(v->type, e2, dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2179 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2180 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2181 // value[] = value[0..lower] ~ ae ~ value[upper..$]
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2182 existing->elements = spliceElements(existing->elements, createBlockDuplicatedArrayLiteral(v->type, e2, upperbound-lowerbound)->elements, lowerbound);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2183 v->value = existing;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2184 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2185 return e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2186 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2187 else if (e2->op == TOKstring)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2188 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2189 StringExp *se = (StringExp *)e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2190 // This is problematic. char[8] should be storing
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2191 // values as a string literal, not
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2192 // as an array literal. Then, for static arrays, we
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2193 // could do modifications
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2194 // in-place, with a dramatic memory and speed improvement.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2195 error("String slice assignment is not yet supported in CTFE");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2196 return e2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2197 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2198 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2199 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2200 error("Slice operation %s cannot be evaluated at compile time", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2201 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2202 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2203 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2204 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2205 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2206 error("%s cannot be evaluated at compile time", toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2207 #ifdef DEBUG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2208 dump(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2209 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2210 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2211 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2212 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2213
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2214 Expression *AssignExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2215 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2216 return interpretAssignCommon(istate, NULL);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2217 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2218
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2219 #define BIN_ASSIGN_INTERPRET(op) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2220 Expression *op##AssignExp::interpret(InterState *istate) \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2221 { \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2222 return interpretAssignCommon(istate, &op); \
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2223 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2224
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2225 BIN_ASSIGN_INTERPRET(Add)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2226 BIN_ASSIGN_INTERPRET(Min)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2227 BIN_ASSIGN_INTERPRET(Cat)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2228 BIN_ASSIGN_INTERPRET(Mul)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2229 BIN_ASSIGN_INTERPRET(Div)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2230 BIN_ASSIGN_INTERPRET(Mod)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2231 BIN_ASSIGN_INTERPRET(Shl)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2232 BIN_ASSIGN_INTERPRET(Shr)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2233 BIN_ASSIGN_INTERPRET(Ushr)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2234 BIN_ASSIGN_INTERPRET(And)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2235 BIN_ASSIGN_INTERPRET(Or)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2236 BIN_ASSIGN_INTERPRET(Xor)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2237
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2238 Expression *PostExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2239 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2240 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2241 printf("PostExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2242 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2243 Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2244 if (op == TOKplusplus)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2245 e = interpretAssignCommon(istate, &Add, 1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2246 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2247 e = interpretAssignCommon(istate, &Min, 1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2248 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2249 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2250 printf("PostExp::interpret() CANT\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2251 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2252 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2253 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2254
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2255 Expression *AndAndExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2256 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2257 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2258 printf("AndAndExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2259 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2260 Expression *e = e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2261 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2262 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2263 if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2264 e = new IntegerExp(e1->loc, 0, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2265 else if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2266 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2267 e = e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2268 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2269 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2270 if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2271 e = new IntegerExp(e1->loc, 0, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2272 else if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2273 e = new IntegerExp(e1->loc, 1, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2274 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2275 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2276 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2277 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2278 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2279 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2280 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2281 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2282 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2283
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2284 Expression *OrOrExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2285 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2286 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2287 printf("OrOrExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2288 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2289 Expression *e = e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2290 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2291 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2292 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2293 e = new IntegerExp(e1->loc, 1, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2294 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2295 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2296 e = e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2297 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2298 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2299 if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2300 e = new IntegerExp(e1->loc, 0, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2301 else if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2302 e = new IntegerExp(e1->loc, 1, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2303 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2304 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2305 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2306 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2307 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2308 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2309 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2310 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2311 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2312
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2313
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2314 Expression *CallExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2315 { Expression *e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2316
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2317 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2318 printf("CallExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2319 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2320 if (e1->op == TOKdotvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2321 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2322 Expression * pthis = ((DotVarExp*)e1)->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2323 FuncDeclaration *fd = ((DotVarExp*)e1)->var->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2324 TypeFunction *tf = fd ? (TypeFunction *)(fd->type) : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2325 if (tf)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2326 { // Member function call
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2327 if(pthis->op == TOKthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2328 pthis = istate->localThis;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2329 Expression *eresult = fd->interpret(istate, arguments, pthis);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2330 if (eresult)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2331 e = eresult;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2332 else if (fd->type->toBasetype()->nextOf()->ty == Tvoid && !global.errors)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2333 e = EXP_VOID_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2334 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2335 error("cannot evaluate %s at compile time", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2336 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2337 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2338 error("cannot evaluate %s at compile time", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2339 return EXP_CANT_INTERPRET;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2340 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2341 if (e1->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2342 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2343 FuncDeclaration *fd = ((VarExp *)e1)->var->isFuncDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2344 if (fd)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2345 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2346 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2347 enum BUILTIN b = fd->isBuiltin();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2348 if (b)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2349 { Expressions args;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2350 args.setDim(arguments->dim);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2351 for (size_t i = 0; i < args.dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2352 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2353 Expression *earg = (Expression *)arguments->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2354 earg = earg->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2355 if (earg == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2356 return earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2357 args.data[i] = (void *)earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2358 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2359 e = eval_builtin(b, &args);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2360 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2361 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2362 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2363 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2364 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2365 // Inline .dup
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2366 if (fd->ident == Id::adDup && arguments && arguments->dim == 2)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2367 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2368 e = (Expression *)arguments->data[1];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2369 e = e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2370 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2371 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2372 e = expType(type, e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2373 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2374 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2375 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2376 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2377 Expression *eresult = fd->interpret(istate, arguments);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2378 if (eresult)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2379 e = eresult;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2380 else if (fd->type->toBasetype()->nextOf()->ty == Tvoid && !global.errors)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2381 e = EXP_VOID_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2382 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2383 error("cannot evaluate %s at compile time", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2384 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2385 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2386 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2387 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2388 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2389
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2390 Expression *CommaExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2391 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2392 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2393 printf("CommaExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2394 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2395 Expression *e = e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2396 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2397 e = e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2398 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2399 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2400
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2401 Expression *CondExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2402 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2403 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2404 printf("CondExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2405 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2406 Expression *e = econd->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2407 if (e != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2408 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2409 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2410 e = e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2411 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2412 e = e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2413 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2414 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2415 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2416 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2417 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2418
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2419 Expression *ArrayLengthExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2420 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2421 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2422
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2423 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2424 printf("ArrayLengthExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2425 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2426 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2427 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2428 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2429 if (e1->op == TOKstring || e1->op == TOKarrayliteral || e1->op == TOKassocarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2430 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2431 e = ArrayLength(type, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2432 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2433 else if (e1->op == TOKnull)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2434 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2435 e = new IntegerExp(loc, 0, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2436 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2437 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2438 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2439 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2440
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2441 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2442 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2443 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2444
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2445 Expression *IndexExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2446 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2447 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2448 Expression *e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2449
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2450 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2451 printf("IndexExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2452 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2453 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2454 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2455 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2456
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2457 if (e1->op == TOKstring || e1->op == TOKarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2458 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2459 /* Set the $ variable
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2460 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2461 e = ArrayLength(Type::tsize_t, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2462 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2463 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2464 if (lengthVar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2465 lengthVar->value = e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2466 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2467
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2468 e2 = this->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2469 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2470 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2471 return Index(type, e1, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2472
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2473 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2474 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2475 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2476
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2477
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2478 Expression *SliceExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2479 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2480 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2481 Expression *lwr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2482 Expression *upr;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2483
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2484 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2485 printf("SliceExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2486 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2487 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2488 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2489 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2490 if (!this->lwr)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2491 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2492 e = e1->castTo(NULL, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2493 return e->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2494 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2495
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2496 /* Set the $ variable
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2497 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2498 e = ArrayLength(Type::tsize_t, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2499 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2500 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2501 if (lengthVar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2502 lengthVar->value = e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2503
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2504 /* Evaluate lower and upper bounds of slice
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2505 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2506 lwr = this->lwr->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2507 if (lwr == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2508 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2509 upr = this->upr->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2510 if (upr == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2511 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2512
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2513 return Slice(type, e1, lwr, upr);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2514
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2515 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2516 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2517 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2518
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2519
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2520 Expression *CatExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2521 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2522 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2523 Expression *e2;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2524
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2525 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2526 printf("CatExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2527 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2528 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2529 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2530 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2531 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2532 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2533 e2 = this->e2->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2534 if (e2 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2535 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2536 return Cat(type, e1, e2);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2537
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2538 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2539 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2540 printf("CatExp::interpret() %s CANT\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2541 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2542 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2543 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2544
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2545
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2546 Expression *CastExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2547 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2548 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2549
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2550 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2551 printf("CastExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2552 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2553 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2554 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2555 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2556 return Cast(type, to, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2557
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2558 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2559 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2560 printf("CastExp::interpret() %s CANT\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2561 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2562 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2563 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2564
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2565
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2566 Expression *AssertExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2567 { Expression *e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2568 Expression *e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2569
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2570 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2571 printf("AssertExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2572 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2573 if( this->e1->op == TOKaddress)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2574 { // Special case: deal with compiler-inserted assert(&this, "null this")
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2575 AddrExp *ade = (AddrExp *)this->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2576 if(ade->e1->op == TOKthis && istate->localThis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2577 return istate->localThis->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2578 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2579 if (this->e1->op == TOKthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2580 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2581 if(istate->localThis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2582 return istate->localThis->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2583 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2584 e1 = this->e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2585 if (e1 == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2586 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2587 if (e1->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2588 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2589 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2590 else if (e1->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2591 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2592 if (msg)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2593 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2594 e = msg->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2595 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2596 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2597 error("%s", e->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2598 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2599 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2600 error("%s failed", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2601 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2602 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2603 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2604 goto Lcant;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2605 return e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2606
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2607 Lcant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2608 return EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2609 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2610
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2611 Expression *PtrExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2612 { Expression *e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2613
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2614 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2615 printf("PtrExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2616 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2617
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2618 // Constant fold *(&structliteral + offset)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2619 if (e1->op == TOKadd)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2620 { AddExp *ae = (AddExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2621 if (ae->e1->op == TOKaddress && ae->e2->op == TOKint64)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2622 { AddrExp *ade = (AddrExp *)ae->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2623 Expression *ex = ade->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2624 ex = ex->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2625 if (ex != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2626 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2627 if (ex->op == TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2628 { StructLiteralExp *se = (StructLiteralExp *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2629 unsigned offset = ae->e2->toInteger();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2630 e = se->getField(type, offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2631 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2632 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2633 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2634 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2635 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2636 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2637 e = Ptr(type, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2638 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2639 else if (e1->op == TOKsymoff)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2640 { SymOffExp *soe = (SymOffExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2641 VarDeclaration *v = soe->var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2642 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2643 { Expression *ev = getVarExp(loc, istate, v);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2644 if (ev != EXP_CANT_INTERPRET && ev->op == TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2645 { StructLiteralExp *se = (StructLiteralExp *)ev;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2646 e = se->getField(type, soe->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2647 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2648 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2649 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2650 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2651 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2652 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2653 #else // this is required for D1, where structs return *this instead of 'this'.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2654 else if (e1->op == TOKthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2655 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2656 if(istate->localThis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2657 return istate->localThis->interpret(istate);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2658 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2659 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2660 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2661 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2662 printf("PtrExp::interpret() %s = EXP_CANT_INTERPRET\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2663 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2664 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2665 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2666
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2667 Expression *DotVarExp::interpret(InterState *istate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2668 { Expression *e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2669
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2670 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2671 printf("DotVarExp::interpret() %s\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2672 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2673
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2674 Expression *ex = e1->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2675 if (ex != EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2676 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2677 if (ex->op == TOKstructliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2678 { StructLiteralExp *se = (StructLiteralExp *)ex;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2679 VarDeclaration *v = var->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2680 if (v)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2681 { e = se->getField(type, v->offset);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2682 if (!e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2683 e = EXP_CANT_INTERPRET;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2684 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2685 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2686 } else error("%s.%s is not yet implemented at compile time", ex->toChars(), var->toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2687 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2688
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2689 #if LOG
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2690 if (e == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2691 printf("DotVarExp::interpret() %s = EXP_CANT_INTERPRET\n", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2692 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2693 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2694 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2695
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2696 /******************************* Special Functions ***************************/
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2697
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2698 Expression *interpret_aaLen(InterState *istate, Expressions *arguments)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2699 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2700 if (!arguments || arguments->dim != 1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2701 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2702 Expression *earg = (Expression *)arguments->data[0];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2703 earg = earg->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2704 if (earg == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2705 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2706 if (earg->op != TOKassocarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2707 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2708 AssocArrayLiteralExp *aae = (AssocArrayLiteralExp *)earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2709 Expression *e = new IntegerExp(aae->loc, aae->keys->dim, Type::tsize_t);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2710 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2711 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2712
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2713 Expression *interpret_aaKeys(InterState *istate, Expressions *arguments)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2714 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2715 #if LOG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2716 printf("interpret_aaKeys()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2717 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2718 if (!arguments || arguments->dim != 2)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2719 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2720 Expression *earg = (Expression *)arguments->data[0];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2721 earg = earg->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2722 if (earg == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2723 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2724 if (earg->op != TOKassocarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2725 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2726 AssocArrayLiteralExp *aae = (AssocArrayLiteralExp *)earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2727 Expression *e = new ArrayLiteralExp(aae->loc, aae->keys);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2728 Type *elemType = ((TypeAArray *)aae->type)->index;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2729 e->type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments->dim : 0));
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2730 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2731 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2732
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2733 Expression *interpret_aaValues(InterState *istate, Expressions *arguments)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2734 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2735 //printf("interpret_aaValues()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2736 if (!arguments || arguments->dim != 3)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2737 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2738 Expression *earg = (Expression *)arguments->data[0];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2739 earg = earg->interpret(istate);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2740 if (earg == EXP_CANT_INTERPRET)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2741 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2742 if (earg->op != TOKassocarrayliteral)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2743 return NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2744 AssocArrayLiteralExp *aae = (AssocArrayLiteralExp *)earg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2745 Expression *e = new ArrayLiteralExp(aae->loc, aae->values);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2746 Type *elemType = ((TypeAArray *)aae->type)->next;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
2747 e->type = new TypeSArray(elemType, new IntegerExp(arguments ? arguments->dim : 0));
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2748 //printf("result is %s\n", e->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2749 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2750 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 658
diff changeset
2751