" -*- Smalltalk -*- " Variable : Object () " ---------------------------------------------------------------- " NamedVariable : Variable ( name mangledName ) Object isNamedVariable [^false] NamedVariable isNamedVariable [^true] NamedVariable withName: nameString mangledName: mangledString [ self := super new. name := nameString. mangledName := mangledString. ] NamedVariable name [ ^name ] NamedVariable mangledName [ ^mangledName ] NamedVariable = anObject [ ^anObject isNamedVariable and: [name = anObject name and: [mangledName = anObject mangledName]] ] NamedVariable gen: unit [ unit outputStream gen: mangledName ] NamedVariable printOn: aStream [ aStream nextPutAll: name; nextPut: $[; nextPutAll: mangledName; nextPut: $] ] " ---------------------------------------------------------------- " ReceiverVariable : NamedVariable ( class ) ReceiverVariable withName: nameString mangledName: mangledString class: classNode [ self := super withName: nameString mangledName: mangledString. class := classNode. ] ReceiverVariable class [ ^class ] ReceiverVariable isExported [ ^true ] ReceiverVariable exportedTo: aScope [ aScope noteExportSelf. ^RemoteReceiverVariable withVariable: self ] ReceiverVariable exportFrom: aScope [ aScope noteExportSelf. ] ReceiverVariable gen: unit [ unit outputStream gen: '((struct '; gen: class typeName; gen:' *)self)->'; gen: name ] " ---------------------------------------------------------------- " RemoteReceiverVariable : Variable ( receiverVariable ) RemoteReceiverVariable withVariable: aVariable [ self := self new. receiverVariable := aVariable. ] RemoteReceiverVariable gen: unit [ unit outputStream gen: '((struct '; gen: receiverVariable class typeName; gen: ' *)((struct t_BlockClosure *)_self)->receiver)->'; gen: receiverVariable name ] " ---------------------------------------------------------------- " LocalVariable : NamedVariable ( isExported level offset ) LocalVariable withName: nameString mangledName: mangledString level: levelInteger [ self := super withName: nameString mangledName: mangledString. isExported := false. level := levelInteger. offset := -1. ] LocalVariable isExported [ ^isExported ] LocalVariable level [ ^level ] LocalVariable offset [ ^offset ] LocalVariable exportFrom: aScope [ self assert: [level = aScope level]. isExported ifFalse: [isExported := true. offset := aScope nextExportOffset] ] LocalVariable exportedTo: aScope [ ^RemoteVariable level: aScope level - level offset: offset ] LocalVariable gen: unit [ isExported ifTrue: [unit outputStream gen: '_state['; print: offset; gen: ']'] ifFalse: [super gen: unit] ] " ---------------------------------------------------------------- " GlobalVariable level [ ^0 ] GlobalVariable exportedTo: aScope [ ^self ] " ---------------------------------------------------------------- " SelfVariable : NamedVariable () SelfVariable new [ ^self withName: 'self' mangledName: 'self'. ] SelfVariable isExported [ ^true ] SelfVariable exportedTo: aScope [ aScope noteExportSelf. ^LocalVariable withName: 'self' mangledName: '((struct t_BlockClosure *)_self)->receiver' level: aScope level ] " ---------------------------------------------------------------- " RemoteVariable : Variable ( level offset ) Object isRemoteVariable [^false] RemoteVariable isRemoteVariable [^true] RemoteVariable level: levelInteger offset: offsetInteger [ self := self new. level := levelInteger. offset := offsetInteger. ] RemoteVariable gen: unit [ | stream | stream := unit outputStream. stream gen: '((oop *)'. level timesRepeat: [stream gen: '((struct t_BlockClosure *)']. stream gen: '_self)'. level - 1 timesRepeat: [stream gen: '->outer)']. stream gen: '->_state)['; print: offset; gen: ']' ]