/usr/share/gnu-smalltalk/kernel/Namespace.st is in gnu-smalltalk-common 3.2.4-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | "======================================================================
|
| Namespace Method Definitions
|
|
======================================================================"
"======================================================================
|
| Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
| Written by Paolo Bonzini.
|
| This file is part of the GNU Smalltalk class library.
|
| The GNU Smalltalk class library is free software; you can redistribute it
| and/or modify it under the terms of the GNU Lesser General Public License
| as published by the Free Software Foundation; either version 2.1, or (at
| your option) any later version.
|
| The GNU Smalltalk class library is distributed in the hope that it will be
| useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
| General Public License for more details.
|
| You should have received a copy of the GNU Lesser General Public License
| along with the GNU Smalltalk class library; see the file COPYING.LIB.
| If not, write to the Free Software Foundation, 59 Temple Place - Suite
| 330, Boston, MA 02110-1301, USA.
|
======================================================================"
AbstractNamespace subclass: Namespace [
<shape: #pointer>
<category: 'Language-Implementation'>
<comment: 'I am a Namespace that has a super-namespace.'>
Current := nil.
Namespace class >> initialize [
"This actually is not needed, the job could be done in dict.c
(function namespace_new). But I'm lazy and I prefer to rely
on the Smalltalk implementation of IdentitySet."
<category: 'initialization'>
self allInstancesDo:
[:each |
each superspace isNil ifTrue: [each setSuperspace: Smalltalk].
each superspace subspaces add: each]
]
Namespace class >> new [
"Disabled - use #addSubspace: to create instances"
<category: 'disabling instance creation'>
SystemExceptions.WrongMessageSent signalOn: #new useInstead: #addSubspace:
]
Namespace class >> new: size [
"Disabled - use #addSubspace: to create instances"
<category: 'disabling instance creation'>
SystemExceptions.WrongMessageSent signalOn: #new: useInstead: #addSubspace:
]
Namespace class >> current [
"Answer the current namespace"
<category: 'accessing'>
Current isNil ifTrue: [Current := Smalltalk].
^Current
]
Namespace class >> current: aNamespaceOrClass [
"Set the current namespace to be aNamespace or, if it is a class,
its class pool (the Dictionary that holds class variables)."
"The primitive call is needed to inform the compiler"
<category: 'accessing'>
| namespace |
<primitive: VMpr_Namespace_setCurrent>
namespace := aNamespaceOrClass isClass
ifTrue: [aNamespaceOrClass classPool]
ifFalse: [aNamespaceOrClass].
(namespace isKindOf: Dictionary)
ifTrue: [Current := namespace]
ifFalse:
[SystemExceptions.WrongClass signalOn: aNamespaceOrClass
mustBe:
{Dictionary.
Class}]
]
inheritedKeys [
"Answer a Set of all the keys in the receiver and its superspaces"
<category: 'accessing'>
^(self keys)
removeAll: self definedKeys
ifAbsent: [:each | self error: 'synchronization problem?'];
yourself
]
associationsDo: aBlock [
"Pass each association in the namespace to aBlock"
<category: 'overrides for superspaces'>
self allAssociations associationsDo: aBlock
]
at: key ifPresent: aBlock [
"If aKey is absent from the receiver and all its superspaces,
answer nil. Else, evaluate aBlock passing the associated value
and answer the result of the invocation"
<category: 'overrides for superspaces'>
| index space |
space := self.
[index := space findIndexOrNil: key.
index isNil] whileTrue:
[space := space superspace.
space isNil ifTrue: [^nil]].
^aBlock value: (space primAt: index) value
]
associationAt: key ifAbsent: aBlock [
"Return the key/value pair associated to the variable named as
specified by `key'. If the key is not found search will be
brought on in superspaces, finally evaluating aBlock if the
variable cannot be found in any of the superspaces."
<category: 'overrides for superspaces'>
| index space |
space := self.
[index := space findIndexOrNil: key.
index isNil] whileTrue:
[space := space superspace.
space isNil ifTrue: [^aBlock value]].
^space primAt: index
]
at: key ifAbsent: aBlock [
"Return the value associated to the variable named as specified
by `key'. If the key is not found search will be brought on in
superspaces, finally evaluating aBlock if the variable cannot be
found in any of the superspaces."
<category: 'overrides for superspaces'>
| index space |
space := self.
[index := space findIndexOrNil: key.
index isNil] whileTrue:
[space := space superspace.
space isNil ifTrue: [^aBlock value]].
^(space primAt: index) value
]
do: aBlock [
"Pass each value in the namespace to aBlock"
<category: 'overrides for superspaces'>
self allAssociations do: aBlock
]
includesKey: key [
"Answer whether the receiver or any of its superspaces contain
the given key"
<category: 'overrides for superspaces'>
| index space |
space := self.
[index := space findIndexOrNil: key.
index isNil] whileTrue:
[space := space superspace.
space isNil ifTrue: [^false]].
^true
]
keysAndValuesDo: aBlock [
"Pass to aBlock each of the receiver's keys and values, in two
separate parameters"
<category: 'overrides for superspaces'>
self allAssociations keysAndValuesDo: aBlock
]
keysDo: aBlock [
"Pass to aBlock each of the receiver's keys"
<category: 'overrides for superspaces'>
self keys do: aBlock
]
set: key to: newValue ifAbsent: aBlock [
"Assign newValue to the variable named as specified by `key'.
This method won't define a new variable; instead if the key
is not found it will search in superspaces and evaluate
aBlock if it is not found. Answer newValue."
<category: 'overrides for superspaces'>
| index space |
space := self.
[index := space findIndexOrNil: key.
index isNil] whileTrue:
[space := space superspace.
space isNil ifTrue: [^aBlock value]].
(space primAt: index) value: newValue.
^newValue
]
size [
"Answer the number of keys in the receiver and each of its superspaces"
<category: 'overrides for superspaces'>
^super size + self superspace size
]
siblings [
"Answer all the other namespaces that inherit from the receiver's
superspace."
<category: 'namespace hierarchy'>
^(self superspace subspaces copy)
remove: self;
yourself
]
siblingsDo: aBlock [
"Evaluate aBlock once for each of the other namespaces that inherit
from the receiver's superspace, passing the namespace as a parameter."
<category: 'namespace hierarchy'>
self superspace subspaces
do: [:space | space == self ifFalse: [aBlock value: space]]
]
nameIn: aNamespace [
"Answer Smalltalk code compiling to the receiver when the current
namespace is aNamespace"
<category: 'printing'>
| reference |
reference := aNamespace at: self name asGlobalKey ifAbsent: [nil].
reference == self ifTrue: [^self name asString].
^(self superspace nameIn: aNamespace) , '.' , self name
]
printOn: aStream in: aNamespace [
"Print on aStream some Smalltalk code compiling to the receiver
when the current namespace is aNamespace"
<category: 'printing'>
| reference |
reference := aNamespace at: self name asGlobalKey ifAbsent: [nil].
reference == self
ifFalse:
[self superspace printOn: aStream in: aNamespace.
aStream nextPut: $.].
aStream nextPutAll: self name
]
storeOn: aStream [
"Store Smalltalk code compiling to the receiver"
<category: 'printing'>
| result name |
name := self name.
name isNil ifTrue: [self error: 'cannot print unnamed namespace'].
self superspace storeOn: aStream.
aStream
nextPut: $.;
nextPutAll: name
]
]
|