care for position-error when extracting source
authorClaus Gittinger <cg@exept.de>
Thu, 09 Apr 1998 13:29:02 +0200
changeset 3370 be1b59238c4c
parent 3369 55b7b83bf859
child 3371 1d8aa07c4b7f
care for position-error when extracting source
Method.st
--- a/Method.st	Wed Apr 08 12:33:55 1998 +0200
+++ b/Method.st	Thu Apr 09 13:29:02 1998 +0200
@@ -418,70 +418,70 @@
 "/            aStream close
 "/        ]
 
-	LastMethodSources notNil ifTrue:[
-	    junk := LastMethodSources at:self ifAbsent:nil.
-	    junk notNil ifTrue:[
-		^ junk
-	    ]
-	].
-
-	"/ keep the last source file open, because open/close
-	"/ operations maybe slow on NFS-mounted file systems.
-	"/ Since the reference to the file is weak, it will be closed
-	"/ automatically if the file is not referenced for a while. 
-	"/ Neat trick.
-
-	LastFileLock critical:[
-	    aStream := LastFileReference at:1.
-	    LastFileReference at:1 put:0.
-
-	    aStream == 0 ifTrue:[
-		aStream := nil.
-	    ] ifFalse:[
-		LastSourceFileName = source ifFalse:[
-		    aStream close.
-		    aStream := nil.
-		].
-	    ].
-	].
-
-	"/ a negative sourcePosition indicates
-	"/ that this is a local file (not to be requested
-	"/ via the sourceCodeManager)
-	"/ This kludge was added, to allow sourceCode to be
-	"/ saved to a local source file (i.e. 'st.src')
-	"/ and having a clue for which file is meant later.
-
-	sourcePosition < 0 ifTrue:[
-	    aStream := source asFilename readStream.
-	    aStream isNil ifTrue:[
-		fileName := Smalltalk getSourceFileName:source.
-		fileName notNil ifTrue:[
-		    aStream := fileName asFilename readStream.
-		].
-	    ].
-	].
-
-	aStream isNil ifTrue:[
-	    "/
-	    "/ if there is no SourceManager, look in standard places
-	    "/ first
-	    "/
-	    (mgr := Smalltalk at:#SourceCodeManager) isNil ifTrue:[
-		fileName := Smalltalk getSourceFileName:source.
-		fileName notNil ifTrue:[
-		    aStream := fileName asFilename readStream.
-		].
-	    ].
-
-	    aStream isNil ifTrue:[
-		"/
-		"/ nope - ask my class for the source (this also invokes the SCMgr)
-		"/
-		who := self who.
-		who notNil ifTrue:[
-		    myClass := who methodClass.
-		    aStream := myClass sourceStreamFor:source.
+        LastMethodSources notNil ifTrue:[
+            junk := LastMethodSources at:self ifAbsent:nil.
+            junk notNil ifTrue:[
+                ^ junk
+            ]
+        ].
+
+        "/ keep the last source file open, because open/close
+        "/ operations maybe slow on NFS-mounted file systems.
+        "/ Since the reference to the file is weak, it will be closed
+        "/ automatically if the file is not referenced for a while. 
+        "/ Neat trick.
+
+        LastFileLock critical:[
+            aStream := LastFileReference at:1.
+            LastFileReference at:1 put:0.
+
+            aStream == 0 ifTrue:[
+                aStream := nil.
+            ] ifFalse:[
+                LastSourceFileName = source ifFalse:[
+                    aStream close.
+                    aStream := nil.
+                ].
+            ].
+        ].
+
+        "/ a negative sourcePosition indicates
+        "/ that this is a local file (not to be requested
+        "/ via the sourceCodeManager)
+        "/ This kludge was added, to allow sourceCode to be
+        "/ saved to a local source file (i.e. 'st.src')
+        "/ and having a clue for which file is meant later.
+
+        sourcePosition < 0 ifTrue:[
+            aStream := source asFilename readStream.
+            aStream isNil ifTrue:[
+                fileName := Smalltalk getSourceFileName:source.
+                fileName notNil ifTrue:[
+                    aStream := fileName asFilename readStream.
+                ].
+            ].
+        ].
+
+        aStream isNil ifTrue:[
+            "/
+            "/ if there is no SourceManager, look in standard places
+            "/ first
+            "/
+            (mgr := Smalltalk at:#SourceCodeManager) isNil ifTrue:[
+                fileName := Smalltalk getSourceFileName:source.
+                fileName notNil ifTrue:[
+                    aStream := fileName asFilename readStream.
+                ].
+            ].
+
+            aStream isNil ifTrue:[
+                "/
+                "/ nope - ask my class for the source (this also invokes the SCMgr)
+                "/
+                who := self who.
+                who notNil ifTrue:[
+                    myClass := who methodClass.
+                    aStream := myClass sourceStreamFor:source.
 
 "/ the check below is no good -
 "/ the classes stream may be an HTTP-stream, cached fileStream
@@ -494,76 +494,80 @@
 "/                        aStream close.
 "/                        aStream := nil.
 "/                    ]
-		].
-
-		aStream isNil ifTrue:[
-		    "/
-		    "/ nope - look in standard places 
-		    "/ (if there is a source-code manager - otherwise, we already did that)
-		    "/
-		    mgr notNil ifTrue:[
-			fileName := Smalltalk getSourceFileName:source.
-			fileName notNil ifTrue:[
-			    aStream := fileName asFilename readStream.
-			]
-		    ].
-
-		    "/
-		    "/ final chance: try current directory
-		    "/
-		    aStream isNil ifTrue:[
-			aStream := source asFilename readStream.
-		    ]
-		].
-
-		(aStream isNil and:[who isNil and:[source notNil]]) ifTrue:[
-		    "/
-		    "/ mhmh - seems to be a method which used to be in some
-		    "/ class, but has been overwritten by another or removed.
-		    "/ (i.e. it has no containing class anyMore)
-		    "/ try to guess the class from the sourceFileName.
-		    "/ and retry.
-		    "/
-		    className := Smalltalk classNameForFile:source.
-		    className knownAsSymbol ifTrue:[
-			myClass := Smalltalk at:className asSymbol ifAbsent:nil.
-			myClass notNil ifTrue:[
-			    aStream := myClass sourceStreamFor:source.
-			]
-		    ]
-		]                
-	    ]
-	].
-
-	aStream notNil ifTrue:[
-	    aStream position:sourcePosition abs.
-	    junk := aStream nextChunk.
-
-	    "
-	     keep a weak reference - it may be needed again soon ...
-	    "
-	    LastFileLock critical:[
-		(LastFileReference at:1) == 0 ifTrue:[
-		    LastFileReference at:1 put:aStream.
-		    LastSourceFileName := source.
-		] ifFalse:[
-		    aStream close.
-		].
-	    ].
-	]
+                ].
+
+                aStream isNil ifTrue:[
+                    "/
+                    "/ nope - look in standard places 
+                    "/ (if there is a source-code manager - otherwise, we already did that)
+                    "/
+                    mgr notNil ifTrue:[
+                        fileName := Smalltalk getSourceFileName:source.
+                        fileName notNil ifTrue:[
+                            aStream := fileName asFilename readStream.
+                        ]
+                    ].
+
+                    "/
+                    "/ final chance: try current directory
+                    "/
+                    aStream isNil ifTrue:[
+                        aStream := source asFilename readStream.
+                    ]
+                ].
+
+                (aStream isNil and:[who isNil and:[source notNil]]) ifTrue:[
+                    "/
+                    "/ mhmh - seems to be a method which used to be in some
+                    "/ class, but has been overwritten by another or removed.
+                    "/ (i.e. it has no containing class anyMore)
+                    "/ try to guess the class from the sourceFileName.
+                    "/ and retry.
+                    "/
+                    className := Smalltalk classNameForFile:source.
+                    className knownAsSymbol ifTrue:[
+                        myClass := Smalltalk at:className asSymbol ifAbsent:nil.
+                        myClass notNil ifTrue:[
+                            aStream := myClass sourceStreamFor:source.
+                        ]
+                    ]
+                ]                
+            ]
+        ].
+
+        aStream notNil ifTrue:[
+            Stream positionErrorSignal handle:[:ex |
+                ^ nil
+            ] do:[
+                aStream position:sourcePosition abs.
+            ].
+            junk := aStream nextChunk.
+
+            "
+             keep a weak reference - it may be needed again soon ...
+            "
+            LastFileLock critical:[
+                (LastFileReference at:1) == 0 ifTrue:[
+                    LastFileReference at:1 put:aStream.
+                    LastSourceFileName := source.
+                ] ifFalse:[
+                    aStream close.
+                ].
+            ].
+        ]
     ].
 
     junk notNil ifTrue:[
-	LastMethodSources isNil ifTrue:[
-	    LastMethodSources := CacheDictionary new:20.
-	].
-	LastMethodSources at:self put:junk.
+        LastMethodSources isNil ifTrue:[
+            LastMethodSources := CacheDictionary new:20.
+        ].
+        LastMethodSources at:self put:junk.
     ].
 
     ^ junk
 
     "Modified: / 7.1.1997 / 16:20:09 / stefan"
-    "Modified: / 9.1.1998 / 14:54:14 / cg"
+    "Modified: / 9.4.1998 / 12:37:41 / cg"
 !
 
 source:aString
@@ -1881,6 +1885,23 @@
 
 !
 
+hasResource
+    "return true if the method had a <resource> definition in its
+     source. This was found in ST-80 methods, and currently not supported
+     by ST/X (except for remembering this flag).
+     It can be used to find resource-flagged methods quicker."
+
+%{  /* NOCONTEXT */
+
+#ifdef F_RESOURCE
+    RETURN (((INT)__INST(flags) & __MASKSMALLINT(F_RESOURCE)) ? true : false);
+#endif
+%}.
+    ^ false
+
+
+!
+
 homeMethod
     "for common protocol with blocks: if the receiver is a method,
      return the receiver; otherwise, if its a block, return its home
@@ -2519,6 +2540,6 @@
 !Method class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Method.st,v 1.157 1998-03-20 15:27:27 tz Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Method.st,v 1.158 1998-04-09 11:29:02 cg Exp $'
 ! !
 Method initialize!