annotate dmdscript_tango/functiondefinition.d @ 4:6d905019f7bf

some changes
author saaadel
date Thu, 28 Jan 2010 21:23:27 +0200
parents 8363a4bf6a8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2007 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
22 module dmdscript_tango.functiondefinition;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
24 //import std.stdio;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
26 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
27 import dmdscript_tango.identifier;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
28 import dmdscript_tango.statement;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
29 import dmdscript_tango.dfunction;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
30 import dmdscript_tango.scopex;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
31 import dmdscript_tango.irstate;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
32 import dmdscript_tango.opcodes;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
33 import dmdscript_tango.ddeclaredfunction;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
34 import dmdscript_tango.symbol;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
35 import dmdscript_tango.dobject;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
36 import dmdscript_tango.ir;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
37 import dmdscript_tango.textgen.errmsgs;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
38 import dmdscript_tango.value;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
39 import dmdscript_tango.property;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 /* ========================== FunctionDefinition ================== */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 class FunctionDefinition : TopStatement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 // Maybe the following two should be done with derived classes instead
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 int isglobal; // !=0 if the global anonymous function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 int isanonymous; // !=0 if anonymous function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 int iseval; // !=0 if eval function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 Identifier* name; // null for anonymous function
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 Identifier*[] parameters; // array of Identifier's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 TopStatement[] topstatements; // array of TopStatement's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 Identifier*[] varnames; // array of Identifier's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 FunctionDefinition[] functiondefinitions;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 FunctionDefinition enclosingFunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 int nestDepth;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 int withdepth; // max nesting of ScopeStatement's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 SymbolTable *labtab; // symbol table for LabelSymbol's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 IR *code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 uint nlocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 this(TopStatement[] topstatements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 super(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 st = FUNCTIONDEFINITION;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 this.isglobal = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 this.topstatements = topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 this(Loc loc, int isglobal,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 Identifier *name, Identifier*[] parameters,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 TopStatement[] topstatements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 super(loc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 //writef("FunctionDefinition('%ls')\n", name ? name.string : L"");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 st = FUNCTIONDEFINITION;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 this.isglobal = isglobal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 this.name = name;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 this.parameters = parameters;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 this.topstatements = topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 Statement semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 TopStatement ts;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 //writef("FunctionDefinition::semantic(%s)\n", this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 // Log all the FunctionDefinition's so we can rapidly
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 // instantiate them at runtime
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 fd = enclosingFunction = sc.funcdef;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 // But only push it if it is not already in the array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 for (i = 0; ; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 if (i == fd.functiondefinitions.length) // not in the array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 { fd.functiondefinitions ~= this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 if (fd.functiondefinitions[i] is this) // already in the array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 //writef("isglobal = %d, isanonymous = %d\n", isglobal, isanonymous);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 if (!isglobal && !isanonymous)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 { sc = sc.push(this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114 sc.nestDepth++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 nestDepth = sc.nestDepth;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 //writefln("nestDepth = %d", nestDepth);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 if (topstatements.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 for (i = 0; i < topstatements.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 ts = topstatements[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 //writefln("calling semantic routine %d which is %x\n",i, cast(uint)cast(void*)ts);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 if (!ts.done)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 { ts = ts.semantic(sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 if (sc.errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 break;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 if (iseval)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 // There's an implied "return" on the last statement
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 if ((i + 1) == topstatements.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 ts = ts.ImpliedReturn();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 topstatements[i] = ts;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 ts.done = 1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 // Make sure all the LabelSymbol's are defined
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 if (labtab)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 foreach (Symbol s; labtab.members)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 { LabelSymbol ls = cast(LabelSymbol) s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 if (!ls.statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 error(sc, errmsgtbl[ERR_UNDEFINED_LABEL],
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 ls.toString(), toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 if (!isglobal && !isanonymous)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 sc.pop();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 FunctionDefinition fdx = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 return cast(Statement)cast(void*)fdx;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 { uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 //writef("FunctionDefinition::toBuffer()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 if (!isglobal)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 buf ~= "function ";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 if (isanonymous)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 buf ~= "anonymous";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 else if (name)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 buf ~= name.toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 buf ~= '(';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 for (i = 0; i < parameters.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 if (i)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 buf ~= ',';
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 buf ~= parameters[i].toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 buf ~= ")\n{ \n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 if (topstatements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 for (i = 0; i < topstatements.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 topstatements[i].toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 if (!isglobal)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 buf ~= "}\n";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 void toIR(IRstate *ignore)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 IRstate irs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 uint i;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 //writefln("FunctionDefinition.toIR() done = %d", done);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 irs.ctor();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 if (topstatements.length)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 for (i = 0; i < topstatements.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 { TopStatement ts;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 FunctionDefinition fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 ts = topstatements[i];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209 if (ts.st == FUNCTIONDEFINITION)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 fd = cast(FunctionDefinition)ts;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 if (fd.code)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213 continue;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215 ts.toIR(&irs);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 // Don't need parse trees anymore, release to garbage collector
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 topstatements[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 topstatements = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 labtab = null; // maybe delete it?
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 irs.gen0(0, IRret);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 irs.gen0(0, IRend);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 //irs.validate();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 irs.doFixups();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 irs.optimize();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 code = cast(IR *) irs.codebuf.data;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 irs.codebuf.data = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233 nlocals = irs.nlocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 void instantiate(Dobject[] scopex, Dobject actobj, uint attributes)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 //writefln("FunctionDefinition.instantiate() %s nestDepth = %d", name ? name.toString() : "", nestDepth);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 // Instantiate all the Var's per 10.1.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 foreach (Identifier* name; varnames)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 // If name is already declared, don't override it
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 //writefln("\tVar Put(%s)", name.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 actobj.Put(name.toString(), &vundefined, Instantiate | DontOverride | attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248 // Instantiate the Function's per 10.1.3
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 foreach (FunctionDefinition fd; functiondefinitions)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 // Set [[Scope]] property per 13.2 step 7
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 Dfunction fobject = new DdeclaredFunction(fd);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 fobject.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 if (fd.name) // skip anonymous functions
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 //writefln("\tFunction Put(%s)", fd.name.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 actobj.Put(fd.name.toString(), fobject, Instantiate | attributes);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 //writefln("-FunctionDefinition.instantiate()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 }