[squeak-dev] The Trunk: Kernel-tfel.1041.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Sep 27 13:42:27 UTC 2016
Tim Felgentreff uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-tfel.1041.mcz
==================== Summary ====================
Name: Kernel-tfel.1041
Author: tfel
Time: 27 September 2016, 3:41:40.508268 pm
UUID: 31da1f70-2af0-e74e-b46c-74f1c7b615b7
Ancestors: Kernel-tfel.1040
uniclasses might not have a category
=============== Diff against Kernel-tfel.1040 ===============
Item was changed:
----- Method: ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: (in category 'class definition') -----
name: className inEnvironment: env subclassOf: newSuper type: type instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolString category: category unsafe: unsafe
"Define a new class in the given environment.
If unsafe is true do not run any validation checks.
This facility is provided to implement important system changes."
| oldClass instVars classVars copyOfOldClass newClass |
environ := env.
instVars := Scanner new scanFieldNames: instVarString.
classVars := (Scanner new scanFieldNames: classVarString) collect: [:x | x asSymbol].
"Validate the proposed name"
unsafe ifFalse:[(self validateClassName: className) ifFalse:[^nil]].
oldClass := env at: className ifAbsent:[nil].
oldClass isBehavior
ifFalse: [oldClass := nil] "Already checked in #validateClassName:"
ifTrue: [
copyOfOldClass := oldClass copy.
copyOfOldClass superclass addSubclass: copyOfOldClass].
[ | newCategory needNew force organization oldCategory |
unsafe ifFalse:[
"Run validation checks so we know that we have a good chance for recompilation"
(self validateSuperclass: newSuper forSubclass: oldClass) ifFalse:[^nil].
(self validateInstvars: instVars from: oldClass forSuper: newSuper) ifFalse:[^nil].
(self validateClassvars: classVars from: oldClass forSuper: newSuper) ifFalse:[^nil].
(self validateSubclassFormat: type from: oldClass forSuper: newSuper extra: instVars size) ifFalse:[^nil]].
"See if we need a new subclass"
needNew := self needsSubclassOf: newSuper type: type instanceVariables: instVars from: oldClass.
needNew == nil ifTrue:[^nil]. "some error"
(needNew and:[unsafe not]) ifTrue:[
"Make sure we don't redefine any dangerous classes"
(self tooDangerousClasses includes: oldClass name) ifTrue:[
self error: oldClass name, ' cannot be changed'.
].
"Check if the receiver should not be redefined"
(oldClass ~~ nil and:[oldClass shouldNotBeRedefined]) ifTrue:[
self notify: oldClass name asText allBold,
' should not be redefined. \Proceed to store over it.' withCRs]].
needNew ifTrue:[
"Create the new class"
newClass := self
newSubclassOf: newSuper
type: type
instanceVariables: instVars
from: oldClass.
newClass == nil ifTrue:[^nil]. "Some error"
newClass setName: className.
newClass environment: environ.
] ifFalse:[
"Reuse the old class"
newClass := oldClass.
].
"Install the class variables and pool dictionaries... "
force := (newClass declare: classVarString) | (newClass sharing: poolString).
"... classify ..."
+ category ifNotNil: [
+ newCategory := category asSymbol.
+ organization := environ ifNotNil:[environ organization].
+ oldClass isNil ifFalse: [oldCategory := (organization categoryOfElement: oldClass name) asSymbol].
+ organization classify: newClass name under: newCategory suppressIfDefault: true].
+
- newCategory := category asSymbol.
- organization := environ ifNotNil:[environ organization].
- oldClass isNil ifFalse: [oldCategory := (organization categoryOfElement: oldClass name) asSymbol].
- organization classify: newClass name under: newCategory suppressIfDefault: true.
-
"... recompile ..."
newClass := self recompile: force from: oldClass to: newClass mutate: false.
"... export if not yet done ..."
(environ at: newClass name ifAbsent:[nil]) == newClass ifFalse:[
[environ at: newClass name put: newClass]
on: AttemptToWriteReadOnlyGlobal do:[:ex| ex resume: true].
environ flushClassNameCache.
].
newClass doneCompiling.
"... notify interested clients ..."
oldClass isNil ifTrue: [
SystemChangeNotifier uniqueInstance classAdded: newClass inCategory: newCategory.
^ newClass].
newCategory ~= oldCategory
ifTrue: [SystemChangeNotifier uniqueInstance class: newClass recategorizedFrom: oldCategory to: category]
ifFalse: [SystemChangeNotifier uniqueInstance classDefinitionChangedFrom: copyOfOldClass to: newClass.].
] ensure:
[copyOfOldClass ifNotNil: [copyOfOldClass superclass removeSubclass: copyOfOldClass].
Behavior flushObsoleteSubclasses.
].
^newClass!
More information about the Squeak-dev
mailing list
|