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