Mercurial > projects > ldc
annotate gen/nested.cpp @ 1208:2a37f4745ddd
Add an option to change the way nested variables are handled.
Only one value is implemented, which is the old way.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 12 Apr 2009 16:22:21 +0200 |
parents | 83d3b25c2213 |
children | 8699c450a1a0 |
rev | line source |
---|---|
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
1 #include "gen/nested.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
2 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
3 #include "gen/dvalue.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
4 #include "gen/irstate.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
5 #include "gen/llvmhelpers.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
6 #include "gen/logger.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
7 #include "gen/tollvm.h" |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
8 |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
9 #include "llvm/Support/CommandLine.h" |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
10 namespace cl = llvm::cl; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
11 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
12 /// What the context pointer for a nested function looks like |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
13 enum NestedCtxType { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
14 /// Context is void*[] of pointers to variables. |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
15 /// Variables from higher levels are at the front. |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
16 NCArray, |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
17 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
18 /// Context is a struct containing variables belonging to the parent function. |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
19 /// If the parent function itself has a parent function, one of the members is |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
20 /// a pointer to its context. (linked-list style) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
21 // FIXME: implement |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
22 // TODO: Functions without any variables accessed by nested functions, but |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
23 // with a parent whose variables are accessed, can use the parent's |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
24 // context. |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
25 NCStruct, |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
26 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
27 /// Context is an array of pointers to nested contexts. Each function with variables |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
28 /// accessed by nested functions puts them in a struct, and appends a pointer to that |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
29 /// struct to the array. |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
30 // FIXME: implement |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
31 NCHybrid |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
32 }; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
33 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
34 static cl::opt<NestedCtxType> nestedCtx("nested-ctx", |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
35 cl::desc("How to construct a nested function's context:"), |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
36 cl::ZeroOrMore, |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
37 cl::values( |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
38 clEnumValN(NCArray, "array", "Array of pointers to variables (including multi-level)"), |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
39 //clEnumValN(NCStruct, "struct", "Struct of variables (with multi-level via linked list)"), |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
40 //clEnumValN(NCHybrid, "hybrid", "Array of pointers to structs of variables"), |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
41 clEnumValEnd), |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
42 cl::init(NCArray)); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
43 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
44 |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
45 /****************************************************************************************/ |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
46 /*//////////////////////////////////////////////////////////////////////////////////////// |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
47 // NESTED VARIABLE HELPERS |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
48 ////////////////////////////////////////////////////////////////////////////////////////*/ |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
49 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
50 DValue* DtoNestedVariable(Loc loc, Type* astype, VarDeclaration* vd) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
51 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
52 //////////////////////////////////// |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
53 // Locate context value |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
54 |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
55 Dsymbol* vdparent = vd->toParent2(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
56 assert(vdparent); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
57 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
58 IrFunction* irfunc = gIR->func(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
59 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
60 // is the nested variable in this scope? |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
61 if (vdparent == irfunc->decl) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
62 { |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
63 LLValue* val = vd->ir.getIrValue(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
64 return new DVarValue(astype, vd, val); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
65 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
66 |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
67 // get the nested context |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
68 LLValue* ctx = 0; |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
69 if (irfunc->decl->isMember2()) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
70 { |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
71 ClassDeclaration* cd = irfunc->decl->isMember2()->isClassDeclaration(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
72 LLValue* val = DtoLoad(irfunc->thisArg); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
73 ctx = DtoLoad(DtoGEPi(val, 0,cd->vthis->ir.irField->index, ".vthis")); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
74 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
75 else |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
76 ctx = irfunc->nestArg; |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
77 assert(ctx); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
78 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
79 assert(vd->ir.irLocal); |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
80 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
81 //////////////////////////////////// |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
82 // Extract variable from nested context |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
83 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
84 if (nestedCtx == NCArray) { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
85 LLValue* val = DtoBitCast(ctx, getPtrToType(getVoidPtrType())); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
86 val = DtoGEPi1(val, vd->ir.irLocal->nestedIndex); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
87 val = DtoLoad(val); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
88 assert(vd->ir.irLocal->value); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
89 val = DtoBitCast(val, vd->ir.irLocal->value->getType(), vd->toChars()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
90 return new DVarValue(astype, vd, val); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
91 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
92 else { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
93 assert(0 && "Not implemented yet"); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
94 } |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
95 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
96 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
97 void DtoNestedInit(VarDeclaration* vd) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
98 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
99 if (nestedCtx == NCArray) { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
100 // alloca as usual if no value already |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
101 if (!vd->ir.irLocal->value) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
102 vd->ir.irLocal->value = DtoAlloca(DtoType(vd->type), vd->toChars()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
103 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
104 // store the address into the nested vars array |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
105 assert(vd->ir.irLocal->nestedIndex >= 0); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
106 LLValue* gep = DtoGEPi(gIR->func()->decl->ir.irFunc->nestedVar, 0, vd->ir.irLocal->nestedIndex); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
107 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
108 assert(isaPointer(vd->ir.irLocal->value)); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
109 LLValue* val = DtoBitCast(vd->ir.irLocal->value, getVoidPtrType()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
110 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
111 DtoStore(val, gep); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
112 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
113 else { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
114 assert(0 && "Not implemented yet"); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
115 } |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
116 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
117 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
118 LLValue* DtoNestedContext(Loc loc, Dsymbol* sym) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
119 { |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
120 Logger::println("DtoNestedContext for %s", sym->toPrettyChars()); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
121 LOG_SCOPE; |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
122 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
123 IrFunction* irfunc = gIR->func(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
124 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
125 // if this func has its own vars that are accessed by nested funcs |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
126 // use its own context |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
127 if (irfunc->nestedVar) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
128 return irfunc->nestedVar; |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
129 // otherwise, it may have gotten a context from the caller |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
130 else if (irfunc->nestArg) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
131 return irfunc->nestArg; |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
132 // or just have a this argument |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
133 else if (irfunc->thisArg) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
134 { |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
135 ClassDeclaration* cd = irfunc->decl->isMember2()->isClassDeclaration(); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
136 if (!cd || !cd->vthis) |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
137 return getNullPtr(getVoidPtrType()); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
138 LLValue* val = DtoLoad(irfunc->thisArg); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
139 return DtoLoad(DtoGEPi(val, 0,cd->vthis->ir.irField->index, ".vthis")); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
140 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
141 else |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
142 { |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
143 return getNullPtr(getVoidPtrType()); |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
144 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
145 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
146 |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
147 void DtoCreateNestedContext(FuncDeclaration* fd) { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
148 if (nestedCtx == NCArray) { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
149 // construct nested variables array |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
150 if (!fd->nestedVars.empty()) |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
151 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
152 Logger::println("has nested frame"); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
153 // start with adding all enclosing parent frames until a static parent is reached |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
154 int nparelems = 0; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
155 if (!fd->isStatic()) |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
156 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
157 Dsymbol* par = fd->toParent2(); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
158 while (par) |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
159 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
160 if (FuncDeclaration* parfd = par->isFuncDeclaration()) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
161 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
162 nparelems += parfd->nestedVars.size(); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
163 // stop at first static |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
164 if (parfd->isStatic()) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
165 break; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
166 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
167 else if (ClassDeclaration* parcd = par->isClassDeclaration()) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
168 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
169 // nothing needed |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
170 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
171 else |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
172 { |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
173 break; |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
174 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
175 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
176 par = par->toParent2(); |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
177 } |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
178 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
179 int nelems = fd->nestedVars.size() + nparelems; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
180 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
181 // make array type for nested vars |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
182 const LLType* nestedVarsTy = LLArrayType::get(getVoidPtrType(), nelems); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
183 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
184 // alloca it |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
185 LLValue* nestedVars = DtoAlloca(nestedVarsTy, ".nested_vars"); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
186 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
187 IrFunction* irfunction = fd->ir.irFunc; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
188 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
189 // copy parent frame into beginning |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
190 if (nparelems) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
191 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
192 LLValue* src = irfunction->nestArg; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
193 if (!src) |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
194 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
195 assert(irfunction->thisArg); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
196 assert(fd->isMember2()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
197 LLValue* thisval = DtoLoad(irfunction->thisArg); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
198 ClassDeclaration* cd = fd->isMember2()->isClassDeclaration(); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
199 assert(cd); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
200 assert(cd->vthis); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
201 src = DtoLoad(DtoGEPi(thisval, 0,cd->vthis->ir.irField->index, ".vthis")); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
202 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
203 DtoMemCpy(nestedVars, src, DtoConstSize_t(nparelems*PTRSIZE)); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
204 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
205 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
206 // store in IrFunction |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
207 irfunction->nestedVar = nestedVars; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
208 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
209 // go through all nested vars and assign indices |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
210 int idx = nparelems; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
211 for (std::set<VarDeclaration*>::iterator i=fd->nestedVars.begin(); i!=fd->nestedVars.end(); ++i) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
212 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
213 VarDeclaration* vd = *i; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
214 if (!vd->ir.irLocal) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
215 vd->ir.irLocal = new IrLocal(vd); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
216 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
217 if (vd->isParameter()) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
218 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
219 Logger::println("nested param: %s", vd->toChars()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
220 LLValue* gep = DtoGEPi(nestedVars, 0, idx); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
221 LLValue* val = DtoBitCast(vd->ir.irLocal->value, getVoidPtrType()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
222 DtoStore(val, gep); |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
223 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
224 else |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
225 { |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
226 Logger::println("nested var: %s", vd->toChars()); |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
227 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
228 |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
229 vd->ir.irLocal->nestedIndex = idx++; |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
230 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
231 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
232 // fixup nested result variable |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
233 #if DMDV2 |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
234 if (fd->vresult && fd->vresult->nestedrefs.dim) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
235 #else |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
236 if (fd->vresult && fd->vresult->nestedref) |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
237 #endif |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
238 { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
239 Logger::println("nested vresult value: %s", fd->vresult->toChars()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
240 LLValue* gep = DtoGEPi(nestedVars, 0, fd->vresult->ir.irLocal->nestedIndex); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
241 LLValue* val = DtoBitCast(fd->vresult->ir.irLocal->value, getVoidPtrType()); |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
242 DtoStore(val, gep); |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
243 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
244 } |
1208
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
245 } |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
246 else { |
2a37f4745ddd
Add an option to change the way nested variables are handled.
Frits van Bommel <fvbommel wxs.nl>
parents:
1207
diff
changeset
|
247 assert(0 && "Not implemented yet"); |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
248 } |
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
249 } |