.
--- a/BCompiler.st Tue Apr 11 17:30:32 1995 +0200
+++ b/BCompiler.st Tue May 02 01:04:40 1995 +0200
@@ -26,7 +26,7 @@
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.19 1995-03-18 05:08:59 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.20 1995-05-01 23:03:42 claus Exp $
'!
!ByteCodeCompiler class methodsFor:'documentation'!
@@ -47,7 +47,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.19 1995-03-18 05:08:59 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.20 1995-05-01 23:03:42 claus Exp $
"
!
@@ -109,73 +109,73 @@
silent:false
!
-compile:methodText forClass:classToCompileFor notifying:someOne
+compile:methodText forClass:classToCompileFor notifying:requestor
"compile a source-string for a method in classToCompileFor.
- Errors are forwarded to someOne."
+ Errors are forwarded to requestor."
^ self compile:methodText
forClass:classToCompileFor
inCategory:'others'
- notifying:someOne
+ notifying:requestor
install:true
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
"compile a source-string for a method in classToCompileFor.
- errors are forwarded to someOne.
+ errors are forwarded to requestor.
The method will get cat as category"
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:true
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne install:install
+compile:aString forClass:aClass inCategory:cat notifying:requestor install:install
"compile a source-string for a method in classToCompileFor.
The install-argument controls if the method is to be installed into the
classes method-dictionary, or just to be compiled and a method object to be returned.
- Errors are forwarded to someOne. The method will get cat as category"
+ Errors are forwarded to requestor. The method will get cat as category"
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
install:install skipIfSame:skipIfSame
"compile a source-string for a method in classToCompileFor.
The install-argument controls if the method is to be installed into the
classes method-dictionary, or just to be compiled and a method object to be returned.
- Errors are forwarded to someOne. The method will get cat as category.
+ Errors are forwarded to requestor. The method will get cat as category.
If skipIsSame is true, and the source is the same as an existing
methods source, this is a noop (for fast fileIn)."
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:skipIfSame
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
install:install skipIfSame:skipIfSame silent:silent
"the basic workhorse method for compiling:
compile a source-string for a method in classToCompileFor.
- errors are forwarded to someOne (report on Transcript and return
- #Error, if someOne is nil).
+ errors are forwarded to requestor (report on Transcript and return
+ #Error, if requestor is nil).
The new method will get cat as category.
If install is true, the method will go into the classes method-table,
@@ -196,7 +196,8 @@
"create a compiler, let it parse and create the parsetree"
compiler := self for:(ReadStream on:aString) in:aClass.
- compiler notifying:someOne.
+ compiler parseForCode.
+ compiler notifying:requestor.
silent ifTrue:[
"/ compiler ignoreErrors.
compiler ignoreWarnings
@@ -212,7 +213,7 @@
oldMethod source = aString ifTrue:[
oldMethod isInvalid ifFalse:[
silencio ifFalse:[
- Transcript showCr:('unchanged: ',aClass name,' ',compiler selector)
+ Transcript showCr:(' unchanged: ',aClass name,' ',compiler selector)
].
"
same. however, category may be different
@@ -235,6 +236,7 @@
(compiler errorFlag or:[tree == #Error]) ifTrue:[
"/ compiler parseError:'syntax error'.
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -256,7 +258,7 @@
^ compiler compileToMachineCode:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:skipIfSame
silent:silent.
@@ -297,6 +299,7 @@
"
symbolicCodeArray := compiler genSymbolicCode.
(symbolicCodeArray == #Error) ifTrue:[
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -309,6 +312,7 @@
(someone willin' to make machine code :-)
"
((compiler genByteCodeFrom:symbolicCodeArray) == #Error) ifTrue:[
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -354,7 +358,7 @@
].
silencio ifFalse:[
- Transcript showCr:('compiled: ',aClass name,' ',compiler selector)
+ Transcript showCr:(' compiled: ',aClass name,' ',compiler selector)
].
^ newMethod
@@ -1345,7 +1349,7 @@
!ByteCodeCompiler methodsFor:'machine code generation'!
compileToMachineCode:aString forClass:aClass inCategory:cat
- notifying:someOne install:install skipIfSame:skipIfSame silent:silent
+ notifying:requestor install:install skipIfSame:skipIfSame silent:silent
"this is called to compile primitive code.
This is EXPERIMENTAL and going to be changed to raise an error,
an redefined in subclasses which can do it (either by direct compilation, or by calling
@@ -1481,7 +1485,7 @@
newMethod source:aString.
aClass addChangeRecordForMethod:newMethod.
(silent or:[Smalltalk silentLoading == true]) ifFalse:[
- Transcript showCr:('compiled: ', aClass name,' ',self selector,' - machine code')
+ Transcript showCr:(' compiled: ', aClass name,' ',self selector,' - machine code')
].
^ newMethod.
].
--- a/ByteCodeCompiler.st Tue Apr 11 17:30:32 1995 +0200
+++ b/ByteCodeCompiler.st Tue May 02 01:04:40 1995 +0200
@@ -26,7 +26,7 @@
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.19 1995-03-18 05:08:59 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.20 1995-05-01 23:03:42 claus Exp $
'!
!ByteCodeCompiler class methodsFor:'documentation'!
@@ -47,7 +47,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.19 1995-03-18 05:08:59 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.20 1995-05-01 23:03:42 claus Exp $
"
!
@@ -109,73 +109,73 @@
silent:false
!
-compile:methodText forClass:classToCompileFor notifying:someOne
+compile:methodText forClass:classToCompileFor notifying:requestor
"compile a source-string for a method in classToCompileFor.
- Errors are forwarded to someOne."
+ Errors are forwarded to requestor."
^ self compile:methodText
forClass:classToCompileFor
inCategory:'others'
- notifying:someOne
+ notifying:requestor
install:true
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
"compile a source-string for a method in classToCompileFor.
- errors are forwarded to someOne.
+ errors are forwarded to requestor.
The method will get cat as category"
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:true
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne install:install
+compile:aString forClass:aClass inCategory:cat notifying:requestor install:install
"compile a source-string for a method in classToCompileFor.
The install-argument controls if the method is to be installed into the
classes method-dictionary, or just to be compiled and a method object to be returned.
- Errors are forwarded to someOne. The method will get cat as category"
+ Errors are forwarded to requestor. The method will get cat as category"
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:false
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
install:install skipIfSame:skipIfSame
"compile a source-string for a method in classToCompileFor.
The install-argument controls if the method is to be installed into the
classes method-dictionary, or just to be compiled and a method object to be returned.
- Errors are forwarded to someOne. The method will get cat as category.
+ Errors are forwarded to requestor. The method will get cat as category.
If skipIsSame is true, and the source is the same as an existing
methods source, this is a noop (for fast fileIn)."
^ self compile:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:skipIfSame
silent:false
!
-compile:aString forClass:aClass inCategory:cat notifying:someOne
+compile:aString forClass:aClass inCategory:cat notifying:requestor
install:install skipIfSame:skipIfSame silent:silent
"the basic workhorse method for compiling:
compile a source-string for a method in classToCompileFor.
- errors are forwarded to someOne (report on Transcript and return
- #Error, if someOne is nil).
+ errors are forwarded to requestor (report on Transcript and return
+ #Error, if requestor is nil).
The new method will get cat as category.
If install is true, the method will go into the classes method-table,
@@ -196,7 +196,8 @@
"create a compiler, let it parse and create the parsetree"
compiler := self for:(ReadStream on:aString) in:aClass.
- compiler notifying:someOne.
+ compiler parseForCode.
+ compiler notifying:requestor.
silent ifTrue:[
"/ compiler ignoreErrors.
compiler ignoreWarnings
@@ -212,7 +213,7 @@
oldMethod source = aString ifTrue:[
oldMethod isInvalid ifFalse:[
silencio ifFalse:[
- Transcript showCr:('unchanged: ',aClass name,' ',compiler selector)
+ Transcript showCr:(' unchanged: ',aClass name,' ',compiler selector)
].
"
same. however, category may be different
@@ -235,6 +236,7 @@
(compiler errorFlag or:[tree == #Error]) ifTrue:[
"/ compiler parseError:'syntax error'.
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -256,7 +258,7 @@
^ compiler compileToMachineCode:aString
forClass:aClass
inCategory:cat
- notifying:someOne
+ notifying:requestor
install:install
skipIfSame:skipIfSame
silent:silent.
@@ -297,6 +299,7 @@
"
symbolicCodeArray := compiler genSymbolicCode.
(symbolicCodeArray == #Error) ifTrue:[
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -309,6 +312,7 @@
(someone willin' to make machine code :-)
"
((compiler genByteCodeFrom:symbolicCodeArray) == #Error) ifTrue:[
+ Transcript show:' '.
compiler selector notNil ifTrue:[
Transcript show:(compiler selector,' ')
].
@@ -354,7 +358,7 @@
].
silencio ifFalse:[
- Transcript showCr:('compiled: ',aClass name,' ',compiler selector)
+ Transcript showCr:(' compiled: ',aClass name,' ',compiler selector)
].
^ newMethod
@@ -1345,7 +1349,7 @@
!ByteCodeCompiler methodsFor:'machine code generation'!
compileToMachineCode:aString forClass:aClass inCategory:cat
- notifying:someOne install:install skipIfSame:skipIfSame silent:silent
+ notifying:requestor install:install skipIfSame:skipIfSame silent:silent
"this is called to compile primitive code.
This is EXPERIMENTAL and going to be changed to raise an error,
an redefined in subclasses which can do it (either by direct compilation, or by calling
@@ -1481,7 +1485,7 @@
newMethod source:aString.
aClass addChangeRecordForMethod:newMethod.
(silent or:[Smalltalk silentLoading == true]) ifFalse:[
- Transcript showCr:('compiled: ', aClass name,' ',self selector,' - machine code')
+ Transcript showCr:(' compiled: ', aClass name,' ',self selector,' - machine code')
].
^ newMethod.
].
--- a/Explainer.st Tue Apr 11 17:30:32 1995 +0200
+++ b/Explainer.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1993 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Explainer.st,v 1.8 1995-02-11 16:44:10 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Explainer.st,v 1.9 1995-05-01 23:03:53 claus Exp $
'!
!Explainer class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Explainer.st,v 1.8 1995-02-11 16:44:10 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Explainer.st,v 1.9 1995-05-01 23:03:53 claus Exp $
"
!
@@ -50,7 +50,7 @@
"
a very simple explainer - much more should be added ...
This one is involved, when the 'explain' function is used in a
- codeView.
+ codeView (popup or via CMD-E).
"
! !
@@ -92,20 +92,25 @@
].
"instvars"
- variables := aClass allInstVarNames.
- (variables notNil and:[variables includes:string]) ifTrue:[
- "where is it"
- c := aClass.
- [c notNil] whileTrue:[
- v := c instVarNames.
- (v notNil and:[v includes:string]) ifTrue:[
- ^ string , ' is an instance variable in ' , c name
- ].
- c := c superclass
- ].
- self error:'oops'
+ c := aClass whichClassDefinesInstVar:string.
+ c notNil ifTrue:[
+ ^ string , ' is an instance variable in ' , c name
].
+"/ variables := aClass allInstVarNames.
+"/ (variables notNil and:[variables includes:string]) ifTrue:[
+"/ "where is it"
+"/ c := aClass.
+"/ [c notNil] whileTrue:[
+"/ v := c instVarNames.
+"/ (v notNil and:[v includes:string]) ifTrue:[
+"/ ^ string , ' is an instance variable in ' , c name
+"/ ].
+"/ c := c superclass
+"/ ].
+"/ self error:'oops'
+"/ ].
+
"class instvars"
variables := aClass class allInstVarNames.
(variables notNil and:[variables includes:string]) ifTrue:[
@@ -160,6 +165,10 @@
^ self explainSuperIn:aClass
].
+ (string = 'here') ifTrue:[
+ ^ self explainHereIn:aClass
+ ].
+
(string = 'thisContext') ifTrue:[
^ 'thisContext is a pseudo variable (i.e. it is built in).
@@ -219,10 +228,19 @@
However, when sending a message to super the search for methods
implementing this message will start in the superclass (' , aClass superclass name , ')
-instead of selfs class (' , aClass name , ').
+instead of the receivers class (' , aClass name , ' or subclass).
Thus, using super, a redefined method can call the original method in its superclass.'
!
+explainHereIn:aClass
+ ^ 'like self, here refers to the object which received the message.
+
+However, when sending a message to here the search for methods
+implementing this message will start in the defining class (' , aClass name , ')
+instead of the receivers class (' , aClass name , ' or subclass).
+Thus, using here, redefined methods will NOT be reached with a here-send.'
+!
+
commonSuperClassOf:listOfClassNames
|common found|
@@ -393,7 +411,7 @@
explainKnownSymbol:string
"return explanation or nil"
- |sym list count tmp commonSuperClass|
+ |sym list count tmp commonSuperClass val|
sym := string asSymbol.
@@ -401,21 +419,23 @@
(Smalltalk includesKey:sym) ifTrue:[
tmp := string , ' is a global variable.'.
- (Smalltalk at:sym) isBehavior ifTrue:[
- (Smalltalk at:sym) name = string ifTrue:[
+ val := Smalltalk at:sym.
+ val isBehavior ifTrue:[
+ val name = string ifTrue:[
tmp := tmp , '
-' , string , ' is a class in category ' , (Smalltalk at:sym) category , '.'
+' , string , ' is a class categorized as ' , val category , '
+in the ''' , val package , ''' package.'
] ifFalse:[
tmp := tmp , '
-' , string , ' is bound to the class ' , (Smalltalk at:sym) name ,
-' in category ' , (Smalltalk at:sym) category , '.'
+' , string , ' is bound to the class ' , val name ,
+' in category ' , val category , '.'
]
] ifFalse:[
tmp := tmp , '
-Its current value is ' , (Smalltalk at:sym) classNameWithArticle , '.'
+Its current value is ' , val classNameWithArticle , '.'
].
^ tmp.
].
@@ -445,6 +465,7 @@
(count == 1) ifTrue:[
^ string , tmp , (list at:1) , '.'
].
+
(count == 2) ifTrue:[
^ string , tmp , (list at:1) , ' and ' , (list at:2) , '.'
].
@@ -463,6 +484,11 @@
"
commonSuperClass := self commonSuperClassOf:list.
commonSuperClass ~~ Object ifTrue:[
+ (list includes:commonSuperClass) ifTrue:[
+ ^ string , tmp, count printString , commonSuperClass name
+ , ' and redefined in ' , (count - 1) printString
+ , ' subclasses'
+ ].
^ string , tmp, count printString , ' subclasses of ' , commonSuperClass name
].
--- a/ImmArray.st Tue Apr 11 17:30:32 1995 +0200
+++ b/ImmArray.st Tue May 02 01:04:40 1995 +0200
@@ -37,7 +37,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/ImmArray.st,v 1.3 1995-02-22 01:16:48 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/ImmArray.st,v 1.4 1995-05-01 23:03:57 claus Exp $
"
!
@@ -69,7 +69,7 @@
creator
"find the method that contains me"
- Method allDerivedInstances do:[:aMethod |
+ Method allSubInstances do:[:aMethod |
|lits|
lits := aMethod literals.
--- a/ImmutableArray.st Tue Apr 11 17:30:32 1995 +0200
+++ b/ImmutableArray.st Tue May 02 01:04:40 1995 +0200
@@ -37,7 +37,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/ImmutableArray.st,v 1.3 1995-02-22 01:16:48 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/ImmutableArray.st,v 1.4 1995-05-01 23:03:57 claus Exp $
"
!
@@ -69,7 +69,7 @@
creator
"find the method that contains me"
- Method allDerivedInstances do:[:aMethod |
+ Method allSubInstances do:[:aMethod |
|lits|
lits := aMethod literals.
--- a/LazyMethod.st Tue Apr 11 17:30:32 1995 +0200
+++ b/LazyMethod.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1994 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/LazyMethod.st,v 1.8 1995-04-11 15:30:00 claus Exp $
+$Header: /cvs/stx/stx/libcomp/LazyMethod.st,v 1.9 1995-05-01 23:04:00 claus Exp $
'!
!LazyMethod class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/LazyMethod.st,v 1.8 1995-04-11 15:30:00 claus Exp $
+$Header: /cvs/stx/stx/libcomp/LazyMethod.st,v 1.9 1995-05-01 23:04:00 claus Exp $
"
!
@@ -67,8 +67,6 @@
initialize
CompilationFailedSignal isNil ifTrue:[
-"/ super initialize.
-
CompilationFailedSignal := ExecutionErrorSignal newSignalMayProceed:true.
CompilationFailedSignal nameClass:self message:#compilationFailedSignal.
CompilationFailedSignal notifierString:'compilation of lazy method failed'.
--- a/ObjFLoader.st Tue Apr 11 17:30:32 1995 +0200
+++ b/ObjFLoader.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1993 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Attic/ObjFLoader.st,v 1.18 1995-04-11 15:30:06 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/ObjFLoader.st,v 1.19 1995-05-01 23:04:07 claus Exp $
'!
!ObjectFileLoader class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/ObjFLoader.st,v 1.18 1995-04-11 15:30:06 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/ObjFLoader.st,v 1.19 1995-05-01 23:04:07 claus Exp $
"
!
@@ -1536,11 +1536,26 @@
loadStatus
"ask VM if class-hierarchy has been completely loaded"
-%{
- RETURN (_MKSMALLINT(__check_registration__()));
+ |checker checkSymbol|
+
+ checker := self.
+ checkSymbol := #'superClassCheck:'.
+
+%{ /* NOREGISTER */
+ RETURN (_MKSMALLINT(__check_registration__(&checker, &checkSymbol)));
%}
!
+superClassCheck:aClass
+ "callBack from class registration code in VM: make certain, that aClass is
+ loaded too ..."
+
+ 'checkCall for:' errorPrint. aClass name errorPrint. ' -> ' errorPrint.
+ aClass isBehavior ifFalse:['false' errorPrintNL. ^ false].
+ aClass autoload.
+ 'true' errorPrintNL. ^ true
+!
+
classNameThatFailed
"ask VM for the name of the class that caused trouble"
--- a/ObjectFileLoader.st Tue Apr 11 17:30:32 1995 +0200
+++ b/ObjectFileLoader.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1993 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/ObjectFileLoader.st,v 1.18 1995-04-11 15:30:06 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ObjectFileLoader.st,v 1.19 1995-05-01 23:04:07 claus Exp $
'!
!ObjectFileLoader class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/ObjectFileLoader.st,v 1.18 1995-04-11 15:30:06 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ObjectFileLoader.st,v 1.19 1995-05-01 23:04:07 claus Exp $
"
!
@@ -1536,11 +1536,26 @@
loadStatus
"ask VM if class-hierarchy has been completely loaded"
-%{
- RETURN (_MKSMALLINT(__check_registration__()));
+ |checker checkSymbol|
+
+ checker := self.
+ checkSymbol := #'superClassCheck:'.
+
+%{ /* NOREGISTER */
+ RETURN (_MKSMALLINT(__check_registration__(&checker, &checkSymbol)));
%}
!
+superClassCheck:aClass
+ "callBack from class registration code in VM: make certain, that aClass is
+ loaded too ..."
+
+ 'checkCall for:' errorPrint. aClass name errorPrint. ' -> ' errorPrint.
+ aClass isBehavior ifFalse:['false' errorPrintNL. ^ false].
+ aClass autoload.
+ 'true' errorPrintNL. ^ true
+!
+
classNameThatFailed
"ask VM for the name of the class that caused trouble"
--- a/Parser.st Tue Apr 11 17:30:32 1995 +0200
+++ b/Parser.st Tue May 02 01:04:40 1995 +0200
@@ -18,9 +18,11 @@
methodVars methodVarNames
tree
currentBlock
+ parseForCode
usedInstVars usedClassVars usedVars
- modifiedInstVars modifiedClassVars
+ modifiedInstVars modifiedClassVars modifiedGlobals
usesSuper
+ usedGlobals usedSymbols usedMessages
localVarDefPosition
evalExitBlock
selfNode superNode
@@ -39,7 +41,7 @@
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.36 1995-04-11 15:30:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.37 1995-05-01 23:04:17 claus Exp $
'!
!Parser class methodsFor:'documentation'!
@@ -60,7 +62,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.36 1995-04-11 15:30:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.37 1995-05-01 23:04:17 claus Exp $
"
!
@@ -379,6 +381,7 @@
parser := self for:(ReadStream on:aStringOrStream).
mustBackup := false
].
+ parser parseForCode.
parser setSelf:anObject.
parser setContext:aContext.
parser notifying:requestor.
@@ -900,7 +903,15 @@
hasPrimitiveCode := false.
warnSTXHereExtensionUsed := WarnSTXSpecials.
- usesSuper := false
+ usesSuper := false.
+ parseForCode := false.
+!
+
+parseForCode
+ "turns off certain statistics (keeping referenced variables, modified vars etc.)
+ Use this when parsing for compilation or evaluation"
+
+ parseForCode := true
!
setClassToCompileFor:aClass
@@ -988,6 +999,12 @@
^ usedClassVars
!
+usedGlobals
+ "return a collection with globalnames refd by method (valid after parsing)"
+
+ ^ usedGlobals
+!
+
modifiedInstVars
"return a collection with instvariablenames modified by method (valid after parsing)"
@@ -1000,6 +1017,12 @@
^ modifiedClassVars
!
+modifiedGlobals
+ "return a collection with globalnames modified by method (valid after parsing)"
+
+ ^ modifiedGlobals
+!
+
hasPrimitiveCode
"return true if there was any ST/X style primitive code (valid after parsing)"
@@ -1590,6 +1613,7 @@
sel := self selectorCheck:tokenName for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
receiver := CascadeNode receiver:receiver selector:sel.
receiver lineNumber:tokenLineNr.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
self nextToken.
] ifFalse:[
(tokenType == #BinaryOperator) ifTrue:[
@@ -1600,6 +1624,7 @@
(arg == #Error) ifTrue:[^ #Error].
receiver := CascadeNode receiver:receiver selector:sel arg:arg.
receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
] ifFalse:[
(tokenType == #Keyword) ifTrue:[
pos := tokenPosition.
@@ -1620,6 +1645,7 @@
sel := self selectorCheck:sel for:receiver position:pos to:pos2.
receiver := CascadeNode receiver:receiver selector:sel args:args.
receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
] ifFalse:[
(tokenType == #Error) ifTrue:[^ #Error].
self syntaxError:('invalid cascade; ' , tokenType printString , ' unexpected')
@@ -1697,7 +1723,8 @@
] ifFalse:[
receiver := try
].
- receiver lineNumber:lno
+ receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
].
^ receiver
!
@@ -1786,6 +1813,7 @@
receiver := try
].
receiver lineNumber:lno.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
].
^ receiver
!
@@ -1810,6 +1838,7 @@
receiver := try
].
receiver lineNumber:tokenLineNr.
+ parseForCode ifFalse:[self rememberSelectorUsed:sel].
self nextToken.
].
^ receiver
@@ -1818,7 +1847,7 @@
primary
"parse a primary-expression; return a node-tree, nil or #Error"
- |val var expr pos name t|
+ |val var expr pos name t cls|
pos := tokenPosition.
(tokenType == #Self) ifTrue:[
@@ -1872,27 +1901,35 @@
errorFlag := true
] ifFalse:[
(t == #InstanceVariable) ifTrue:[
- modifiedInstVars isNil ifTrue:[
- modifiedInstVars := OrderedCollection new
- ].
name := PrevInstVarNames at:(var index).
- (modifiedInstVars includes:name) ifFalse:[
+ parseForCode ifFalse:[
+ modifiedInstVars isNil ifTrue:[
+ modifiedInstVars := Set new
+ ].
modifiedInstVars add:name
]
] ifFalse:[
(t == #ClassVariable) ifTrue:[
- modifiedClassVars isNil ifTrue:[
- modifiedClassVars := OrderedCollection new
- ].
name := var name.
name := name copyFrom:((name indexOf:$:) + 1).
- (modifiedClassVars includes:name) ifFalse:[
+ parseForCode ifFalse:[
+ modifiedClassVars isNil ifTrue:[
+ modifiedClassVars := Set new
+ ].
modifiedClassVars add:name
]
] ifFalse:[
(t == #GlobalVariable) ifTrue:[
- (Smalltalk classNamed:var name) notNil ifTrue:[
- self warning:'assignment to global which contains class' position:pos to:tokenPosition.
+ (cls := Smalltalk classNamed:var name) notNil ifTrue:[
+ cls name = var name ifTrue:[
+ self warning:'assignment to global which contains class' position:pos to:tokenPosition.
+ ]
+ ].
+ parseForCode ifFalse:[
+ modifiedGlobals isNil ifTrue:[
+ modifiedGlobals := Set new
+ ].
+ modifiedGlobals add:var name
]
]
]
@@ -2119,20 +2156,7 @@
instIndex := (self instVarNames) indexOf:varName startingAt:1.
instIndex ~~ 0 ifTrue:[
- usedInstVars isNil ifTrue:[
- usedInstVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedInstVars includes:varName) ifFalse:[
- usedInstVars add:varName
- ]
- ].
- usedVars isNil ifTrue:[
- usedVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedVars includes:varName) ifFalse:[
- usedVars add:varName
- ]
- ].
+ parseForCode ifFalse:[self rememberInstVarUsed:varName].
^ VariableNode type:#InstanceVariable
name:varName
index:instIndex
@@ -2145,20 +2169,7 @@
instIndex ~~ 0 ifTrue:[
aClass := self inWhichClassIsClassInstVar:varName.
aClass notNil ifTrue:[
- usedClassVars isNil ifTrue:[
- usedClassVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedClassVars includes:varName) ifFalse:[
- usedClassVars add:varName
- ].
- ].
- usedVars isNil ifTrue:[
- usedVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedVars includes:varName) ifFalse:[
- usedVars add:varName
- ]
- ].
+ parseForCode ifFalse:[self rememberClassVarUsed:varName].
^ VariableNode type:#ClassInstanceVariable
name:varName
index:instIndex
@@ -2172,20 +2183,7 @@
instIndex ~~ 0 ifTrue:[
aClass := self inWhichClassIsClassVar:varName.
aClass notNil ifTrue:[
- usedClassVars isNil ifTrue:[
- usedClassVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedClassVars includes:varName) ifFalse:[
- usedClassVars add:varName
- ].
- ].
- usedVars isNil ifTrue:[
- usedVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedVars includes:varName) ifFalse:[
- usedVars add:varName
- ].
- ].
+ parseForCode ifFalse:[self rememberClassVarUsed:varName].
^ VariableNode type:#ClassVariable
name:(aClass name , ':' , varName) asSymbol
]
@@ -2196,13 +2194,7 @@
tokenSymbol := varName asSymbolIfInterned.
tokenSymbol notNil ifTrue:[
(Smalltalk includesKey:tokenSymbol) ifTrue:[
- usedVars isNil ifTrue:[
- usedVars := OrderedCollection with:varName
- ] ifFalse:[
- (usedVars includes:varName) ifFalse:[
- usedVars add:varName
- ]
- ].
+ parseForCode ifFalse:[self rememberGlobalUsed:varName].
^ VariableNode type:#GlobalVariable name:tokenSymbol
]
].
@@ -2218,6 +2210,7 @@
(v == #Error) ifFalse:[^ v].
v := self correctVariable.
(v == #Error) ifFalse:[^ v].
+ parseForCode ifFalse:[self rememberGlobalUsed:tokenName].
^ VariableNode type:#GlobalVariable name:tokenName asSymbol
!
@@ -2236,11 +2229,12 @@
aClass := baseClass
]
].
- [aClass notNil] whileTrue:[
- (aClass classVarNames includes:aString) ifTrue:[ ^ aClass].
- aClass := aClass superclass
- ].
- ^ nil
+ ^ aClass whichClassDefinesClassVar:aString
+"/ [aClass notNil] whileTrue:[
+"/ (aClass classVarNames includes:aString) ifTrue:[ ^ aClass].
+"/ aClass := aClass superclass
+"/ ].
+"/ ^ nil
!
inWhichClassIsClassInstVar:aString
@@ -2525,6 +2519,46 @@
^ #Error
! !
+!Parser methodsFor:'statistic'!
+
+rememberSelectorUsed:sel
+ usedMessages isNil ifTrue:[
+ usedMessages := IdentitySet new.
+ ].
+ usedMessages add:sel
+!
+
+rememberVariableUsed:name
+ usedVars isNil ifTrue:[
+ usedVars := Set new
+ ].
+ usedVars add:name
+!
+
+rememberGlobalUsed:name
+ usedGlobals isNil ifTrue:[
+ usedGlobals := Set new
+ ].
+ usedGlobals add:name.
+ self rememberVariableUsed:name
+!
+
+rememberClassVarUsed:name
+ usedClassVars isNil ifTrue:[
+ usedClassVars := Set new
+ ].
+ usedClassVars add:name.
+ self rememberVariableUsed:name
+!
+
+rememberInstVarUsed:name
+ usedInstVars isNil ifTrue:[
+ usedInstVars := Set new
+ ].
+ usedInstVars add:name.
+ self rememberVariableUsed:name
+! !
+
!Parser methodsFor:'error correction'!
correctByDeleting
@@ -2902,12 +2936,12 @@
receiver isSuper ifTrue:[
receiver isHere ifFalse:[
((superCls := classToCompileFor superclass) notNil
- and:[(superCls whichClassImplements:sym) isNil]) ifTrue:[
+ and:[(superCls whichClassIncludesSelector:sym) isNil]) ifTrue:[
err := ' is currently not implemented in any superclass'.
ok := false
]
] ifTrue:[
- (classToCompileFor whichClassImplements:sym) isNil ifTrue:[
+ (classToCompileFor whichClassIncludesSelector:sym) isNil ifTrue:[
err := ' is currently not implemented in this class'.
ok := false
]
@@ -2918,7 +2952,7 @@
and:[receiver selector == #class
and:[receiver receiver type == #Self]]) ifTrue:[
"its a message to self class - can check this too ..."
- (classToCompileFor class whichClassImplements:sym) isNil ifTrue:[
+ (classToCompileFor class whichClassIncludesSelector:sym) isNil ifTrue:[
ok := false.
classToCompileFor allSubclasses do:[:subclass |
(subclass class implements:sym) ifTrue:[
--- a/SourceFileLoader.st Tue Apr 11 17:30:32 1995 +0200
+++ b/SourceFileLoader.st Tue May 02 01:04:40 1995 +0200
@@ -13,7 +13,7 @@
'From Smalltalk/X, Version:2.10.4 on 24-feb-1995 at 3:12:23 am'!
Object subclass:#SourceFileLoader
- instanceVariableNames:'myStream currentSource package'
+ instanceVariableNames:'myStream currentSource package wantChangeLog'
classVariableNames:''
poolDictionaries:''
category:'System-Compiler'
@@ -23,7 +23,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/SourceFileLoader.st,v 1.2 1995-04-11 15:30:32 claus Exp $
+$Header: /cvs/stx/stx/libcomp/SourceFileLoader.st,v 1.3 1995-05-01 23:04:30 claus Exp $
"
!
@@ -53,7 +53,7 @@
!SourceFileLoader class methodsFor:'instance creation'!
on:aStream
- ^ self new reader:aStream
+ ^ self new reader:aStream wantChangeLog:false
! !
!SourceFileLoader methodsFor:'error handling'!
@@ -74,7 +74,7 @@
"
"/ position printOn:Transcript.
"/ Transcript show:' '.
- Transcript showCr:aMessage.
+ Transcript show:'** '; showCr:aMessage.
^ false
!
@@ -89,8 +89,19 @@
!SourceFileLoader methodsFor:'private access'!
-reader:aStream
- myStream := aStream
+reader:aStream wantChangeLog:aBoolean
+ myStream := aStream.
+ wantChangeLog := aBoolean
+! !
+
+!SourceFileLoader methodsFor:'compiler queries'!
+
+wantChangeLog
+ "sent by the compiler to ask if a changeLog entry should
+ be written. Return false here, since SourceFileLaoders are
+ used to read existing source files"
+
+ ^ wantChangeLog
! !
!SourceFileLoader methodsFor:'directve processing'!
--- a/SrcFLoader.st Tue Apr 11 17:30:32 1995 +0200
+++ b/SrcFLoader.st Tue May 02 01:04:40 1995 +0200
@@ -13,7 +13,7 @@
'From Smalltalk/X, Version:2.10.4 on 24-feb-1995 at 3:12:23 am'!
Object subclass:#SourceFileLoader
- instanceVariableNames:'myStream currentSource package'
+ instanceVariableNames:'myStream currentSource package wantChangeLog'
classVariableNames:''
poolDictionaries:''
category:'System-Compiler'
@@ -23,7 +23,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/SrcFLoader.st,v 1.2 1995-04-11 15:30:32 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/SrcFLoader.st,v 1.3 1995-05-01 23:04:30 claus Exp $
"
!
@@ -53,7 +53,7 @@
!SourceFileLoader class methodsFor:'instance creation'!
on:aStream
- ^ self new reader:aStream
+ ^ self new reader:aStream wantChangeLog:false
! !
!SourceFileLoader methodsFor:'error handling'!
@@ -74,7 +74,7 @@
"
"/ position printOn:Transcript.
"/ Transcript show:' '.
- Transcript showCr:aMessage.
+ Transcript show:'** '; showCr:aMessage.
^ false
!
@@ -89,8 +89,19 @@
!SourceFileLoader methodsFor:'private access'!
-reader:aStream
- myStream := aStream
+reader:aStream wantChangeLog:aBoolean
+ myStream := aStream.
+ wantChangeLog := aBoolean
+! !
+
+!SourceFileLoader methodsFor:'compiler queries'!
+
+wantChangeLog
+ "sent by the compiler to ask if a changeLog entry should
+ be written. Return false here, since SourceFileLaoders are
+ used to read existing source files"
+
+ ^ wantChangeLog
! !
!SourceFileLoader methodsFor:'directve processing'!
--- a/UnaryNd.st Tue Apr 11 17:30:32 1995 +0200
+++ b/UnaryNd.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.11 1995-02-18 01:25:46 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.12 1995-05-01 23:04:37 claus Exp $
'!
!UnaryNode class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.11 1995-02-18 01:25:46 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.12 1995-05-01 23:04:37 claus Exp $
"
!
@@ -73,6 +73,22 @@
"
folding ifTrue:[
"do constant folding ..."
+ r isGlobal ifTrue:[
+ (r name = 'Character') ifTrue:[
+ recVal := r evaluate.
+ selector := selectorString asSymbolIfInterned.
+ selector notNil ifTrue:[
+ (#( tab cr space) includes:selector)
+ ifTrue:[
+ (recVal respondsTo:selector) ifTrue:[
+ result := recVal perform:selector.
+ ^ ConstantNode type:(ConstantNode typeOfConstant:result)
+ value:result
+ ]
+ ]
+ ]
+ ]
+ ].
r isConstant ifTrue:[
"check if we can do it ..."
recVal := r evaluate.
--- a/UnaryNode.st Tue Apr 11 17:30:32 1995 +0200
+++ b/UnaryNode.st Tue May 02 01:04:40 1995 +0200
@@ -21,7 +21,7 @@
COPYRIGHT (c) 1989 by Claus Gittinger
All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.11 1995-02-18 01:25:46 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.12 1995-05-01 23:04:37 claus Exp $
'!
!UnaryNode class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.11 1995-02-18 01:25:46 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.12 1995-05-01 23:04:37 claus Exp $
"
!
@@ -73,6 +73,22 @@
"
folding ifTrue:[
"do constant folding ..."
+ r isGlobal ifTrue:[
+ (r name = 'Character') ifTrue:[
+ recVal := r evaluate.
+ selector := selectorString asSymbolIfInterned.
+ selector notNil ifTrue:[
+ (#( tab cr space) includes:selector)
+ ifTrue:[
+ (recVal respondsTo:selector) ifTrue:[
+ result := recVal perform:selector.
+ ^ ConstantNode type:(ConstantNode typeOfConstant:result)
+ value:result
+ ]
+ ]
+ ]
+ ]
+ ].
r isConstant ifTrue:[
"check if we can do it ..."
recVal := r evaluate.
--- a/UndefVar.st Tue Apr 11 17:30:32 1995 +0200
+++ b/UndefVar.st Tue May 02 01:04:40 1995 +0200
@@ -1,6 +1,6 @@
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -19,9 +19,9 @@
UndefinedVariable comment:'
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/Attic/UndefVar.st,v 1.4 1994-08-22 12:41:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/UndefVar.st,v 1.5 1995-05-01 23:04:40 claus Exp $
'!
!UndefinedVariable class methodsFor:'documentation'!
@@ -29,7 +29,7 @@
copyright
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/Attic/UndefVar.st,v 1.4 1994-08-22 12:41:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/UndefVar.st,v 1.5 1995-05-01 23:04:40 claus Exp $
"
!
@@ -74,6 +74,28 @@
self error:('trying to create subclass of undefined class: ', name)
! !
+!UndefinedVariable methodsFor:'file skipping'!
+
+fileInFrom:aStream notifying:someOne passChunk:passChunk
+ "this is sent, if you continue after a warning about
+ methods for undefined class.
+ It simply skips chunks and sends a warning to the Transcript."
+
+ |aString done|
+
+ done := false.
+ [done] whileFalse:[
+ done := aStream atEnd.
+ done ifFalse:[
+ aString := aStream nextChunk.
+ done := aString isNil or:[aString isEmpty].
+ done ifFalse:[
+ Transcript showCr:'*** skipping method for undefined class: ' , name
+ ]
+ ]
+ ].
+! !
+
!UndefinedVariable methodsFor:'catching messages'!
class
@@ -97,17 +119,17 @@
!
variableByteSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
!
variableSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
!
variableWordSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
! !
--- a/UndefinedVariable.st Tue Apr 11 17:30:32 1995 +0200
+++ b/UndefinedVariable.st Tue May 02 01:04:40 1995 +0200
@@ -1,6 +1,6 @@
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -19,9 +19,9 @@
UndefinedVariable comment:'
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
-$Header: /cvs/stx/stx/libcomp/UndefinedVariable.st,v 1.4 1994-08-22 12:41:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UndefinedVariable.st,v 1.5 1995-05-01 23:04:40 claus Exp $
'!
!UndefinedVariable class methodsFor:'documentation'!
@@ -29,7 +29,7 @@
copyright
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -42,7 +42,7 @@
version
"
-$Header: /cvs/stx/stx/libcomp/UndefinedVariable.st,v 1.4 1994-08-22 12:41:14 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UndefinedVariable.st,v 1.5 1995-05-01 23:04:40 claus Exp $
"
!
@@ -74,6 +74,28 @@
self error:('trying to create subclass of undefined class: ', name)
! !
+!UndefinedVariable methodsFor:'file skipping'!
+
+fileInFrom:aStream notifying:someOne passChunk:passChunk
+ "this is sent, if you continue after a warning about
+ methods for undefined class.
+ It simply skips chunks and sends a warning to the Transcript."
+
+ |aString done|
+
+ done := false.
+ [done] whileFalse:[
+ done := aStream atEnd.
+ done ifFalse:[
+ aString := aStream nextChunk.
+ done := aString isNil or:[aString isEmpty].
+ done ifFalse:[
+ Transcript showCr:'*** skipping method for undefined class: ' , name
+ ]
+ ]
+ ].
+! !
+
!UndefinedVariable methodsFor:'catching messages'!
class
@@ -97,17 +119,17 @@
!
variableByteSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
!
variableSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
!
variableWordSubclass:t instanceVariableNames:f
- classVariableNames:d poolDictionaries:s category:cat
+ classVariableNames:d poolDictionaries:s category:cat
self subclassingError
! !