annotate lphobos/internal/cast.d @ 650:aa6a0b7968f7

Added test case for bug #100 Removed dubious check for not emitting static private global in other modules without access. This should be handled properly somewhere else, it's causing unresolved global errors for stuff that should work (in MiniD)
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sun, 05 Oct 2008 17:28:15 +0200
parents 27b9f749d9fe
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
113
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
1 /*
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
2 * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
3 * Written by Walter Bright
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
4 *
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
5 * This software is provided 'as-is', without any express or implied
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
6 * warranty. In no event will the authors be held liable for any damages
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
7 * arising from the use of this software.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
8 *
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
9 * Permission is granted to anyone to use this software for any purpose,
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
10 * including commercial applications, and to alter it and redistribute it
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
11 * freely, in both source and binary form, subject to the following
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
12 * restrictions:
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
13 *
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
14 * o The origin of this software must not be misrepresented; you must not
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
15 * claim that you wrote the original software. If you use this software
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
16 * in a product, an acknowledgment in the product documentation would be
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
17 * appreciated but is not required.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
18 * o Altered source versions must be plainly marked as such, and must not
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
19 * be misrepresented as being the original software.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
20 * o This notice may not be removed or altered from any source
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
21 * distribution.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
22 */
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
23
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
24
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
25 import object;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
26 import std.c.stdio;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
27
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
28 extern (C):
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
29
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
30 /******************************************
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
31 * Given a pointer:
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
32 * If it is an Object, return that Object.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
33 * If it is an interface, return the Object implementing the interface.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
34 * If it is null, return null.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
35 * Else, undefined crash
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
36 */
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
37
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
38 Object _d_toObject(void* p)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
39 { Object o;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
40
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
41 if (p)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
42 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
43 o = cast(Object)p;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
44 //ClassInfo oc = o.classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
45 Interface *pi = **cast(Interface ***)p;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
46
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
47 /* Interface.offset lines up with ClassInfo.name.ptr,
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
48 * so we rely on pointers never being less than 64K,
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
49 * and Objects never being greater.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
50 */
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
51 if (pi.offset < 0x10000)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
52 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
53 //printf("\tpi.offset = %d\n", pi.offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
54 o = cast(Object)(p - pi.offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
55 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
56 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
57 return o;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
58 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
59
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
60
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
61 /*************************************
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
62 * Attempts to cast Object o to class c.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
63 * Returns o if successful, null if not.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
64 */
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
65
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
66 Object _d_interface_cast(void* p, ClassInfo c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
67 { Object o;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
68
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
69 //printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, c.name);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
70 if (p)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
71 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
72 Interface *pi = **cast(Interface ***)p;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
73
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
74 //printf("\tpi.offset = %d\n", pi.offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
75 o = cast(Object)(p - pi.offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
76 return _d_dynamic_cast(o, c);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
77 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
78 return o;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
79 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
80
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
81 Object _d_dynamic_cast(Object o, ClassInfo c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
82 { ClassInfo oc;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
83 uint offset = 0;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
84
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
85 //printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
86
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
87 if (o)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
88 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
89 oc = o.classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
90 if (_d_isbaseof2(oc, c, offset))
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
91 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
92 //printf("\toffset = %d\n", offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
93 o = cast(Object)(cast(void*)o + offset);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
94 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
95 else
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
96 o = null;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
97 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
98 //printf("\tresult = %p\n", o);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
99 return o;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
100 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
101
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
102 int _d_isbaseof2(ClassInfo oc, ClassInfo c, inout uint offset)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
103 { int i;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
104
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
105 if (oc is c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
106 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
107 do
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
108 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
109 if (oc.base is c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
110 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
111 for (i = 0; i < oc.interfaces.length; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
112 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
113 ClassInfo ic;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
114
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
115 ic = oc.interfaces[i].classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
116 if (ic is c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
117 { offset = oc.interfaces[i].offset;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
118 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
119 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
120 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
121 for (i = 0; i < oc.interfaces.length; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
122 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
123 ClassInfo ic;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
124
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
125 ic = oc.interfaces[i].classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
126 if (_d_isbaseof2(ic, c, offset))
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
127 { offset = oc.interfaces[i].offset;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
128 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
129 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
130 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
131 oc = oc.base;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
132 } while (oc);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
133 return 0;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
134 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
135
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
136 int _d_isbaseof(ClassInfo oc, ClassInfo c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
137 { int i;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
138
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
139 if (oc is c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
140 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
141 do
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
142 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
143 if (oc.base is c)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
144 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
145 for (i = 0; i < oc.interfaces.length; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
146 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
147 ClassInfo ic;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
148
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
149 ic = oc.interfaces[i].classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
150 if (ic is c || _d_isbaseof(ic, c))
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
151 return 1;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
152 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
153 oc = oc.base;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
154 } while (oc);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
155 return 0;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
156 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
157
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
158 /*********************************
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
159 * Find the vtbl[] associated with Interface ic.
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
160 */
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
161
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
162 void *_d_interface_vtbl(ClassInfo ic, Object o)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
163 { int i;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
164 ClassInfo oc;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
165
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
166 //printf("__d_interface_vtbl(o = %p, ic = %p)\n", o, ic);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
167
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
168 assert(o);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
169
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
170 oc = o.classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
171 for (i = 0; i < oc.interfaces.length; i++)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
172 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
173 ClassInfo oic;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
174
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
175 oic = oc.interfaces[i].classinfo;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
176 if (oic is ic)
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
177 {
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
178 return cast(void *)oc.interfaces[i].vtbl;
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
179 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
180 }
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
181 assert(0);
27b9f749d9fe [svn r117] Initial working implementation of interfaces.
lindquist
parents:
diff changeset
182 }