Smalltalk.st
changeset 70 73055652dd21
parent 62 e1b4369c61fb
child 77 6c38ca59927f
--- a/Smalltalk.st	Wed Mar 30 11:41:04 1994 +0200
+++ b/Smalltalk.st	Wed Mar 30 12:00:27 1994 +0200
@@ -14,7 +14,8 @@
        instanceVariableNames:''
        classVariableNames:'ExitBlocks CachedClasses SystemPath 
                            StartupClass StartupSelector StartupArguments
-                           CachedAbbreviations'
+                           CachedAbbreviations
+                           SilentLoading Initializing'
        poolDictionaries:''
        category:'System-Support'
 !
@@ -24,25 +25,55 @@
 COPYRIGHT (c) 1988 by Claus Gittinger
              All Rights Reserved
 
-This is one of the central classes in the system;
-it provides all system-startup, shutdown and maintenance support.
-Also global variables are kept here.
-
-As you will notice, this is NOT a Dictionary
- - my implementation of globals is totally different
-   (due to the need to be able to access globals from c-code as well).
-
-$Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.14 1994-02-25 13:05:29 claus Exp $
+$Header: /cvs/stx/stx/libbasic/Smalltalk.st,v 1.15 1994-03-30 10:00:11 claus Exp $
 '!
 
+"
+ dont depend on these being global - they will become
+ class variables of some class ...
+ Being global is a historical leftover ...
+"
 Smalltalk at:#ErrorNumber put:nil!
 Smalltalk at:#ErrorString put:nil!
 Smalltalk at:#Language put:#english!
 Smalltalk at:#LanguageTerritory put:#usa!
-Smalltalk at:#Initializing put:false!
-Smalltalk at:#SilentLoading put:false!
-Smalltalk at:#MemoryLimit put:nil!
-Smalltalk at:#SignalCatchBlock put:nil!
+
+!Smalltalk class methodsFor:'documentation'!
+
+documentation
+"
+    This is one of the central classes in the system;
+    it provides all system-startup, shutdown and maintenance support.
+    Also global variables are kept here.
+
+    As you will notice, this is NOT a Dictionary
+     - my implementation of globals is totally different
+       (due to the need to be able to access globals from c-code as well).
+    However, it provides the known enumeration protocol.
+    It may change to become a subclass of collection at some time ...
+
+    Instance variables:
+        				none - all handling is done in the VM
+
+    Class variables:
+        ExitBlocks      <Collection>    blocks to evaluate before system is
+                                        left. Not currently used.
+
+        CachedClasses   <Collection>    known classes (cached for faster enumeration)
+
+        SystemPath      <Collection>    path to search for system files (sources, bitmaps etc)
+
+        StartupClass    <Class>         class, which gets initial message 
+                                        (right after VM initialization)
+        StartupSelector <Symbol>        message sent to StartupClass
+
+        CachedAbbreviations
+			<Dictionary>	className to filename mappings
+
+        SilentLoading   <Boolean>       suppresses messages during fileIn and in compiler
+                                        (can be set to true from a customized main)
+"
+! !
 
 !Smalltalk class methodsFor:'time-versions'!
 
@@ -57,7 +88,7 @@
 minorVersion
     "return the minor version number"
 
-    ^ 9
+    ^ 10
 
     "Smalltalk minorVersion"
 !
@@ -85,7 +116,7 @@
 versionDate
     "return the version date"
 
-    ^ '18-feb-1994'
+    ^ '31-mar-1994'
 
     "Smalltalk versionDate"
 !      
@@ -101,6 +132,8 @@
 hello
     "return a greeting string"
 
