-
Notifications
You must be signed in to change notification settings - Fork 6
/
MSqueak-Bootstrap.st
executable file
·164 lines (141 loc) · 5.37 KB
/
MSqueak-Bootstrap.st
1
MObject subclass: #MBootStrapReader instanceVariableNames: 'class' classVariableNames: '' poolDictionaries: '' category: 'MSqueak-Bootstrap'!!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/12/2010 10:24 < yo 12/8/2010 23:59'!bytes: strm | ret size | size := self int32: strm. ret := strm next: size. [strm position \\ 4 = 0] whileFalse: [strm next]. ^ ret.! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/14/2010 14:51'!int32: strm "Answer the next unsigned, 32-bit integer from this (binary) stream." | n | n _ strm next. n _ (n bitShift: 8) + strm next. n _ (n bitShift: 8) + strm next. n _ (n bitShift: 8) + strm next. ^ n > 16r7FFFFFFF ifTrue: [n - 16r100000000] ifFalse: [n]! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/12/2010 10:56'!pointerFrom: v ^ v bitShift: -8! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/16/2010 10:57'!readAllFrom: strm | v | [strm atEnd] whileFalse: [ v := self read: strm. v first == #classDef ifTrue: [ ClassBuilder new superclass: (System globals at: v second asSymbol) subclass: v third asSymbol instanceVariableNames: v fourth classVariableNames: (v at: 5) poolDictionaries: '' category: '']. v first == #methodDef ifTrue: [ v second addSelector: v third withMethod: v fourth]. v first == #doit ifTrue: [ System globals at: #Compiler ifPresent: [:c | c new evaluate: v second in: nil to: nil]]. v first == #init ifTrue: [ class := System globals at: v second asSymbol ifAbsent: [ v second first = $M ifTrue: [ System globals at: v second allButFirst asSymbol ifAbsent: []]]. class initialize. System log: class name, ' initialized'.] ].! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/14/2010 10:45'!readArrayLiteralsFrom: bytes at: pos | newArray strm arraySize v pointer f base string b | strm := ReadStream on: bytes. strm position: pos. arraySize := self int32: strm. newArray := Array new: arraySize. 1 to: arraySize do: [:i | base := pos. strm position: base + ((i - 1) * 4) + 4. v := self int32: strm. v odd ifTrue: [ newArray at: i put: (v bitShift: -1)]. (v digitAt: 1) = 0 ifTrue: [ strm position: (self pointerFrom: v). string := self string: strm. (string endsWith: ' class') ifTrue: [ b := nil->((class bindingOf: (string copyFrom: 1 to: string size - 6) asSymbol) value class)] ifFalse: [ b := class bindingOf: string asSymbol]. newArray at: i put: b]. (v digitAt: 1) = 2 ifTrue: [ strm position: (self pointerFrom: v). newArray at: i put: (self string: strm)]. (v digitAt: 1) = 4 ifTrue: [ strm position: (self pointerFrom: v). newArray at: i put: (self string: strm) asSymbol]. (v digitAt: 1) = 6 ifTrue: [ pointer := self pointerFrom: v. newArray at: i put: (self readArrayLiteralsFrom: bytes at: pointer)]. (v digitAt: 1) = 8 ifTrue: [ strm position: (self pointerFrom: v). newArray at: i put: (LargePositiveInteger newFrom: (self bytes: strm))]. (v digitAt: 1) = 10 ifTrue: [ strm position: (self pointerFrom: v). newArray at: i put: (LargeNegativeInteger newFrom: (self bytes: strm))]. (v digitAt: 1) = 12 ifTrue: [ strm position: (self pointerFrom: v). f := WordArray new: 2. f at: 1 put: (self int32: strm). f at: 2 put: (self int32: strm). newArray at: i put: (f as: Float)]. (v digitAt: 1) = 14 ifTrue: [ newArray at: i put: (Character value: (self pointerFrom: v))]]. ^ newArray! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/12/2010 10:24 < yo 12/10/2010 10:25'!readClassDef: allStrm size: size | strm | strm :=(allStrm next: size) readStream. ^ #(#classDef), ((1 to: 4) collect: [:i | self string: strm]). "pName cName iv cv"! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/16/2010 00:55'!readDoIt: allStrm size: size ^ #(doit) copyWith: (self string: (allStrm next: size) readStream)! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/16/2010 00:49'!readInit: allStrm size: size ^ #(init) copyWith: (self string: (allStrm next: size) readStream)! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/13/2010 15:33'!readMethodDef: allStrm size: size | header message bytes literals cm strm data n | strm :=(allStrm next: size) readStream. header := self int32: strm. n := self string: strm. class := (n endsWith: ' class') ifTrue: [(System globals at: (n copyFrom: 1 to: n size - 6) asSymbol) class] ifFalse: [System globals at: n asSymbol]. message := self string: strm. bytes := self bytes: strm. data := self bytes: strm. literals := self readArrayLiteralsFrom: data at: 0. cm := CompiledMethod newMethod: bytes size header: header. cm replaceFrom: literals size + 1 * 4 + 1 to: cm size with: bytes startingAt: 1. 1 to: literals size do: [:i | cm literalAt: i put: (literals at: i)]. ^ {#methodDef. class. message asSymbol. cm}! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/16/2010 00:49'!read: strm | v | v := self int32: strm. "size + tag" (v digitAt: 1) = 254 ifTrue: [^ self readClassDef: strm size: (v bitShift: -8) - 4]. (v digitAt: 1) = 252 ifTrue: [^ self readMethodDef: strm size: (v bitShift: -8) - 4]. (v digitAt: 1) = 250 ifTrue: [^ self readDoIt: strm size: (v bitShift: -8) - 4]. (v digitAt: 1) = 248 ifTrue: [^ self readInit: strm size: (v bitShift: -8) - 4]. ^ nil! !!MBootStrapReader methodsFor: 'all' stamp: 'yo 12/12/2010 10:24 < yo 12/9/2010 00:49'!string: strm ^ (self bytes: strm) asString.! !