" Smalltalk/Array.st -*- Smalltalk -*- " Array : ArrayedCollection () Array _size: _size value: _value [ self := self _clone. { struct t_Array *this= (struct t_Array *)self; this->size= _integerObject((int)v__size); this->_elements= _newPointers(sizeof(oop) * (int)v__size); int i; for (i= 0; i < (int)v__size; ++i) ((oop *)this->_elements)[i]= *(((oop **)v__value)[i]); } ] Array new: newSize [ | array | array := self _clone. { if (_isIntegerObject(v_newSize)) { struct t_Array *array= (struct t_Array *)v_array; array->size= v_newSize; array->_elements= (oop)_newPointers(sizeof(oop) * _integerValue(v_newSize)); return v_array; } }. ^self primitiveFailed ] Array at: index [ { struct t_Array *this= (struct t_Array *)self; if (_isIntegerObject(v_index) && ((unsigned)v_index < (unsigned)this->size)) return ((oop *)this->_elements)[_integerValue(v_index)]; }. ^index isInteger ifTrue: [self errorSubscriptBounds: index] ifFalse: [self errorNonIntegerIndex: index]. ] Array at: index put: anObject [ { struct t_Array *this= (struct t_Array *)self; if (_isIntegerObject(v_index) && ((unsigned)v_index < (unsigned)this->size)) return ((oop *)this->_elements)[_integerValue(v_index)]= v_anObject; }. ^index isInteger ifTrue: [self errorSubscriptBounds: index] ifFalse: [self errorNonIntegerIndex: index]. ] Array printOn: aStream [ aStream nextPutAll: '#'. self printElementsOn: aStream ] " Array print [ | first | first := true. '#(' print. self do: [ :element | first ifTrue: [ first := false ] ifFalse: [ ' ' print ]. element print ]. ')' print. ] " ImmutableArray : Array () ImmutableArray at: index put: anObject [ ^self errorCannotModify ] ImmutableArray species [ ^Array ]