author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Mon, 12 Aug 2013 02:44:57 +0200 | |
changeset 893 | 822c94cd6f8d |
parent 892 | 1922021ef56b |
child 937 | 8cbc9884f0cd |
permissions | -rw-r--r-- |
52 | 1 |
"{ Package: 'stx:goodies/monticello' }" |
2 |
||
3 |
MCDefinition subclass:#MCMethodDefinition |
|
471 | 4 |
instanceVariableNames:'classIsMeta source category selector className timeStamp |
893
822c94cd6f8d
Oops, forgot to remove the instvar from class definition.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
892
diff
changeset
|
5 |
' |
52 | 6 |
classVariableNames:'Definitions' |
7 |
poolDictionaries:'' |
|
642 | 8 |
category:'SCM-Monticello-Modeling' |
52 | 9 |
! |
10 |
||
11 |
||
12 |
!MCMethodDefinition class methodsFor:'as yet unclassified'! |
|
13 |
||
14 |
cachedDefinitions |
|
187 | 15 |
Definitions ifNil: [Definitions := WeakIdentityDictionary new. WeakArray addDependent: Definitions]. |
16 |
^ Definitions |
|
17 |
||
18 |
"Modified: / 26-08-2009 / 12:20:45 / Jaroslav Havlin <havlij6@fel.cvut.cz>" |
|
52 | 19 |
! |
20 |
||
21 |
className: classString |
|
22 |
classIsMeta: metaBoolean |
|
23 |
selector: selectorString |
|
24 |
category: catString |
|
25 |
timeStamp: timeString |
|
26 |
source: sourceString |
|
27 |
^ self instanceLike: |
|
28 |
(self new initializeWithClassName: classString |
|
29 |
classIsMeta: metaBoolean |
|
30 |
selector: selectorString |
|
31 |
category: catString |
|
32 |
timeStamp: timeString |
|
33 |
source: sourceString) |
|
34 |
! |
|
35 |
||
36 |
className: classString |
|
37 |
selector: selectorString |
|
38 |
category: catString |
|
39 |
timeStamp: timeString |
|
40 |
source: sourceString |
|
41 |
^ self className: classString |
|
42 |
classIsMeta: false |
|
43 |
selector: selectorString |
|
44 |
category: catString |
|
45 |
timeStamp: timeString |
|
46 |
source: sourceString |
|
47 |
! |
|
48 |
||
49 |
forMethodReference: aMethodReference |
|
50 |
| definition | |
|
51 |
definition := self cachedDefinitions at: aMethodReference compiledMethod ifAbsent: []. |
|
52 |
(definition isNil |
|
53 |
or: [definition selector ~= aMethodReference methodSymbol] |
|
54 |
or: [definition className ~= aMethodReference classSymbol] |
|
55 |
or: [definition classIsMeta ~= aMethodReference classIsMeta] |
|
56 |
or: [definition category ~= aMethodReference category]) |
|
57 |
ifTrue: [definition := self |
|
58 |
className: aMethodReference classSymbol |
|
59 |
classIsMeta: aMethodReference classIsMeta |
|
60 |
selector: aMethodReference methodSymbol |
|
61 |
category: aMethodReference category |
|
62 |
timeStamp: aMethodReference timeStamp |
|
63 |
source: aMethodReference source. |
|
64 |
self cachedDefinitions at: aMethodReference compiledMethod put: definition]. |
|
65 |
^ definition |
|
66 |
||
67 |
! |
|
68 |
||
69 |
initialize |
|
187 | 70 |
" |
146
e92158173b96
more porting (but still unfinished)
Claus Gittinger <cg@exept.de>
parents:
52
diff
changeset
|
71 |
Smalltalk addToShutDownList: self |
187 | 72 |
" |
73 |
||
74 |
"Modified: / 13-10-2010 / 14:12:35 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
52 | 75 |
! |
76 |
||
77 |
shutDown |
|
78 |
WeakArray removeWeakDependent: Definitions. |
|
187 | 79 |
Definitions := nil. |
52 | 80 |
! ! |
81 |
||
82 |
!MCMethodDefinition methodsFor:'accessing'! |
|
83 |
||
84 |
actualClass |
|
471 | 85 |
^ Smalltalk |
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
86 |
at:(self installedClassName ? className) asSymbol |
471 | 87 |
ifPresent: [:class | |
88 |
classIsMeta |
|
89 |
ifTrue: [class theMetaclass "classSide"] |
|
90 |
ifFalse: [class] |
|
91 |
] |
|
465 | 92 |
|
487 | 93 |
"Modified: / 07-09-2011 / 15:23:45 / cg" |
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
94 |
"Modified: / 12-08-2013 / 01:34:44 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
52 | 95 |
! |
96 |
||
97 |
category |
|
98 |
^ category |
|
99 |
! |
|
100 |
||
864
33600db0c775
More improvements in pre-write transformations.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
718
diff
changeset
|
101 |
category:something |
33600db0c775
More improvements in pre-write transformations.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
718
diff
changeset
|
102 |
category := something. |
33600db0c775
More improvements in pre-write transformations.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
718
diff
changeset
|
103 |
! |
33600db0c775
More improvements in pre-write transformations.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
718
diff
changeset
|
104 |
|
52 | 105 |
classIsMeta |
106 |
^ classIsMeta |
|
107 |
! |
|
108 |
||
109 |
className |
|
110 |
^className |
|
111 |
! |
|
112 |
||
718 | 113 |
description |
114 |
^ Array |
|
115 |
with: className |
|
116 |
with: selector |
|
117 |
with: classIsMeta |
|
118 |
! |
|
119 |
||
52 | 120 |
fullTimeStamp |
187 | 121 |
^Timestamp fromMethodTimeStamp: timeStamp |
52 | 122 |
! |
123 |
||
471 | 124 |
installedClassName |
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
125 |
| installedClassName | |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
126 |
|
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
127 |
installedClassName := self objectAttributeAt: #installedClassName. |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
128 |
^ installedClassName ? className |
471 | 129 |
|
130 |
"Created: / 07-09-2011 / 13:36:37 / cg" |
|
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
131 |
"Modified: / 12-08-2013 / 01:37:20 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
132 |
! |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
133 |
|
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
134 |
installedClassName:aString |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
135 |
self objectAttributeAt: #installedClassName put: aString. |
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
136 |
|
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
137 |
"Modified: / 12-08-2013 / 01:37:45 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
471 | 138 |
! |
139 |
||
52 | 140 |
selector |
141 |
^selector |
|
142 |
! |
|
143 |
||
144 |
source |
|
145 |
^ source |
|
146 |
! |
|
147 |
||
148 |
timeStamp |
|
149 |
^ timeStamp |
|
150 |
! ! |
|
151 |
||
152 |
!MCMethodDefinition methodsFor:'annotations'! |
|
153 |
||
154 |
printAnnotations: requests on: aStream |
|
155 |
"Add a string for an annotation pane, trying to fulfill the annotation requests. |
|
156 |
These might include anything that |
|
157 |
Preferences defaultAnnotationRequests |
|
158 |
might return. Which includes anything in |
|
159 |
Preferences annotationInfo |
|
160 |
To edit these, use:" |
|
161 |
"Preferences editAnnotations" |
|
162 |
||
163 |
requests do: [ :aRequest | |
|
164 |
aRequest == #timeStamp ifTrue: [ aStream nextPutAll: self timeStamp ]. |
|
165 |
aRequest == #messageCategory ifTrue: [ aStream nextPutAll: self category ]. |
|
166 |
aRequest == #requirements ifTrue: [ |
|
167 |
self requirements do: [ :req | |
|
168 |
aStream nextPutAll: req ] separatedBy: [ aStream space ]]. |
|
169 |
] separatedBy: [ aStream space ]. |
|
170 |
! ! |
|
171 |
||
172 |
!MCMethodDefinition methodsFor:'comparing'! |
|
173 |
||
174 |
= aDefinition |
|
187 | 175 |
^(super = aDefinition) |
176 |
and: [aDefinition source = self source |
|
177 |
and: [aDefinition category = self category |
|
178 |
"and: [aDefinition timeStamp = self timeStamp]"]] |
|
179 |
||
180 |
"Modified: / 18-08-2009 / 10:18:43 / Jan Vrany <vranyj1@fel.cvut.cz>" |
|
181 |
"Modified: / 14-09-2010 / 19:03:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
52 | 182 |
! |
183 |
||
184 |
hash |
|
185 |
| hash | |
|
187 | 186 |
hash := String stringHash: classIsMeta asString initialHash: 0. |
187 |
hash := String stringHash: source initialHash: hash. |
|
188 |
hash := String stringHash: category initialHash: hash. |
|
189 |
hash := String stringHash: className initialHash: hash. |
|
52 | 190 |
^ hash |
191 |
! |
|
192 |
||
193 |
requirements |
|
194 |
^ Array with: className |
|
195 |
! |
|
196 |
||
197 |
sortKey |
|
198 |
^ self className, '.', (self classIsMeta ifTrue: ['meta'] ifFalse: ['nonmeta']), '.', self selector |
|
199 |
! ! |
|
200 |
||
187 | 201 |
!MCMethodDefinition methodsFor:'converting'! |
202 |
||
203 |
asChange |
|
204 |
||
205 |
^MethodDefinitionChange new |
|
206 |
mcDefinition: self; |
|
207 |
className: className , (classIsMeta ifTrue:[' class'] ifFalse:['']); |
|
208 |
selector: selector; |
|
209 |
source: source asStringWithNativeLineEndings; |
|
210 |
category: category; |
|
211 |
yourself |
|
212 |
||
213 |
"Created: / 13-10-2010 / 17:17:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
214 |
"Modified: / 08-11-2010 / 17:56:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
215 |
! ! |
|
216 |
||
52 | 217 |
!MCMethodDefinition methodsFor:'installing'! |
218 |
||
219 |
isExtensionMethod |
|
220 |
^ category beginsWith: '*' |
|
221 |
! |
|
222 |
||
223 |
isOverrideMethod |
|
224 |
"this oughta check the package" |
|
225 |
^ self isExtensionMethod and: [category endsWith: '-override'] |
|
226 |
! |
|
227 |
||
187 | 228 |
load |
574 | 229 |
| env package oldMethod newMethod actualClass| |
471 | 230 |
|
231 |
env := MCStXNamespaceQuery query ? Smalltalk. |
|
232 |
(env ~~ Smalltalk) ifTrue:[ |
|
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
233 |
self installedClassName:(env name , '::' , className) asSymbol |
471 | 234 |
]. |
235 |
||
187 | 236 |
package := MCStXPackageQuery query. |
574 | 237 |
actualClass := self actualClass. |
238 |
actualClass isNil ifTrue:[ |
|
642 | 239 |
MCCannotLoadMethodError |
240 |
raiseRequestWith:self |
|
241 |
errorString:('missing class: %1' bindWith:className). |
|
574 | 242 |
^ self "/ proceeded |
243 |
]. |
|
244 |
oldMethod := actualClass compiledMethodAt: self selector. |
|
187 | 245 |
(oldMethod notNil and:[oldMethod package ~= package]) |
246 |
ifTrue:[Class methodRedefinitionNotification |
|
247 |
raiseRequestWith: (oldMethod -> self)]. |
|
248 |
||
574 | 249 |
newMethod := actualClass |
187 | 250 |
compile: source asStringWithNativeLineEndings |
251 |
classified: category |
|
252 |
withStamp: timeStamp |
|
253 |
"notifying: (SyntaxError new category: category)". |
|
254 |
newMethod package: package |
|
255 |
||
642 | 256 |
"Modified: / 11-09-2012 / 09:54:19 / cg" |
892
1922021ef56b
Removed instvar installedClassName and make it an object attribute.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
864
diff
changeset
|
257 |
"Modified: / 12-08-2013 / 01:34:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
187 | 258 |
! |
259 |
||
260 |
postloadOver: aDefinition |
|
261 |
super postloadOver: aDefinition. |
|
262 |
(self isInitializer |
|
263 |
and: [ self actualClass isTrait not ] |
|
264 |
and: [ aDefinition isNil or: [ self source ~= aDefinition source ] ]) ifTrue: [ |
|
265 |
self actualClass theNonMetaClass initialize ] |
|
52 | 266 |
! |
267 |
||
268 |
scanForPreviousVersion |
|
269 |
| position prevPos prevFileIndex preamble tokens sourceFilesCopy stamp method file methodCategory | |
|
187 | 270 |
method := self actualClass compiledMethodAt: selector ifAbsent: [^ nil]. |
271 |
position := method filePosition. |
|
272 |
sourceFilesCopy := SourceFiles collect: |
|
52 | 273 |
[:x | x isNil ifTrue: [ nil ] |
274 |
ifFalse: [x readOnlyCopy]]. |
|
275 |
[method fileIndex == 0 ifTrue: [^ nil]. |
|
187 | 276 |
file := sourceFilesCopy at: method fileIndex. |
52 | 277 |
[position notNil & file notNil] |
278 |
whileTrue: |
|
279 |
[file position: (0 max: position-150). "Skip back to before the preamble" |
|
280 |
[file position < (position-1)] "then pick it up from the front" |
|
187 | 281 |
whileTrue: [preamble := file nextChunk]. |
52 | 282 |
|
283 |
"Preamble is likely a linked method preamble, if we're in |
|
284 |
a changes file (not the sources file). Try to parse it |
|
285 |
for prior source position and file index" |
|
187 | 286 |
prevPos := nil. |
287 |
stamp := ''. |
|
52 | 288 |
(preamble findString: 'methodsFor:' startingAt: 1) > 0 |
187 | 289 |
ifTrue: [tokens := Scanner new scanTokens: preamble] |
290 |
ifFalse: [tokens := Array new "ie cant be back ref"]. |
|
52 | 291 |
((tokens size between: 7 and: 8) |
292 |
and: [(tokens at: tokens size-5) = #methodsFor:]) |
|
293 |
ifTrue: |
|
294 |
[(tokens at: tokens size-3) = #stamp: |
|
295 |
ifTrue: ["New format gives change stamp and unified prior pointer" |
|
187 | 296 |
stamp := tokens at: tokens size-2. |
297 |
prevPos := tokens last. |
|
298 |
prevFileIndex := sourceFilesCopy fileIndexFromSourcePointer: prevPos. |
|
299 |
prevPos := sourceFilesCopy filePositionFromSourcePointer: prevPos] |
|
52 | 300 |
ifFalse: ["Old format gives no stamp; prior pointer in two parts" |
187 | 301 |
prevPos := tokens at: tokens size-2. |
302 |
prevFileIndex := tokens last]. |
|
303 |
(prevPos = 0 or: [prevFileIndex = 0]) ifTrue: [prevPos := nil]]. |
|
52 | 304 |
((tokens size between: 5 and: 6) |
305 |
and: [(tokens at: tokens size-3) = #methodsFor:]) |
|
306 |
ifTrue: |
|
307 |
[(tokens at: tokens size-1) = #stamp: |
|
308 |
ifTrue: ["New format gives change stamp and unified prior pointer" |
|
187 | 309 |
stamp := tokens at: tokens size]]. |
310 |
methodCategory := tokens after: #methodsFor: ifAbsent: ['as yet unclassifed']. |
|
52 | 311 |
methodCategory = category ifFalse: |
312 |
[methodCategory = (Smalltalk |
|
313 |
at: #Categorizer |
|
314 |
ifAbsent: [Smalltalk at: #ClassOrganizer]) |
|
187 | 315 |
default ifTrue: [methodCategory := methodCategory, ' ']. |
52 | 316 |
^ ChangeRecord new file: file position: position type: #method |
317 |
class: className category: methodCategory meta: classIsMeta stamp: stamp]. |
|
187 | 318 |
position := prevPos. |
52 | 319 |
prevPos notNil ifTrue: |
187 | 320 |
[file := sourceFilesCopy at: prevFileIndex]]. |
52 | 321 |
^ nil] |
322 |
ensure: [sourceFilesCopy do: [:x | x notNil ifTrue: [x close]]] |
|
323 |
||
324 |
! |
|
325 |
||
326 |
unload |
|
187 | 327 |
| previousVersion class | |
328 |
||
329 |
(class := self actualClass) ifNotNil: [class removeSelector: selector]. |
|
330 |
^self. |
|
331 |
||
332 |
"Original stuff" |
|
471 | 333 |
self todo:'cg: why was the code below removed? see browsers previous versions code'. |
187 | 334 |
|
335 |
self isOverrideMethod ifTrue: [previousVersion := self scanForPreviousVersion]. |
|
336 |
previousVersion |
|
337 |
ifNil: [(class := self actualClass) ifNotNil: [class removeSelector: selector]] |
|
338 |
ifNotNil: [previousVersion fileIn] |
|
339 |
||
340 |
"Modified: / 11-09-2010 / 18:44:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
471 | 341 |
"Modified: / 07-09-2011 / 13:39:38 / cg" |
52 | 342 |
! ! |
343 |
||
344 |
!MCMethodDefinition methodsFor:'printing'! |
|
345 |
||
346 |
fullClassName |
|
187 | 347 |
"Using #class selector for classes for backwards compatibility" |
348 |
||
52 | 349 |
^ self classIsMeta |
350 |
ifFalse: [self className] |
|
187 | 351 |
ifTrue: [ |
352 |
(self actualClass isNil or: [ self actualClass isTrait ]) |
|
353 |
ifFalse: [self className, ' class'] |
|
354 |
ifTrue: [self className, ' classSide']] |
|
52 | 355 |
! |
356 |
||
357 |
summary |
|
358 |
^ self fullClassName , '>>' , selector |
|
359 |
! ! |
|
360 |
||
187 | 361 |
!MCMethodDefinition methodsFor:'private'! |
362 |
||
363 |
existingMethodOrNil |
|
364 |
| actualClass | |
|
365 |
actualClass := self actualClass. |
|
366 |
^actualClass |
|
367 |
ifNil:[nil] |
|
368 |
ifNotNil: [actualClass compiledMethodAt:self selector] |
|
369 |
||
370 |
"Modified: / 08-11-2010 / 17:41:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
371 |
! ! |
|
372 |
||
52 | 373 |
!MCMethodDefinition methodsFor:'serializing'! |
374 |
||
375 |
initializeWithClassName: classString |
|
376 |
classIsMeta: metaBoolean |
|
377 |
selector: selectorString |
|
378 |
category: catString |
|
379 |
timeStamp: timeString |
|
187 | 380 |
source: sourceString |
381 |
className := classString asSymbol. |
|
382 |
selector := selectorString asSymbol. |
|
383 |
category := catString asSymbol. |
|
384 |
timeStamp := timeString. |
|
385 |
classIsMeta := metaBoolean. |
|
386 |
source := sourceString asStringWithSqueakLineEndings. |
|
387 |
||
388 |
"Modified: / 12-09-2010 / 16:02:05 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
52 | 389 |
! ! |
390 |
||
391 |
!MCMethodDefinition methodsFor:'testing'! |
|
392 |
||
393 |
isCodeDefinition |
|
394 |
^ true |
|
395 |
! |
|
396 |
||
397 |
isInitializer |
|
398 |
^ selector = #initialize and: [classIsMeta] |
|
399 |
||
400 |
! |
|
401 |
||
402 |
isMethodDefinition |
|
403 |
^true |
|
187 | 404 |
! |
405 |
||
406 |
isOverrideDefinition |
|
407 |
||
408 |
| oldMethod | |
|
409 |
||
410 |
oldMethod := self existingMethodOrNil. |
|
411 |
^oldMethod |
|
412 |
ifNil:[false] |
|
413 |
ifNotNil:[oldMethod package ~= MCStXPackageQuery query] |
|
414 |
||
415 |
"Created: / 08-11-2010 / 17:29:36 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
52 | 416 |
! ! |
417 |
||
418 |
!MCMethodDefinition methodsFor:'visiting'! |
|
419 |
||
420 |
accept: aVisitor |
|
421 |
^ aVisitor visitMethodDefinition: self |
|
422 |
! ! |
|
423 |
||
424 |
!MCMethodDefinition class methodsFor:'documentation'! |
|
425 |
||
269 | 426 |
version |
893
822c94cd6f8d
Oops, forgot to remove the instvar from class definition.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
892
diff
changeset
|
427 |
^ '$Header: /cvs/stx/stx/goodies/monticello/MCMethodDefinition.st,v 1.14 2013-08-12 00:44:57 vrany Exp $' |
269 | 428 |
! |
429 |
||
187 | 430 |
version_CVS |
893
822c94cd6f8d
Oops, forgot to remove the instvar from class definition.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
892
diff
changeset
|
431 |
^ '$Header: /cvs/stx/stx/goodies/monticello/MCMethodDefinition.st,v 1.14 2013-08-12 00:44:57 vrany Exp $' |
146
e92158173b96
more porting (but still unfinished)
Claus Gittinger <cg@exept.de>
parents:
52
diff
changeset
|
432 |
! |
e92158173b96
more porting (but still unfinished)
Claus Gittinger <cg@exept.de>
parents:
52
diff
changeset
|
433 |
|
187 | 434 |
version_SVN |
893
822c94cd6f8d
Oops, forgot to remove the instvar from class definition.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
892
diff
changeset
|
435 |
^ '$Id: MCMethodDefinition.st,v 1.14 2013-08-12 00:44:57 vrany Exp $' |
52 | 436 |
! ! |
437 |
||
718 | 438 |
|
52 | 439 |
MCMethodDefinition initialize! |