" Smalltalk/Symbol.st -*- Smalltalk -*- " Symbol : String () Symbol new: newSize [ self := super new: newSize. ] Symbol string: aString [ 0 to: aString size - 1 do: [:index | super at: index put: (aString at: index)] ] SymbolTable : Set () [SymbolTable := SymbolTable new: 1023] Symbol intern: aStringOrSymbol [ | symbol | ^(symbol := SymbolTable like: aStringOrSymbol) notNil ifTrue: [symbol] ifFalse: [SymbolTable add: ((self new: aStringOrSymbol size) string: aStringOrSymbol)] ] Symbol _value: _value [ ^self intern: (String _value: _value) ] " ---------------------------------------------------------------- " String asSymbol [ ^Symbol intern: self ] " ---------------------------------------------------------------- " SelectorTable : IdentityDictionary () [SelectorTable := SelectorTable new] SelectorTable intern: aSymbol [ | selector | { struct t_String *symbol= (struct t_String *)v_aSymbol; int size= _integerValue(symbol->size); char *elements= (char *)symbol->_elements; char *buf= (char *)alloca(size + 1); memcpy(buf, elements, size); buf[size]= '\0'; v_selector= (oop)_selector(buf); }. ^self at: aSymbol put: selector ] Object _perform: sel { return _rebind(self, (sel_t)v_sel)(self); } Object perform: aSymbol [ ^self _perform: (SelectorTable at: aSymbol ifAbsent: [SelectorTable intern: aSymbol]) ] Object _perform: sel with: a { return _rebind(self, (sel_t)v_sel)(self, v_a); } Object perform: aSymbol with: a [ ^self _perform: (SelectorTable at: aSymbol ifAbsent: [SelectorTable intern: aSymbol]) with: a ]