equal
deleted
inserted
replaced
36 instSize <SmallInteger> the number of instance variables |
36 instSize <SmallInteger> the number of instance variables |
37 flags <SmallInteger> special flag bits coded in a number |
37 flags <SmallInteger> special flag bits coded in a number |
38 |
38 |
39 NOTICE: layout known by compiler and runtime system; be careful when changing |
39 NOTICE: layout known by compiler and runtime system; be careful when changing |
40 |
40 |
41 %W% %E% |
41 $Header: /cvs/stx/stx/libbasic/Behavior.st,v 1.3 1993-10-13 00:14:49 claus Exp $ |
42 written Dec 88 by claus |
42 written Dec 88 by claus |
43 '! |
43 '! |
|
44 |
|
45 !Behavior class methodsFor:'queries'! |
|
46 |
|
47 isBuiltInClass |
|
48 "this class is known by the run-time-system" |
|
49 |
|
50 ^ true |
|
51 ! ! |
44 |
52 |
45 !Behavior class methodsFor:'creating new classes'! |
53 !Behavior class methodsFor:'creating new classes'! |
46 |
54 |
47 new |
55 new |
48 "creates and return a new class" |
56 "creates and return a new class" |
73 ! ! |
81 ! ! |
74 |
82 |
75 !Behavior methodsFor:'creating an instance of myself'! |
83 !Behavior methodsFor:'creating an instance of myself'! |
76 |
84 |
77 uninitializedNew |
85 uninitializedNew |
78 "same as new" |
86 "same as new - only redefined in ByteArray" |
79 |
87 |
80 ^ self basicNew |
88 ^ self basicNew |
81 ! |
89 ! |
82 |
90 |
83 uninitializedNew:anInteger |
91 uninitializedNew:anInteger |
84 "same as new:anInteger" |
92 "same as new:anInteger - only redefined in ByteArray" |
85 |
93 |
86 ^ self basicNew:anInteger |
94 ^ self basicNew:anInteger |
87 ! |
95 ! |
88 |
96 |
89 new |
97 new |
178 case BYTEARRAY: |
186 case BYTEARRAY: |
179 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(char); |
187 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(char); |
180 PROTECT(self); |
188 PROTECT(self); |
181 _qNew(newobj, instsize, SENDER); |
189 _qNew(newobj, instsize, SENDER); |
182 UNPROTECT(self); |
190 UNPROTECT(self); |
183 if (newobj == nil) { |
191 if (newobj == nil) { |
184 break; |
192 break; |
185 } |
193 } |
186 _InstPtr(newobj)->o_class = self; |
194 _InstPtr(newobj)->o_class = self; |
187 #if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
195 #if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
188 /* |
196 /* |
189 * knowing that nil is 0 |
197 * knowing that nil is 0 |
190 */ |
198 */ |
208 case WORDARRAY: |
216 case WORDARRAY: |
209 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(short); |
217 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(short); |
210 PROTECT(self); |
218 PROTECT(self); |
211 _qNew(newobj, instsize, SENDER); |
219 _qNew(newobj, instsize, SENDER); |
212 UNPROTECT(self); |
220 UNPROTECT(self); |
213 if (newobj == nil) { |
221 if (newobj == nil) { |
214 break; |
222 break; |
215 } |
223 } |
216 _InstPtr(newobj)->o_class = self; |
224 _InstPtr(newobj)->o_class = self; |
217 #if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
225 #if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
218 /* |
226 /* |
219 * knowing that nil is 0 |
227 * knowing that nil is 0 |
220 */ |
228 */ |
233 case LONGARRAY: |
241 case LONGARRAY: |
234 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(long); |
242 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(long); |
235 PROTECT(self); |
243 PROTECT(self); |
236 _qAlignedNew(newobj, instsize, SENDER); |
244 _qAlignedNew(newobj, instsize, SENDER); |
237 UNPROTECT(self); |
245 UNPROTECT(self); |
238 if (newobj == nil) { |
246 if (newobj == nil) { |
239 break; |
247 break; |
240 } |
248 } |
241 _InstPtr(newobj)->o_class = self; |
249 _InstPtr(newobj)->o_class = self; |
242 #if defined(memset4) && ! defined(NEGATIVE_ADDRESSES) |
250 #if defined(memset4) && ! defined(NEGATIVE_ADDRESSES) |
243 /* |
251 /* |
244 * knowing that nil is 0 |
252 * knowing that nil is 0 |
245 */ |
253 */ |
265 case FLOATARRAY: |
273 case FLOATARRAY: |
266 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(float); |
274 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(float); |
267 PROTECT(self); |
275 PROTECT(self); |
268 _qNew(newobj, instsize, SENDER); |
276 _qNew(newobj, instsize, SENDER); |
269 UNPROTECT(self); |
277 UNPROTECT(self); |
270 if (newobj == nil) { |
278 if (newobj == nil) { |
271 break; |
279 break; |
272 } |
280 } |
273 _InstPtr(newobj)->o_class = self; |
281 _InstPtr(newobj)->o_class = self; |
274 op = _InstPtr(newobj)->i_instvars; |
282 op = _InstPtr(newobj)->i_instvars; |
275 while (nInstVars--) |
283 while (nInstVars--) |
276 *op++ = nil; |
284 *op++ = nil; |
277 fp = (float *)op; |
285 fp = (float *)op; |
283 case DOUBLEARRAY: |
291 case DOUBLEARRAY: |
284 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(double); |
292 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ) + nindexedinstvars * sizeof(double); |
285 PROTECT(self); |
293 PROTECT(self); |
286 _qNew(newobj, instsize, SENDER); |
294 _qNew(newobj, instsize, SENDER); |
287 UNPROTECT(self); |
295 UNPROTECT(self); |
288 if (newobj == nil) { |
296 if (newobj == nil) { |
289 break; |
297 break; |
290 } |
298 } |
291 _InstPtr(newobj)->o_class = self; |
299 _InstPtr(newobj)->o_class = self; |
292 op = _InstPtr(newobj)->i_instvars; |
300 op = _InstPtr(newobj)->i_instvars; |
293 while (nInstVars--) |
301 while (nInstVars--) |
294 *op++ = nil; |
302 *op++ = nil; |
295 dp = (double *)op; |
303 dp = (double *)op; |
303 nInstVars += nindexedinstvars; |
311 nInstVars += nindexedinstvars; |
304 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ); |
312 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ); |
305 PROTECT(self); |
313 PROTECT(self); |
306 _qAlignedNew(newobj, instsize, SENDER); |
314 _qAlignedNew(newobj, instsize, SENDER); |
307 UNPROTECT(self); |
315 UNPROTECT(self); |
308 if (newobj == nil) { |
316 if (newobj == nil) { |
309 break; |
317 break; |
310 } |
318 } |
311 _InstPtr(newobj)->o_class = self; |
319 _InstPtr(newobj)->o_class = self; |
312 #if defined(memset4) |
320 #if defined(memset4) |
313 memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars); |
321 memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars); |
314 #else |
322 #else |
315 # if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
323 # if defined(FAST_MEMSET) && ! defined(NEGATIVE_ADDRESSES) |
334 if (nindexedinstvars == 0) { |
342 if (nindexedinstvars == 0) { |
335 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ); |
343 instsize = OHDR_SIZE + nInstVars * sizeof(OBJ); |
336 PROTECT(self); |
344 PROTECT(self); |
337 _qAlignedNew(newobj, instsize, SENDER); |
345 _qAlignedNew(newobj, instsize, SENDER); |
338 UNPROTECT(self); |
346 UNPROTECT(self); |
339 if (newobj == nil) { |
347 if (newobj == nil) { |
340 break; |
348 break; |
341 } |
349 } |
342 _InstPtr(newobj)->o_class = self; |
350 _InstPtr(newobj)->o_class = self; |
343 if (nInstVars) { |
351 if (nInstVars) { |
344 #if defined(memset4) |
352 #if defined(memset4) |
345 memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars); |
353 memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars); |
346 #else |
354 #else |
368 (anInteger isMemberOf:SmallInteger) ifFalse:[ |
376 (anInteger isMemberOf:SmallInteger) ifFalse:[ |
369 self error:'argument to new: must be Integer' |
377 self error:'argument to new: must be Integer' |
370 ] ifTrue:[ |
378 ] ifTrue:[ |
371 (anInteger >= 0) ifTrue:[ |
379 (anInteger >= 0) ifTrue:[ |
372 "sorry but this class has no indexed instvars - need 'new' " |
380 "sorry but this class has no indexed instvars - need 'new' " |
373 self isVariable ifFalse:[ |
381 self isVariable ifFalse:[ |
374 self error:'not indexed - cannot create with new:' |
382 self error:'not indexed - cannot create with new:' |
375 ] ifTrue:[ |
383 ] ifTrue:[ |
376 ObjectMemory allocationFailureSignal raise |
384 ObjectMemory allocationFailureSignal raise |
377 ] |
385 ] |
378 ] ifFalse:[ |
386 ] ifFalse:[ |
379 self error:'bad (negative) argument to new' |
387 self error:'bad (negative) argument to new' |
380 ] |
388 ] |
381 ] |
389 ] |
382 ! ! |
390 ! ! |
709 ! |
717 ! |
710 |
718 |
711 sourceCodeAt:aSelector |
719 sourceCodeAt:aSelector |
712 "return the methods source for given selector aSelector" |
720 "return the methods source for given selector aSelector" |
713 |
721 |
714 |index| |
722 |method| |
715 |
723 |
716 index := selectors identityIndexOf:aSelector startingAt:1. |
724 method := self compiledMethodAt:aSelector. |
717 (index == 0) ifTrue:[^ nil]. |
725 method isNil ifTrue:[^ nil]. |
718 ^ (methods at:index) source |
726 ^ method source |
719 |
727 |
720 "True sourceCodeAt:#ifTrue:" |
728 "True sourceCodeAt:#ifTrue:" |
721 ! |
729 ! |
722 |
730 |
723 hasMethods |
731 hasMethods |
891 | obj basicSize i | |
899 | obj basicSize i | |
892 |
900 |
893 self isPointers ifTrue: [ |
901 self isPointers ifTrue: [ |
894 stream next. "skip instSize" |
902 stream next. "skip instSize" |
895 self isVariable ifTrue: [ |
903 self isVariable ifTrue: [ |
896 ^ self basicNew: (stream nextNumber: 3) |
904 ^ self basicNew: (stream nextNumber: 3) |
897 ]. |
905 ]. |
898 ^ self basicNew |
906 ^ self basicNew |
899 ]. |
907 ]. |
900 |
908 |
901 obj _ self basicNew: (basicSize _ stream nextNumber: 4). |
909 obj _ self basicNew: (basicSize _ stream nextNumber: 4). |
902 i _ 0. |
910 i _ 0. |
903 self isBytes ifTrue: [ |
911 self isBytes ifTrue: [ |
904 [(i _ i + 1) <= basicSize] whileTrue: [ |
912 [(i _ i + 1) <= basicSize] whileTrue: [ |
905 obj basicAt: i put: stream next |
913 obj basicAt: i put: stream next |
906 ] |
914 ] |
907 ] ifFalse: [ |
915 ] ifFalse: [ |
908 [(i _ i + 1) <= basicSize] whileTrue: [ |
916 [(i _ i + 1) <= basicSize] whileTrue: [ |
909 obj basicAt: i put: stream "nextWord" nextNumber:2 |
917 obj basicAt: i put: stream "nextWord" nextNumber:2 |
910 ] |
918 ] |
911 ]. |
919 ]. |
912 ^obj |
920 ^obj |
913 ! |
921 ! |
914 |
922 |
915 storeBinaryDefinitionOn: stream manager: manager |
923 storeBinaryDefinitionOn: stream manager: manager |
916 | myName | |
924 | myName | |