[squeak-dev] The Trunk: Collections-fbs.553.mcz
Frank Shearar
frank.shearar at gmail.com
Mon Dec 30 22:19:46 UTC 2013
On 30 December 2013 20:58, Chris Muller <asqueaker at gmail.com> wrote:
> One thing we've been saying is that a small-kernel of a Smalltalk
> system should be able to expand itself. So, I'm just wondering
> whether file-in should not be part of Kernel or whether System is
> destined to be part of that small-kernel Smalltalk system..?
That's a discussion for another day (at least as far as I'm
concerned). All I'm doing is clarifying the onion skins, and I can
only do that by breaking the cycles. There's no necessity for
Collections to depend on System. It just looks like I keep picking on
System because it's on one end of most of the cycles. Or was, until I
started snipping.
frank
> On Sat, Dec 28, 2013 at 4:22 PM, <commits at source.squeak.org> wrote:
>> Frank Shearar uploaded a new version of Collections to project The Trunk:
>> http://source.squeak.org/trunk/Collections-fbs.553.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Collections-fbs.553
>> Author: fbs
>> Time: 28 December 2013, 10:22:03.872 pm
>> UUID: 30896006-fd4c-fc47-803c-572d1c1779ad
>> Ancestors: Collections-nice.552
>>
>> Move all of Collections' file in/out logic to System, where the other file in/out logic lives (in System-Object Storage and friends).
>>
>> =============== Diff against Collections-nice.552 ===============
>>
>> Item was removed:
>> - ----- Method: Array>>objectForDataStream: (in category 'file in/out') -----
>> - objectForDataStream: refStrm
>> - | dp |
>> - "I am about to be written on an object file. If I am one of two shared global arrays, write a proxy instead."
>> -
>> - self == (TextConstants at: #DefaultTabsArray) ifTrue: [
>> - dp := DiskProxy global: #TextConstants selector: #at: args: #(DefaultTabsArray).
>> - refStrm replace: self with: dp.
>> - ^ dp].
>> - self == (TextConstants at: #DefaultMarginTabsArray) ifTrue: [
>> - dp := DiskProxy global: #TextConstants selector: #at: args: #(DefaultMarginTabsArray).
>> - refStrm replace: self with: dp.
>> - ^ dp].
>> - ^ super objectForDataStream: refStrm!
>>
>> Item was removed:
>> - ----- Method: Association>>objectForDataStream: (in category 'objects from disk') -----
>> - objectForDataStream: refStrm
>> - | dp |
>> - "I am about to be written on an object file. If I am a known global, write a proxy that will hook up with the same resource in the destination system."
>> -
>> - ^ (Smalltalk globals associationAt: key ifAbsent: [nil]) == self
>> - ifTrue: [dp := DiskProxy global: #Smalltalk selector: #associationOrUndeclaredAt:
>> - args: (Array with: key).
>> - refStrm replace: self with: dp.
>> - dp]
>> - ifFalse: [self]!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>backChunk (in category 'fileIn/Out') -----
>> - backChunk
>> - "Answer the contents of the receiver back to the previous terminator character. Doubled terminators indicate an embedded terminator character."
>> -
>> - | output character |
>> - output := WriteStream on: (String new: 1000).
>> - self back. "oldBack compatibility"
>> - [ (character := self back) == nil ] whileFalse: [
>> - character == $!! ifTrue: [
>> - self back == $!! ifFalse: [
>> - self skip: 2. "oldBack compatibility"
>> - ^output contents reversed ] ].
>> - output nextPut: character].
>> - self skip: 1. "oldBack compatibility"
>> - ^output contents reversed!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>basicNextChunk (in category 'fileIn/Out') -----
>> - basicNextChunk
>> - "Answer the contents of the receiver, up to the next terminator character. Doubled terminators indicate an embedded terminator character."
>> - | terminator out ch |
>> - terminator := $!!.
>> - out := WriteStream on: (String new: 1000).
>> - self skipSeparators.
>> - [(ch := self next) == nil] whileFalse: [
>> - (ch == terminator) ifTrue: [
>> - self peek == terminator ifTrue: [
>> - self next. "skip doubled terminator"
>> - ] ifFalse: [
>> - ^ out contents "terminator is not doubled; we're done!!"
>> - ].
>> - ].
>> - out nextPut: ch.
>> - ].
>> - ^ out contents!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>checkForPreamble: (in category 'fileIn/Out') -----
>> - checkForPreamble: chunk
>> - ((chunk beginsWith: '"Change Set:') and: [ChangeSet current preambleString == nil])
>> - ifTrue: [ChangeSet current preambleString: chunk].
>> - ((chunk beginsWith: '"Postscript:') and: [ChangeSet current postscriptString == nil])
>> - ifTrue: [ChangeSet current postscriptString: chunk].
>> -
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>command: (in category 'fileIn/Out') -----
>> - command: aString
>> - "Overridden by HtmlFileStream to append commands directly without translation. 4/5/96 tk"
>> - "We ignore any HTML commands. Do nothing"!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>copyMethodChunkFrom: (in category 'fileIn/Out') -----
>> - copyMethodChunkFrom: aStream
>> - "Copy the next chunk from aStream (must be different from the receiver)."
>> - | chunk |
>> - chunk := aStream nextChunkText.
>> - chunk runs values size = 1 "Optimize for unembellished text"
>> - ifTrue: [self nextChunkPut: chunk asString]
>> - ifFalse: [self nextChunkPutWithStyle: chunk]!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>copyMethodChunkFrom:at: (in category 'fileIn/Out') -----
>> - copyMethodChunkFrom: aStream at: pos
>> - "Copy the next chunk from aStream (must be different from the receiver)."
>> - | chunk |
>> - aStream position: pos.
>> - chunk := aStream nextChunkText.
>> - chunk runs values size = 1 "Optimize for unembellished text"
>> - ifTrue: [self nextChunkPut: chunk asString]
>> - ifFalse: [self nextChunkPutWithStyle: chunk]!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>copyPreamble:from:at: (in category 'filein/out') -----
>> - copyPreamble: preamble from: aStream at: pos
>> - "Look for a changeStamp for this method by peeking backward.
>> - Write a method preamble, with that stamp if found."
>> - | terminator last50 stamp i |
>> - terminator := $!!.
>> -
>> - "Look back to find stamp in old preamble, such as...
>> - Polygon methodsFor: 'private' stamp: 'di 6/25/97 21:42' prior: 34957598!! "
>> - aStream position: pos.
>> - aStream backChunk. "to beginning of method"
>> - last50 := aStream backChunk. "to get preamble"
>> - aStream position: pos.
>> - stamp := String new.
>> - (i := last50
>> - findLastOccurrenceOfString: 'stamp:'
>> - startingAt: 1) > 0 ifTrue:
>> - [ stamp := (last50
>> - copyFrom: i + 8
>> - to: last50 size) copyUpTo: $' ].
>> -
>> - "Write the new preamble, with old stamp if any."
>> - self
>> - cr;
>> - nextPut: terminator.
>> - self nextChunkPut: (String streamContents:
>> - [ :strm |
>> - strm nextPutAll: preamble.
>> - stamp size > 0 ifTrue:
>> - [ strm
>> - nextPutAll: ' stamp: ';
>> - print: stamp ] ]).
>> - self cr!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>decodeString:andRuns: (in category 'fileIn/Out') -----
>> - decodeString: string andRuns: runsRaw
>> -
>> - | strm runLength runValues newString index |
>> - strm := runsRaw readStream.
>> - (strm peekFor: $( ) ifFalse: [^ nil].
>> - runLength := OrderedCollection new.
>> - [strm skipSeparators.
>> - strm peekFor: $)] whileFalse:
>> - [runLength add: (Number readFrom: strm)].
>> -
>> - runValues := OrderedCollection new.
>> - [strm atEnd not] whileTrue:
>> - [runValues add: (Number readFrom: strm).
>> - strm next.].
>> -
>> - newString := WideString new: string size.
>> - index := 1.
>> - runLength with: runValues do: [:length :leadingChar |
>> - index to: index + length - 1 do: [:pos |
>> - newString at: pos put: (Character leadingChar: leadingChar code: (string at: pos) charCode).
>> - ].
>> - index := index + length.
>> - ].
>> -
>> - ^ newString.
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>decodeStyle:version: (in category 'fileIn/Out') -----
>> - decodeStyle: runsObjData version: styleVersion
>> - "Decode the runs array from the ReferenceStream it is stored in."
>> - "Verify that the class mentioned have the same inst vars as we have now"
>> -
>> - | structureInfo |
>> - styleVersion = RemoteString currentTextAttVersion ifTrue: [
>> - "Matches our classes, no need for checking"
>> - ^ (ReferenceStream on: runsObjData) next].
>> - structureInfo := RemoteString structureAt: styleVersion. "or nil"
>> - "See SmartRefStream instVarInfo: for dfn"
>> - ^ SmartRefStream read: runsObjData withClasses: structureInfo!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>fileIn (in category 'fileIn/Out') -----
>> - fileIn
>> - "This is special for reading expressions from text that has been formatted
>> - with exclamation delimitors. The expressions are read and passed to the
>> - Compiler. Answer the result of compilation."
>> -
>> - ^ self fileInAnnouncing: 'Reading ' , self name!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>fileInAnnouncing: (in category 'fileIn/Out') -----
>> - fileInAnnouncing: announcement
>> - "This is special for reading expressions from text that has been formatted
>> - with exclamation delimitors. The expressions are read and passed to the
>> - Compiler. Answer the result of compilation. Put up a progress report with
>> - the given announcement as the title."
>> -
>> - | val |
>> - announcement
>> - displayProgressFrom: 0
>> - to: self size
>> - during:
>> - [:bar |
>> - [self atEnd] whileFalse:
>> - [bar value: self position.
>> - self skipSeparators.
>> -
>> - [ | chunk |
>> - val := (self peekFor: $!!)
>> - ifTrue: [(Compiler evaluate: self nextChunk logged: false) scanFrom: self]
>> - ifFalse:
>> - [chunk := self nextChunk.
>> - self checkForPreamble: chunk.
>> - Compiler evaluate: chunk logged: true]]
>> - on: InMidstOfFileinNotification
>> - do: [:ex | ex resume: true].
>> - self skipStyleChunk].
>> - self close].
>> - "Note: The main purpose of this banner is to flush the changes file."
>> - Smalltalk logChange: '----End fileIn of ' , self name , '----'.
>> - self flag: #ThisMethodShouldNotBeThere. "sd"
>> - ^val!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>fileInFor:announcing: (in category 'fileIn/Out') -----
>> - fileInFor: client announcing: announcement
>> - "This is special for reading expressions from text that has been formatted
>> - with exclamation delimitors. The expressions are read and passed to the
>> - Compiler. Answer the result of compilation. Put up a progress report with
>> - the given announcement as the title.
>> - Does NOT handle preambles or postscripts specially."
>> - | val |
>> - announcement
>> - displayProgressFrom: 0
>> - to: self size
>> - during:
>> - [:bar |
>> - [self atEnd]
>> - whileFalse:
>> - [bar value: self position.
>> - self skipSeparators.
>> - [ | chunk |
>> - val := (self peekFor: $!!) ifTrue: [
>> - (Compiler evaluate: self nextChunk for: client logged: false) scanFrom: self
>> - ] ifFalse: [
>> - chunk := self nextChunk.
>> - self checkForPreamble: chunk.
>> - Compiler evaluate: chunk for: client logged: true ].
>> - ] on: InMidstOfFileinNotification
>> - do: [ :ex | ex resume: true].
>> - self atEnd ifFalse: [ self skipStyleChunk ]].
>> - self close].
>> - "Note: The main purpose of this banner is to flush the changes file."
>> - Smalltalk logChange: '----End fileIn of ' , self name , '----'.
>> - ^ val!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>fileInSilentlyAnnouncing: (in category 'fileIn/Out') -----
>> - fileInSilentlyAnnouncing: announcement
>> - "This is special for reading expressions from text that has been formatted
>> - with exclamation delimitors. The expressions are read and passed to the
>> - Compiler. Answer the result of compilation. Put up a progress report with
>> - the given announcement as the title."
>> -
>> - | val chunk |
>> - [self atEnd] whileFalse:
>> - [self skipSeparators.
>> -
>> - [val := (self peekFor: $!!)
>> - ifTrue: [(Compiler evaluate: self nextChunk logged: false) scanFrom: self]
>> - ifFalse:
>> - [chunk := self nextChunk.
>> - self checkForPreamble: chunk.
>> - Compiler evaluate: chunk logged: true]]
>> - on: InMidstOfFileinNotification
>> - do: [:ex | ex resume: true].
>> - self skipStyleChunk].
>> - self close.
>> - "Note: The main purpose of this banner is to flush the changes file."
>> - Smalltalk logChange: '----End fileIn of ' , self name , '----'.
>> - self flag: #ThisMethodShouldNotBeThere. "sd"
>> - SystemNavigation new allBehaviorsDo:
>> - [:cl |
>> - cl
>> - removeSelectorSimply: #DoIt;
>> - removeSelectorSimply: #DoItIn:].
>> - ^val!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>header (in category 'fileIn/Out') -----
>> - header
>> - "If the stream requires a standard header, override this message. See HtmlFileStream"!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>nextChunk (in category 'fileIn/Out') -----
>> - nextChunk
>> - "Answer the contents of the receiver, up to the next terminator character. Doubled terminators indicate an embedded terminator character."
>> - | terminator out ch |
>> - terminator := $!!.
>> - out := WriteStream on: (String new: 1000).
>> - self skipSeparators.
>> - [(ch := self next) == nil] whileFalse: [
>> - (ch == terminator) ifTrue: [
>> - self peek == terminator ifTrue: [
>> - self next. "skip doubled terminator"
>> - ] ifFalse: [
>> - ^ self parseLangTagFor: out contents "terminator is not doubled; we're done!!"
>> - ].
>> - ].
>> - out nextPut: ch.
>> - ].
>> - ^ self parseLangTagFor: out contents.
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>nextChunkText (in category 'fileIn/Out') -----
>> - nextChunkText
>> - "Deliver the next chunk as a Text. Decode the following ]style[ chunk if present. Position at start of next real chunk."
>> - | string runs peek pos |
>> - "Read the plain text"
>> - string := self nextChunk.
>> -
>> - "Test for ]style[ tag"
>> - pos := self position.
>> - peek := self skipSeparatorsAndPeekNext.
>> - peek = $] ifFalse: [self position: pos. ^ string asText]. "no tag"
>> - (self upTo: $[) = ']style' ifFalse: [self position: pos. ^ string asText]. "different tag"
>> -
>> - "Read and decode the style chunk"
>> - runs := RunArray scanFrom: self basicNextChunk readStream.
>> -
>> - ^ Text basicNew setString: string setRunsChecking: runs.
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>parseLangTagFor: (in category 'fileIn/Out') -----
>> - parseLangTagFor: aString
>> -
>> - | string peek runsRaw pos |
>> - string := aString.
>> - "Test for ]lang[ tag"
>> - pos := self position.
>> - peek := self skipSeparatorsAndPeekNext.
>> - peek = $] ifFalse: [self position: pos. ^ string]. "no tag"
>> - (self upTo: $[) = ']lang' ifTrue: [
>> - runsRaw := self basicNextChunk.
>> - string := self decodeString: aString andRuns: runsRaw
>> - ] ifFalse: [
>> - self position: pos
>> - ].
>> - ^ string.
>> - !
>>
>> Item was changed:
>> + ----- Method: PositionableStream>>skipSeparators (in category 'positioning') -----
>> - ----- Method: PositionableStream>>skipSeparators (in category 'fileIn/Out') -----
>> skipSeparators
>> [self atEnd]
>> whileFalse:
>> [self next isSeparator ifFalse: [^ self position: self position-1]]!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>skipSeparatorsAndPeekNext (in category 'fileIn/Out') -----
>> - skipSeparatorsAndPeekNext
>> - "A special function to make nextChunk fast"
>> - | peek |
>> - [self atEnd]
>> - whileFalse:
>> - [(peek := self next) isSeparator
>> - ifFalse: [self position: self position-1. ^ peek]]!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>skipStyleChunk (in category 'fileIn/Out') -----
>> - skipStyleChunk
>> - "Get to the start of the next chunk that is not a style for the previous chunk"
>> -
>> - | pos |
>> - pos := self position.
>> - self skipSeparators.
>> - self peek == $]
>> - ifTrue: [(self upTo: $[) = ']text' "old -- no longer needed"
>> - "now positioned past the open bracket"
>> - ifFalse: [self nextChunk]] "absorb ]style[ and its whole chunk"
>> -
>> - ifFalse: [self position: pos] "leave untouched"
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>trailer (in category 'fileIn/Out') -----
>> - trailer
>> - "If the stream requires a standard trailer, override this message. See HtmlFileStream"!
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>unCommand (in category 'fileIn/Out') -----
>> - unCommand
>> - "If this read stream is at a <, then skip up to just after the next >. For removing html commands."
>> - | char |
>> - [self peek = $<] whileTrue: ["begin a block"
>> - [self atEnd == false and: [self next ~= $>]] whileTrue.
>> - "absorb characters"
>> - ].
>> - !
>>
>> Item was removed:
>> - ----- Method: PositionableStream>>verbatim: (in category 'fileIn/Out') -----
>> - verbatim: aString
>> - "Do not attempt to translate the characters. Use to override nextPutAll:"
>> - ^ self nextPutAll: aString!
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileInObjectAndCode (in category 'fileIn/Out') -----
>> - fileInObjectAndCode
>> - "This file may contain:
>> - 1) a fileIn of code
>> - 2) just an object in SmartReferenceStream format
>> - 3) both code and an object.
>> - File it in and return the object. Note that self must be a FileStream or RWBinaryOrTextStream. Maybe ReadWriteStream incorporate RWBinaryOrTextStream?"
>> - | refStream object |
>> - self text.
>> - self peek asciiValue = 4
>> - ifTrue: [ "pure object file"
>> - refStream := SmartRefStream on: self.
>> - object := refStream nextAndClose]
>> - ifFalse: [ "objects mixed with a fileIn"
>> - self fileIn. "reads code and objects, then closes the file"
>> - object := SmartRefStream scannedObject]. "set by side effect of one of the chunks"
>> - SmartRefStream scannedObject: nil. "clear scannedObject"
>> - ^ object!
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileNameEndsWith: (in category 'fileIn/Out') -----
>> - fileNameEndsWith: aString
>> - "See comment in FileStream fileNameEndsWith:"
>> -
>> - ^false!
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileOutChangeSet:andObject: (in category 'fileIn/Out') -----
>> - fileOutChangeSet: aChangeSetOrNil andObject: theObject
>> - "Write a file that has both the source code for the named class and an object as bits. Any instance-specific object will get its class written automatically."
>> -
>> - "An experimental version to fileout a changeSet first so that a project can contain its own classes"
>> -
>> -
>> - self setFileTypeToObject.
>> - "Type and Creator not to be text, so can attach correctly to an email msg"
>> - self header; timeStamp.
>> -
>> - aChangeSetOrNil ifNotNil: [
>> - aChangeSetOrNil fileOutPreambleOn: self.
>> - aChangeSetOrNil fileOutOn: self.
>> - aChangeSetOrNil fileOutPostscriptOn: self.
>> - ].
>> - self trailer. "Does nothing for normal files. HTML streams will have trouble with object data"
>> -
>> - "Append the object's raw data"
>> - (SmartRefStream on: self)
>> - nextPut: theObject; "and all subobjects"
>> - close. "also closes me"
>> - !
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileOutChanges (in category 'fileIn/Out') -----
>> - fileOutChanges
>> - "Append to the receiver a description of all class changes."
>> - Cursor write showWhile:
>> - [self header; timeStamp.
>> - ChangeSet current fileOutOn: self.
>> - self trailer; close]!
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileOutClass:andObject: (in category 'fileIn/Out') -----
>> - fileOutClass: extraClass andObject: theObject
>> - "Write a file that has both the source code for the named class and an object as bits. Any instance-specific object will get its class written automatically."
>> -
>> - | class srefStream |
>> - self setFileTypeToObject.
>> - "Type and Creator not to be text, so can attach correctly to an email msg"
>> - self text.
>> - self header; timeStamp.
>> -
>> - extraClass ifNotNil: [
>> - class := extraClass. "A specific class the user wants written"
>> - class sharedPools size > 0 ifTrue:
>> - [class shouldFileOutPools
>> - ifTrue: [class fileOutSharedPoolsOn: self]].
>> - class fileOutOn: self moveSource: false toFile: 0].
>> - self trailer. "Does nothing for normal files. HTML streams will have trouble with object data"
>> - self binary.
>> -
>> - "Append the object's raw data"
>> - srefStream := SmartRefStream on: self.
>> - srefStream nextPut: theObject. "and all subobjects"
>> - srefStream close. "also closes me"
>> - !
>>
>> Item was removed:
>> - ----- Method: ReadWriteStream>>fileOutClass:andObject:blocking: (in category 'fileIn/Out') -----
>> - fileOutClass: extraClass andObject: theObject blocking: anIdentDict
>> - "Write a file that has both the source code for the named class and an object as bits. Any instance-specific object will get its class written automatically. Accept a list of objects to map to nil or some other object (blockers). In addition to teh choices in each class's objectToStoreOnDataStream"
>> -
>> - | class srefStream |
>> - self setFileTypeToObject.
>> - "Type and Creator not to be text, so can attach correctly to an email msg"
>> - self header; timeStamp.
>> -
>> - extraClass ifNotNil: [
>> - class := extraClass. "A specific class the user wants written"
>> - class sharedPools size > 0 ifTrue:
>> - [class shouldFileOutPools
>> - ifTrue: [class fileOutSharedPoolsOn: self]].
>> - class fileOutOn: self moveSource: false toFile: 0].
>> - self trailer. "Does nothing for normal files. HTML streams will have trouble with object data"
>> -
>> - "Append the object's raw data"
>> - srefStream := SmartRefStream on: self.
>> - srefStream blockers: anIdentDict.
>> - srefStream nextPut: theObject. "and all subobjects"
>> - srefStream close. "also closes me"
>> - !
>>
>> Item was removed:
>> - ----- Method: SmartRefStream>>abstractStringx0 (in category '*Collections-Strings-conversion') -----
>> - abstractStringx0
>> -
>> - ^ String!
>>
>> Item was removed:
>> - ----- Method: SmartRefStream>>multiStringx0 (in category '*Collections-Strings-conversion') -----
>> - multiStringx0
>> -
>> - ^ WideString!
>>
>> Item was removed:
>> - ----- Method: SmartRefStream>>multiSymbolx0 (in category '*Collections-Strings-conversion') -----
>> - multiSymbolx0
>> -
>> - ^ WideSymbol!
>>
>>
>
More information about the Squeak-dev
mailing list
|