+    "stupid: this should come from a resource file ..."
+
     (Language == #german) ifTrue:[
         ^ 'Willkommen bei SmallTalk/X version '
           , self version , ' vom ' , self versionDate
@@ -132,45 +165,57 @@
 
     self initGlobalsFromEnvironment.
 
-    "sorry - there are some, which MUST be initialized before ..
-     reason: if any error happens during init, we need Signals, Stdout etc. to be there"
-
+    "
+     sorry - there are some, which MUST be initialized before ..
+     reason: if any error happens during init, we need Signals, Stdout etc. to be there
+    "
     Object initialize.
     ExternalStream initialize.
     self initStandardStreams.
 
-    "sorry, path must be set before ...
-     reason: some classes need it during initialize (they might need resources, bitmaps etc)"
-
+    "
+     sorry, path must be set before ...
+     reason: some classes need it during initialize (they might need resources, bitmaps etc)
+    "
     self initSystemPath.
 
-    "must init display here - some classes (Color, Form) need it during initialize"
-
+    "
+     must init display here - some classes (Color, Form) need it during initialize
+    "
     Workstation notNil ifTrue:[
         Workstation initialize
     ].
 
-    "define low-level debugging tools - graphical classes are not prepared yet
-     to handle things ... - this will bring us into the MiniDebugger when an error occurs"
-
+    "
+     define low-level debugging tools - graphical classes are not prepared yet
+     to handle things ... 
+     - this will bring us into the MiniDebugger when an error occurs
+    "
     Inspector := MiniInspector.
     Debugger := MiniDebugger.
     Compiler := ByteCodeCompiler.
     Compiler isNil ifTrue:[
-        "this allows at least immediate evaluations for runtime systems without compiler"
+        "
+         ByteCodeCompiler is not in the system (i.e. has not been linked in)
+         this allows at least immediate evaluations for runtime systems without compiler
+         NOTICE: a parser is always needed, otherwise we cannot read resource files etc.
+        "
         Compiler := Parser
     ].
 
-    "now finally initialize all classes"
-
+    "
+     now finally initialize all classes
+    "
     self allBehaviorsDo:[:aClass |
-        "avoid never-ending story ..."
+        "
+         avoid never-ending story ...
+        "
         (aClass ~~ Smalltalk) ifTrue:[
             aClass initialize
         ]
     ].
     self initStandardTools.
-    self initInterrupts
+    self initInterrupts.
 
     "Smalltalk initialize"
 !
@@ -180,12 +225,14 @@
 
     |envString firstChar i langString terrString|
 
-    "extract Language and LanguageTerritory from LANG variable.
+    "
+     extract Language and LanguageTerritory from LANG variable.
      the language and territory must not be abbreviated,
      valid is for example: english_usa
                            english
                            german
-                           german_austria"
+                           german_austria
+    "
 
     envString := OperatingSystem getEnvironment:'LANG'.
     envString notNil ifTrue:[
@@ -201,6 +248,11 @@
         LanguageTerritory := terrString asSymbol
     ].
 
+    "
+     this too is a leftover - once all refs to View3D
+     are removed, this will vanish ...
+     (please use: View>>defaultStyle:)
+    "
     envString := OperatingSystem getEnvironment:'VIEW3D'.
     envString notNil ifTrue:[
         firstChar := (envString at:1) asLowercase.
@@ -259,28 +311,37 @@
 !
 
 initSystemPath
-    "setup path to search for system files.
+    "setup path where system files are searched for.
      the default path is set to:
             .
             ..
-            $HOME
-            $HOME/.smalltalk
-            $SMALLTALK_LIBDIR
-            /usr/local/lib/smalltalk
-            /usr/lib/smalltalk
+            $HOME                    (if defined)
+            $HOME/.smalltalk         (if defined & existing)
+            $SMALLTALK_LIBDIR        (if defined & existing)
+            /usr/local/lib/smalltalk (if existing)
+            /usr/lib/smalltalk       (if existing)
+
+     of course, it is possible to add entries from the 'smalltalk.rc'
+     startup file; add expressions such as:
+            Smalltalk systemPath addFirst:'/foo/bar/baz'.
+        or: 
+            Smalltalk systemPath addLast:'/fee/foe/foo'.
     "
 
-    |p|
+    |p homePath|
+
+    homePath := OperatingSystem getHomeDirectory.
 
-    "the path is set to search files first locally
-     - this allows private stuff to override global stuff"
-
+    "
+     the path is set to search files first locally
+     - this allows private stuff to override global stuff
+    "
     SystemPath := OrderedCollection new.
     SystemPath add:'.'.
     SystemPath add:'..'.
-    SystemPath add:(OperatingSystem getHomeDirectory).
-    (OperatingSystem isDirectory:(OperatingSystem getHomeDirectory , '/.smalltalk')) ifTrue:[
-        SystemPath add:(OperatingSystem getHomeDirectory , '/.smalltalk')
+    SystemPath add:homePath.
+    (OperatingSystem isDirectory:(p := homePath , '/.smalltalk')) ifTrue:[
+        SystemPath add:p
     ].
     p := OperatingSystem getEnvironment:'SMALLTALK_LIBDIR'.
     p notNil ifTrue:[
@@ -306,15 +367,17 @@
     Initializing := true.
     Processor := ProcessorScheduler new.
 
-    "read patches- and rc-file, do not add things into change-file"
-
+    "
+     while reading patches- and rc-file, do not add things into change-file
+    "
     Class updateChanges:false.
 
     self fileIn:'patches'.
 
-    "look for a '-e filename' argument - this will force evaluation of
-     filename only, no standard startup"
-
+    "
+     look for a '-e filename' argument - this will force evaluation of
+     filename only, no standard startup
+    "
     idx := Arguments indexOf:'-e'.
     idx ~~ 0 ifTrue:[
         self fileIn:(Arguments at:idx + 1).
@@ -328,19 +391,22 @@
 
     Class updateChanges:true.
 
-    SilentLoading ifFalse:[
+    (SilentLoading == true) ifFalse:[   "i.e. undefined counts as false" 
         Transcript showCr:(self hello).
         Transcript showCr:(self copyright).
-        Transcript cr
+        Transcript cr.
+
+"/        DemoMode ifTrue:[
+"/            Transcript showCr:'*** Restricted use:                              ***'.
+"/            Transcript showCr:'*** This program may be used for education only. ***'.
+"/            Transcript showCr:'*** Please read the files COPYRIGHT and LINCENSE ***'.
+"/            Transcript showCr:'*** for more details.                            ***'.
+"/            Transcript cr.
+"/        ].
     ].
 
     Initializing := false.
 
-    "do not expect to get things fixed by setting it to false ... :-)"
-    DemoMode ifTrue:[
-        Transcript showCr:'    *** Unlicensed demo mode with restrictions ***'
-    ].
-
     "let display install itself into Processors dispatch"
     Display notNil ifTrue:[
         Display startDispatch.
@@ -419,10 +485,18 @@
         Transcript := Stderr
     ].
 
-    Transcript cr.
-    Transcript showCr:('Smalltalk restarted from:' , ImageName).
-    DemoMode ifTrue:[
-        Transcript showCr:'    *** Unlicensed demo mode with restrictions ***'
+    (SilentLoading == true) ifFalse:[
+        Transcript cr.
+        Transcript showCr:('Smalltalk restarted from:' , ImageName).
+	Transcript cr.
+
+"/        DemoMode ifTrue:[
+"/            Transcript showCr:'*** Restricted use:                              ***'.
+"/            Transcript showCr:'*** This program may be used for education only. ***'.
+"/            Transcript showCr:'*** Please read the files COPYRIGHT and LINCENSE ***'.
+"/            Transcript showCr:'*** for more details.                            ***'.
+"/	    Transcript cr.
+"/        ].
     ].
 
     "
@@ -467,8 +541,6 @@
     "main dispatching loop - exits with true for a bad exit (to restart),
      false for real exit."
 
-    Smalltalk at:#SignalCatchBlock put:[^ true].
-
     "if view-classes exist, start dispatching;
      otherwise go into a read-eval-print loop"
 
@@ -496,10 +568,43 @@
     '' printNewline
 ! !
 
+!Smalltalk class methodsFor:'startup'!
+
+startupClass:aClass selector:aSymbol arguments:anArrayOrNil
+    "set the class, selector and arguments to be performed when smalltalk
+     starts. Setting those before saving a snapshot, will make the saved
+     image come up executing your application (instead of the normal mainloop)"
+
+    StartupClass := aClass.
+    StartupSelector := aSymbol.
+    StartupArguments := anArrayOrNil
+!
+
+startupClass
+    "return the class, that will get the start message when smalltalk
+     starts and its non-nil. Usually this is nil, but saving an image 
+     with a non-nil StartupClass allows stand-alone applications"
+
+    ^ StartupClass
+!
+
+startupSelector
+    "return the selector, that will be sent to StartupClass"
+
+    ^ StartupSelector
+!
+
+startupArguments
+    "return the arguments passed to StartupClass"
+
+    ^ StartupArguments
+! !
+
 !Smalltalk class methodsFor:'accessing'!
 
 at:aKey
-    "retrieve the value stored under aKey, a symbol"
+    "retrieve the value stored under aKey, a symbol 
+     - return nil if not present"
 
 %{  /* NOCONTEXT */
     extern OBJ _GETGLOBAL();
@@ -620,7 +725,7 @@
      cleanup in stand alone applications."
 
     ExitBlocks isNil ifTrue:[
-        ExitBlocks := Array with:aBlock
+        ExitBlocks := OrderedCollection with:aBlock
     ] ifFalse:[
         ExitBlocks add:aBlock
     ]
@@ -634,47 +739,109 @@
             aBlock value
         ]
     ].
-%{
-    mainExit(0);
-%}
-.
     OperatingSystem exit
 
     "Smalltalk exit"
 !
 
 sleep:aDelay
-    "wait for aDelay seconds"
+    "wait for aDelay seconds.
+     WARNING: this is historical leftover and will be removed"
 
     OperatingSystem sleep:aDelay
 ! !
 
+!Smalltalk class methodsFor:'message control'!
+
+silentLoading:aBoolean
+    "allows access to the Silentloading class variable, which controls
+     messages from all kinds of system onto the transcript.
+     You can save a snapshot with this flag set to true, which makes
+     the image come up silent. Can also be set, to read in files unlogged."
+
+    |prev|
+
+    prev := SilentLoading.
+    SilentLoading := aBoolean.
+    ^ prev
+!
+
+silentLoading
+    "returns the Silentloading class variable."
+
+     ^ SilentLoading
+! !
+
 !Smalltalk class methodsFor:'debugging'!
 
+debugBreakPoint
+    "call the dummy debug function, on which a breakpoint
+     can be put in adb, sdb, dbx or gdb.
+     This method will not be present in the future."
+%{
+    _PATCHUPCONTEXTS(__context);
+    debugBreakPoint();
+%}
+!
+
 printStackBacktrace
-    "print a stack backtrace"
+    "print a stack backtrace - then continue.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
 
 %{
     printStack(__context);
 %}
+    "Smalltalk printStackBacktrace"
+!
+
+fatalAbort:aMessage
+    "report a fatal-error; print a stack backtrace and exit with core dump"
+
+%{
+    char *msg;
+
+    if (__isString(aMessage))
+        msg = _stringVal(aMessage);
+    else
+        msg = "fatalAbort";
+
+    fatal0(__context, msg);
+    /* NEVER RETURNS */
+%}
 !
 
 fatalAbort
-    "abort program and dump core"
+    "report a fatal-error, print a stack backtrace and exit with core dump"
 %{
-    fatal0(__context, "abort");
+    fatal0(__context, "fatalAbort");
+    /* NEVER RETURNS */
+%}
+!
+
+exitWithCoreDump
+    "abort program and dump core"
+
+%{  /* NOCONTEXT */
+    abort();
+    /* NEVER RETURNS */
 %}
 !
 
 statistic
-    "print some statistic data"
-%{
+    "print some statistic data.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
+
+%{  /* NOCONTEXT */
     statistic();
 %}
 !
 
 debugOn
-    "temporary - turns some tracing on"
+    "turns some tracing on.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
 
     "LookupTrace := true.   "
     MessageTrace := true.
@@ -683,7 +850,9 @@
 !
 
 debugOff
-    "temporary - turns tracing off"
+    "turns tracing off.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
 
     LookupTrace := nil.    
     MessageTrace := nil
@@ -691,18 +860,22 @@
 !
 
 executionDebugOn
-    "temporary - turns tracing of interpreter on"
+    "turns tracing of interpreter on.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
 
     ExecutionTrace := true
 !
 
 executionDebugOff
-    "temporary - turns tracing of interpreter off"
+    "turns tracing of interpreter off.
+     WARNING: this method is for debugging only 
+              it may be removed without notice"
 
     ExecutionTrace := nil
 ! !
 
-!Smalltalk class methodsFor:'looping'!
+!Smalltalk class methodsFor:'enumeration'!
 
 do:aBlock
     "evaluate the argument, aBlock for all values in the Smalltalk dictionary"
@@ -718,19 +891,6 @@
 %}
 !
 
-allBehaviorsDo:aBlock
-    "evaluate the argument, aBlock for all classes in the system"
-
-    self allClasses do:aBlock
-!
-
-allClassesDo:aBlock
-    "evaluate the argument, aBlock for all classes in the system.
-     Backward compatibility - use allBehaviorsDo: for ST-80 compatibility."
-
-    ^ self allBehaviorsDo:aBlock
-!
-
 associationsDo:aBlock
     "evaluate the argument, aBlock for all key/value pairs 
      in the Smalltalk dictionary"
@@ -748,6 +908,19 @@
     self allKeysDo:[:aKey |
         aBlock value:aKey value:(self at:aKey)
     ]
+!
+
+allBehaviorsDo:aBlock
+    "evaluate the argument, aBlock for all classes in the system"
+
+    self allClasses do:aBlock
+!
+
+allClassesDo:aBlock
+    "evaluate the argument, aBlock for all classes in the system.
+     Backward compatibility - use allBehaviorsDo: for ST-80 compatibility."
+
+    ^ self allBehaviorsDo:aBlock
 ! !
 
 !Smalltalk class methodsFor:'queries'!
@@ -755,7 +928,7 @@
 numberOfGlobals
     "return the number of global variables in the system"
 
-    |tally|
+    |tally "{ Class: SmallInteger }" |
 
     tally := 0.
     self do:[:obj | tally := tally + 1].
@@ -777,7 +950,7 @@
 
 references:anObject
     "return true, if I refer to the argument, anObject
-     must be reimplemented since Smalltalk is no real collection"
+     must be reimplemented since Smalltalk is no real collection."
 
     self do:[:o |
         (o == anObject) ifTrue:[^ true]
@@ -789,10 +962,10 @@
     "return a collection of all classes in the system"
 
     CachedClasses isNil ifTrue:[
-        CachedClasses := IdentitySet new:400.
+        CachedClasses := IdentitySet new:500. 
         self do:[:anObject |
             anObject notNil ifTrue:[
-                (anObject isBehavior) ifTrue:[
+                anObject isBehavior ifTrue:[
                     CachedClasses add:anObject
                 ]
             ]
@@ -807,47 +980,11 @@
     "return a collection of all classNames in the system"
 
     ^ self allClasses collect:[:aClass | aClass name]
-!
 
-systemPath
-    "return a collection of directorynames, where smalltalk
-     looks for system files (usually in subdirs such as resources,
-     bitmaps, source etc.)"
-
-    ^ SystemPath
-!
-
-startupClass:aClass selector:aSymbol arguments:anArrayOrNil
-    "set the class, selector and arguments to be performed when smalltalk
-     starts. Setting those before saving a snapshot, will make the saved
-     image come up executing your application (instead of the normal mainloop)"
-
-    StartupClass := aClass.
-    StartupSelector := aSymbol.
-    StartupArguments := anArrayOrNil
-!
-
-startupClass
-    "return the class, that will get the start message when smalltalk
-     starts and its non-nil. Usually this is nil, but saving an image 
-     with a non-nil StartupClass allows stand-alone applications"
-
-    ^ StartupClass
-!
-
-startupSelector
-    "return the selector, that will be sent to StartupClass"
-
-    ^ StartupSelector
-!
-
-startupArguments
-    "return the arguments passed to StartupClass"
-
-    ^ StartupArguments
+    "Smalltalk classNames"
 ! !
 
-!Smalltalk class methodsFor:'system management'!
+!Smalltalk class methodsFor:'class management'!
 
 renameClass:aClass to:newName
     "rename aClass to newName"
@@ -926,15 +1063,17 @@
     ObjectMemory flushMethodCache.
 
     aClass addChangeRecordForClassRemove:oldName
-!
+! !
+
+!Smalltalk class methodsFor:'browsing'!
 
 browseChanges
     "startup a changes browser"
 
-    (self at:#ChangesBrowser) notNil ifTrue:[
+    ChangesBrowser notNil ifTrue:[
         ChangesBrowser start
     ] ifFalse:[
-        self error:'no ChangesBrowser'
+        self warn:'no ChangesBrowser built in'
     ]
 
     "Smalltalk browseChanges "
@@ -962,6 +1101,53 @@
     SystemBrowser browseAllCallsOn:aSelectorSymbol
 
     " Smalltalk browseAllCallsOn:#at:put: "
+! !
+
+!Smalltalk class methodsFor:'system management'!
+
+systemPath
+    "return a collection of directorynames, where smalltalk
+     looks for system files 
+     (usually in subdirs such as resources, bitmaps, source etc.)
+     see comment in Smalltalk>>initSystemPath."
+
+    ^ SystemPath
+!
+
+getSystemFileName:aFileName
+    "search aFileName in some standard places;
+     return the absolute filename or nil if none is found.
+     see comment in Smalltalk>>initSystemPath."
+
+    "credits for this method go to Markus ...."
+
+    |realName|
+
+    (aFileName startsWith:'/') ifTrue:[
+        "dont use path for absolute file names"
+
+        ^ aFileName
+    ].
+
+    SystemPath do:[:dirName |
+        (OperatingSystem isReadable:
+            (realName := dirName , '/' , aFileName)) 
+              ifTrue: [^ realName]].
+    ^ nil
+!
+
+systemFileStreamFor:aFileName
+    "search aFileName in some standard places;
+     return a readonly fileStream or nil if not found.
+     see comment in Smalltalk>>initSystemPath"
+
+    |aString|
+
+    aString := self getSystemFileName:aFileName.
+    aString notNil ifTrue:[
+        ^ FileStream readonlyFileNamed:aString
+    ].
+    ^ nil
 !
 
 readAbbreviations
@@ -990,23 +1176,15 @@
     ]
 !
 
-systemFileStreamFor:aFileName
-    "search aFileName in some standard places;
-     return a fileStream or nil if not found"
-
-    |aStream|
-
-    (aFileName startsWith:'/') ifTrue:[
-        "dont use path for absolute file names"
+abbreviations
+    "return a dictionary containing the classname-to-filename
+     mappings. (needed for sys5.3 users, where filenames are limited
+     to 14 chars)"
 
-        ^ FileStream readonlyFileNamed:aFileName
+    CachedAbbreviations isNil ifTrue:[
+	self readAbbreviations
     ].
-
-    SystemPath do:[:dirName |
-        aStream := FileStream readonlyFileNamed:(dirName , '/' , aFileName).
-        aStream notNil ifTrue:[^ aStream]
-    ].
-    ^ nil
+    ^ CachedAbbreviations
 !
 
 fileNameForClass:aClassName
@@ -1034,11 +1212,7 @@
 
     "look for abbreviation"
 
-    CachedAbbreviations isNil ifTrue:[
-        self readAbbreviations
-    ].
-
-    abbrev := CachedAbbreviations at:fileName ifAbsent:[nil].
+    abbrev := self abbreviations at:fileName ifAbsent:[nil].
     abbrev notNil ifTrue:[^ abbrev].
 
     "no abbreviation found - if its a short name, take it"
@@ -1055,29 +1229,27 @@
      or nil if no special translation applies. The given filename arg should
      NOT include any suffix such as '.st'."
 
-    CachedAbbreviations isNil ifTrue:[
-        self readAbbreviations
-    ].
-
-    ^ CachedAbbreviations keyAtValue:aFileName ifAbsent:[aFileName].
+    ^ self abbreviations keyAtValue:aFileName ifAbsent:[aFileName].
 
     "Smalltalk classNameForFile:'DrawObj'"
 !
 
 fileInClassObject:aClassName from:aFileName
-    "read in the named object file - look for it in some standard places;
-     return true if ok, false if failed"
-
-    |aStream|
+    "read in the named object file and dynamic-link it into the system
+     - look for it in some standard places;
+     return true if ok, false if failed."
 
+    "
+     check if the dynamic loader class is in
+    "
     ObjectFileLoader isNil ifTrue:[^ false].
-    aStream := self systemFileStreamFor:aFileName.
-    aStream isNil ifTrue:[^ false].
-    aStream close.
 
+    (self getSystemFileName:aFileName) isNil ifTrue:[^ false].
     ^ (ObjectFileLoader loadClass:aClassName fromObjectFile:aFileName) notNil
 
-    " Smalltalk fileInClassObject:'AbstractPath' from:'../goodies/Paths/AbstrPath.o' "
+    "
+     Smalltalk fileInClassObject:'AbstractPath' from:'../goodies/Paths/AbstrPath.o' 
+    "
 !
 
 fileIn:aFileName
@@ -1097,11 +1269,15 @@
 
 fileInChanges
     "read in the last changes file - bringing the system to the state it
-     had when left the last time"
+     had when left the last time.
+     WARNING: this method is rubbish: it should only read things after the
+              last '**snapshot**' - entry."
 
     |upd|
 
-    "tell Class to NOT update the changes file now ..."
+    "
+     tell Class to NOT update the changes file now ...
+    "
     upd := Class updateChanges:false.
     [self fileIn:'changes'] valueNowOrOnUnwindDo:[Class updateChanges:upd]
 
@@ -1110,13 +1286,21 @@
 
 fileInClass:aClassName
     "find a source/object file for aClassName and -if found - load it.
-     search is in some standard places"
+     search is in some standard places trying driver, object and finally source.
+     The file is first searched for using the class name, then the abbreviated name."
 
     |fName newClass upd ok|
 
     upd := Class updateChanges:false.
     [
+        "
+         first, look for a loader-driver file (in fileIn/...)
+        "
         ok := self fileIn:('fileIn/' , aClassName , '.ld').
+
+        "
+         then, if dynamic linking is available, look for a shared binary/binary
+        "
         ObjectFileLoader notNil ifTrue:[
             ok ifFalse:[
                 ok := self fileInClassObject:aClassName from:('binary/' , aClassName, '.so').
@@ -1125,12 +1309,24 @@
                 ok := self fileInClassObject:aClassName from:('binary/' , aClassName, '.o').
             ].
         ].
+
+        "
+         if that did not work, look for an st-source file ...
+        "
         ok ifFalse:[
             ok := self fileIn:(aClassName , '.st')
         ].
+
+        "
+         ... and in the standard source-directory
+        "
         ok ifFalse:[
             ok := self fileIn:('source/' , aClassName , '.st')
         ].
+
+        "
+         nope - repeat with an abbreviated name
+        "
         ok ifFalse:[
             fName := self fileNameForClass:aClassName.
             fName notNil ifTrue:[
@@ -1153,41 +1349,42 @@
         ]
     ] valueNowOrOnUnwindDo:[Class updateChanges:upd].
     newClass := self at:(aClassName asSymbol).
-    (newClass notNil and:[newClass implements:#initialize]) ifTrue:[newClass initialize]
+    newClass notNil ifTrue:[newClass initialize]
 ! !
 
 !Smalltalk class methodsFor: 'binary storage'!
 
 addGlobalsTo: globalDictionary manager: manager
-    | pools |
-    pools _ Set new.
-    self associationsDo: [:assoc|
+    |pools|
+
+    pools := Set new.
+    self associationsDo:[:assoc |
         assoc value == self ifFalse:[
-            assoc value isClass ifTrue: [
-                assoc value addGlobalsTo: globalDictionary manager: manager.
-                "pools addAll: assoc value sharedPools"
-            ] ifFalse: [
-                globalDictionary at: assoc put: self
+            assoc value isClass ifTrue:[
+                assoc value addGlobalsTo:globalDictionary manager:manager.
+		pools addAll:assoc value sharedPools
+            ] ifFalse:[
+                globalDictionary at:assoc put:self
             ].
             assoc value isNil ifFalse:[
-                globalDictionary at: assoc value put: self
+                globalDictionary at:assoc value put:self
             ]
         ]
     ].
 
-    pools do: [:poolDictionary|
-        poolDictionary addGlobalsTo: globalDictionary manager: manager
+    pools do:[:poolDictionary|
+        poolDictionary addGlobalsTo:globalDictionary manager:manager
     ]
 !
 
 storeBinaryDefinitionOf: anObject on: stream manager: manager
-    | string |
+    |string|
 
-    anObject class == Association ifTrue: [
+    anObject class == Association ifTrue:[
         string := 'Smalltalk associationAt: ', anObject key storeString
     ] ifFalse: [
         string := 'Smalltalk at: ', (self keyAtValue: anObject) storeString
     ].
-    stream nextNumber: 2 put: string size.
-    string do: [:char| stream nextPut: char asciiValue]
+    stream nextNumber:2 put:string size.
+    string do:[:char | stream nextPut:char asciiValue]
 ! !