Behavior.st
changeset 3 24d81bf47225
parent 2 6526dde5f3ac
child 5 67342904af11
equal deleted inserted replaced
2:6526dde5f3ac 3:24d81bf47225
    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 |