*** empty log message ***
authorclaus
Sun, 16 Jan 1994 04:51:45 +0100
changeset 13 30e69e21d1d1
parent 12 80f627afdd4e
child 14 f08ffd9958a5
*** empty log message ***
BCompiler.st
BinaryNd.st
BinaryNode.st
ByteCodeCompiler.st
CascadeNd.st
CascadeNode.st
ConstNode.st
ConstantNode.st
Make.proto
MessageNd.st
MessageNode.st
ParseNode.st
Parser.st
PrimaryNd.st
PrimaryNode.st
RetNode.st
ReturnNode.st
UnaryNd.st
UnaryNode.st
--- a/BCompiler.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/BCompiler.st	Sun Jan 16 04:51:45 1994 +0100
@@ -26,7 +26,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
              All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.7 1994-01-12 20:20:30 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.8 1994-01-16 03:51:28 claus Exp $
 '!
 
 !ByteCodeCompiler class methodsFor:'documentation'!
@@ -235,6 +235,7 @@
     newMethod source:aString.
     newMethod category:cat.
     newMethod numberOfMethodVars:(compiler numberOfMethodVars).
+    newMethod numberOfMethodArgs:(compiler numberOfMethodArgs).
     newMethod stackSize:(compiler maxStackDepth).
 
     install ifTrue:[
--- a/BinaryNd.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/BinaryNd.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/BinaryNd.st,v 1.4 1993-12-11 01:06:12 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BinaryNd.st,v 1.5 1994-01-16 03:51:32 claus Exp $
 '!
 
 !BinaryNode methodsFor:'queries'!
@@ -39,6 +39,9 @@
 !BinaryNode methodsFor:'evaluating'!
 
 evaluate
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
     ^ (receiver evaluate) perform:selector with:(argArray at:1) evaluate
 ! !
 
@@ -70,7 +73,7 @@
                             ] ifFalse:[
                                 aStream nextPut:#minus1
                             ].
-			    aStream nextPut:lineNr.
+                            aStream nextPut:lineNr.
                             ^ self
                         ]
                     ]
@@ -78,9 +81,9 @@
             ].
             arg1 codeOn:aStream inBlock:b.
             aStream nextPut:selector.
-	    (self class hasLineNumber:selector) ifTrue:[
-	        aStream nextPut:lineNr.
-	    ].
+            (self class hasLineNumber:selector) ifTrue:[
+                aStream nextPut:lineNr.
+            ].
             ^ self
         ]
     ].
--- a/BinaryNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/BinaryNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/BinaryNode.st,v 1.4 1993-12-11 01:06:12 claus Exp $
+$Header: /cvs/stx/stx/libcomp/BinaryNode.st,v 1.5 1994-01-16 03:51:32 claus Exp $
 '!
 
 !BinaryNode methodsFor:'queries'!
@@ -39,6 +39,9 @@
 !BinaryNode methodsFor:'evaluating'!
 
 evaluate
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
     ^ (receiver evaluate) perform:selector with:(argArray at:1) evaluate
 ! !
 
@@ -70,7 +73,7 @@
                             ] ifFalse:[
                                 aStream nextPut:#minus1
                             ].
-			    aStream nextPut:lineNr.
+                            aStream nextPut:lineNr.
                             ^ self
                         ]
                     ]
@@ -78,9 +81,9 @@
             ].
             arg1 codeOn:aStream inBlock:b.
             aStream nextPut:selector.
-	    (self class hasLineNumber:selector) ifTrue:[
-	        aStream nextPut:lineNr.
-	    ].
+            (self class hasLineNumber:selector) ifTrue:[
+                aStream nextPut:lineNr.
+            ].
             ^ self
         ]
     ].
--- a/ByteCodeCompiler.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/ByteCodeCompiler.st	Sun Jan 16 04:51:45 1994 +0100
@@ -26,7 +26,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
              All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.7 1994-01-12 20:20:30 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.8 1994-01-16 03:51:28 claus Exp $
 '!
 
 !ByteCodeCompiler class methodsFor:'documentation'!
@@ -235,6 +235,7 @@
     newMethod source:aString.
     newMethod category:cat.
     newMethod numberOfMethodVars:(compiler numberOfMethodVars).
+    newMethod numberOfMethodArgs:(compiler numberOfMethodArgs).
     newMethod stackSize:(compiler maxStackDepth).
 
     install ifTrue:[
--- a/CascadeNd.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/CascadeNd.st	Sun Jan 16 04:51:45 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/CascadeNd.st,v 1.3 1993-10-13 02:41:15 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/CascadeNd.st,v 1.4 1994-01-16 03:51:33 claus Exp $
 '!
 
 !CascadeNode methodsFor: 'code generation'!
@@ -43,6 +43,10 @@
 evaluate
     |t argValueArray|
 
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
+
     t := receiver evaluateForCascade.
     argArray isNil ifTrue:[
         t perform:selector.
@@ -55,6 +59,10 @@
 evaluateForCascade
     |t argValueArray|
 
+    receiver isSuper ifTrue:[
+        ^ super evaluateForCascade
+    ].
+
     t := receiver evaluateForCascade.
     argArray isNil ifTrue:[
         t perform:selector.
--- a/CascadeNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/CascadeNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.3 1993-10-13 02:41:15 claus Exp $
+$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.4 1994-01-16 03:51:33 claus Exp $
 '!
 
 !CascadeNode methodsFor: 'code generation'!
@@ -43,6 +43,10 @@
 evaluate
     |t argValueArray|
 
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
+
     t := receiver evaluateForCascade.
     argArray isNil ifTrue:[
         t perform:selector.
@@ -55,6 +59,10 @@
 evaluateForCascade
     |t argValueArray|
 
+    receiver isSuper ifTrue:[
+        ^ super evaluateForCascade
+    ].
+
     t := receiver evaluateForCascade.
     argArray isNil ifTrue:[
         t perform:selector.
--- a/ConstNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/ConstNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -23,7 +23,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/ConstNode.st,v 1.5 1994-01-08 17:05:08 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/ConstNode.st,v 1.6 1994-01-16 03:51:34 claus Exp $
 '!
 
 !ConstantNode class methodsFor:'queries'!
@@ -52,35 +52,35 @@
 !ConstantNode class methodsFor:'instance creation'!
 
 type:t value:val
-    "some constant nodes are use so often, its worth caching them"
+    "some constant nodes are used so often, its worth caching them"
     (t == #True) ifTrue:[
         TrueNode isNil ifTrue:[
-            TrueNode := super type:t value:val
+            TrueNode := (self basicNew) type:t value:val
         ].
         ^ TrueNode
     ].
     (t == #False) ifTrue:[
         FalseNode isNil ifTrue:[
-            FalseNode := super type:t value:val
+            FalseNode := (self basicNew) type:t value:val
         ].
         ^ FalseNode
     ].
     (t == #Nil) ifTrue:[
         NilNode isNil ifTrue:[
-            NilNode := super type:t value:val
+            NilNode := (self basicNew) type:t value:val
         ].
         ^ NilNode
     ].
     (t == #Integer) ifTrue:[
         (val == 0) ifTrue:[
             Const0Node isNil ifTrue:[
-                Const0Node := super type:t value:val
+                Const0Node := (self basicNew) type:t value:val
             ].
             ^ Const0Node
         ].
         (val == 1) ifTrue:[
             Const1Node isNil ifTrue:[
-                Const1Node := super type:t value:val
+                Const1Node := (self basicNew) type:t value:val
             ].
             ^ Const1Node
         ]
@@ -88,7 +88,7 @@
     (t == #Float) ifTrue:[
         (val = 0.0) ifTrue:[
             Float0Node isNil ifTrue:[
-                Float0Node := super type:t value:val
+                Float0Node := (self basicNew) type:t value:val
             ].
             ^ Float0Node
         ]
@@ -96,6 +96,13 @@
     ^ (self basicNew) type:t value:val
 ! !
 
+!ConstantNode methodsFor:'accessing'!
+
+type:t value:val
+    type := t.
+    value := val
+! !
+
 !ConstantNode methodsFor:'queries'!
 
 isConstant
@@ -109,6 +116,8 @@
 !
 
 store:aValue
+    "not reached - parser checks for this"
+
     self error:'store not allowed'.
     ^ aValue
 ! !
@@ -150,14 +159,18 @@
     aStream nextPut:value
 !
 
-codeStoreOn:aStream
-    "should never be sent"
+codeStoreOn:aStream inBlock:codeBlock valueNeeded:valueNeeded
+    "not sent - parser checks for this"
 
     ^ self error:'assignment to literals not allowed'
 ! !
 
 !ConstantNode methodsFor:'printing'!
 
+displayString
+    ^ value displayString
+!
+
 printOn:aStream indent:i
     value storeOn:aStream
 ! !
--- a/ConstantNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/ConstantNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -23,7 +23,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/ConstantNode.st,v 1.5 1994-01-08 17:05:08 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ConstantNode.st,v 1.6 1994-01-16 03:51:34 claus Exp $
 '!
 
 !ConstantNode class methodsFor:'queries'!
@@ -52,35 +52,35 @@
 !ConstantNode class methodsFor:'instance creation'!
 
 type:t value:val
-    "some constant nodes are use so often, its worth caching them"
+    "some constant nodes are used so often, its worth caching them"
     (t == #True) ifTrue:[
         TrueNode isNil ifTrue:[
-            TrueNode := super type:t value:val
+            TrueNode := (self basicNew) type:t value:val
         ].
         ^ TrueNode
     ].
     (t == #False) ifTrue:[
         FalseNode isNil ifTrue:[
-            FalseNode := super type:t value:val
+            FalseNode := (self basicNew) type:t value:val
         ].
         ^ FalseNode
     ].
     (t == #Nil) ifTrue:[
         NilNode isNil ifTrue:[
-            NilNode := super type:t value:val
+            NilNode := (self basicNew) type:t value:val
         ].
         ^ NilNode
     ].
     (t == #Integer) ifTrue:[
         (val == 0) ifTrue:[
             Const0Node isNil ifTrue:[
-                Const0Node := super type:t value:val
+                Const0Node := (self basicNew) type:t value:val
             ].
             ^ Const0Node
         ].
         (val == 1) ifTrue:[
             Const1Node isNil ifTrue:[
-                Const1Node := super type:t value:val
+                Const1Node := (self basicNew) type:t value:val
             ].
             ^ Const1Node
         ]
@@ -88,7 +88,7 @@
     (t == #Float) ifTrue:[
         (val = 0.0) ifTrue:[
             Float0Node isNil ifTrue:[
-                Float0Node := super type:t value:val
+                Float0Node := (self basicNew) type:t value:val
             ].
             ^ Float0Node
         ]
@@ -96,6 +96,13 @@
     ^ (self basicNew) type:t value:val
 ! !
 
+!ConstantNode methodsFor:'accessing'!
+
+type:t value:val
+    type := t.
+    value := val
+! !
+
 !ConstantNode methodsFor:'queries'!
 
 isConstant
@@ -109,6 +116,8 @@
 !
 
 store:aValue
+    "not reached - parser checks for this"
+
     self error:'store not allowed'.
     ^ aValue
 ! !
@@ -150,14 +159,18 @@
     aStream nextPut:value
 !
 
-codeStoreOn:aStream
-    "should never be sent"
+codeStoreOn:aStream inBlock:codeBlock valueNeeded:valueNeeded
+    "not sent - parser checks for this"
 
     ^ self error:'assignment to literals not allowed'
 ! !
 
 !ConstantNode methodsFor:'printing'!
 
+displayString
+    ^ value displayString
+!
+
 printOn:aStream indent:i
     value storeOn:aStream
 ! !
--- a/Make.proto	Wed Jan 12 21:20:41 1994 +0100
+++ b/Make.proto	Sun Jan 16 04:51:45 1994 +0100
@@ -14,7 +14,7 @@
 STCFLAGS= -H../include -warnGlobalAssign $(STCOPT)
 
 OBJS=	    Scanner.$(O) Variable.$(O) ParseNode.$(O) Parser.$(O) \
-	    PrimaryNd.$(O) \
+	    PrimaryNd.$(O) VarNode.$(O) SelfNode.$(O) SuperNode.$(O) \
 	    StatNode.$(O) AssignNd.$(O) BlockNode.$(O) MessageNd.$(O) \
 	    BCompiler.$(O) RetNode.$(O) UnaryNd.$(O) BinaryNd.$(O) \
 	    PrimNd.$(O) CascadeNd.$(O) ConstNode.$(O) \
@@ -28,6 +28,7 @@
 objs::      level0 \
 	    level1 \
 	    level2 \
+	    level3 \
 	    $(EXTRA_LIBCOMP)
 
 #
@@ -56,8 +57,13 @@
 		  BinaryNd.o                        \
 		  CascadeNd.o                       \
 		  PrimNd.o                          \
+		  VarNode.o                         \
+		  SelfNode.o                        \
 		  ConstNode.o                     
 
+level3:$(P)                                         \
+		  SuperNode.o
+
 install::
 		-mkdir $(DESTLIBDIR)
 		-$(INSTALL) $(LIBNAME)$(OBJNAME) $(DESTLIBDIR)
@@ -111,7 +117,10 @@
 AssignNd.o:     AssignNd.st $(PARSENODE)
 BlockNode.o:    BlockNode.st $(PARSENODE)
 PrimaryNd.o:    PrimaryNd.st $(PARSENODE)
+SelfNode.o:     SelfNode.st $(PRIMARYNODE)
 ConstNode.o:    ConstNode.st $(PRIMARYNODE)
+VariableNode.o: VariableNode.st $(PRIMARYNODE)
+SuperNode.o:    SuperNode.st $(I)/SelfNode.H $(PRIMARYNODE)
 MessageNd.o:    MessageNd.st $(PARSENODE)
 CascadeNd.o:    CascadeNd.st $(MESSAGENODE)
 PrimNd.o:       PrimNd.st $(MESSAGENODE)
--- a/MessageNd.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/MessageNd.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/MessageNd.st,v 1.5 1994-01-12 20:20:41 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/MessageNd.st,v 1.6 1994-01-16 03:51:36 claus Exp $
 '!
 
 !MessageNode class methodsFor:'instance creation'!
@@ -351,7 +351,19 @@
 !MessageNode methodsFor:'evaluating'!
 
 evaluate
-    |r nargs argValueArray index|
+    |r nargs argValueArray class|
+
+    receiver isSuper ifTrue:[
+        r := receiver value.
+        class := receiver definingClass superclass.
+        argArray notNil ifTrue:[
+            argValueArray := argArray collect:[:arg | arg evaluate].
+        ] ifFalse:[
+            argValueArray := #()
+        ].
+        ^ r perform:selector inClass:class withArguments:argValueArray
+    ].
+
 
     argArray isNil ifTrue:[
         ^ (receiver evaluate) perform:selector
@@ -372,17 +384,24 @@
                                  with:(argArray at:3) evaluate
     ].
     r := receiver evaluate.
-    argValueArray := Array new:nargs.
-    index := 1.
-    [index <= nargs] whileTrue:[
-        argValueArray at:index put:((argArray at:index) evaluate).
-        index := index + 1
-    ].
+    argValueArray := argArray collect:[:arg | arg evaluate].
     ^ r perform:selector withArguments:argValueArray
 !
 
 evaluateForCascade
-    |r nargs argValueArray index|
+    |r nargs argValueArray class|
+
+    receiver isSuper ifTrue:[
+        r := receiver value.
+        class := receiver definingClass superclass.
+        argArray notNil ifTrue:[
+            argValueArray := argArray collect:[:arg | arg evaluate].
+        ] ifFalse:[
+            argValueArray := #()
+        ].
+        r perform:selector inClass:class withArguments:argValueArray.
+        ^ r
+    ].
 
     r := receiver evaluate.
     argArray isNil ifTrue:[
@@ -405,12 +424,7 @@
                            with:(argArray at:3) evaluate.
         ^ r
     ].
-    argValueArray := Array new:nargs.
-    index := 1.
-    [index <= nargs] whileTrue:[
-        argValueArray at:index put:((argArray at:index) evaluate).
-        index := index + 1
-    ].
+    argValueArray := argArray collect:[:arg | arg evaluate].
     r perform:selector withArguments:argValueArray.
     ^ r
 ! !
--- a/MessageNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/MessageNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.5 1994-01-12 20:20:41 claus Exp $
+$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.6 1994-01-16 03:51:36 claus Exp $
 '!
 
 !MessageNode class methodsFor:'instance creation'!
@@ -351,7 +351,19 @@
 !MessageNode methodsFor:'evaluating'!
 
 evaluate
-    |r nargs argValueArray index|
+    |r nargs argValueArray class|
+
+    receiver isSuper ifTrue:[
+        r := receiver value.
+        class := receiver definingClass superclass.
+        argArray notNil ifTrue:[
+            argValueArray := argArray collect:[:arg | arg evaluate].
+        ] ifFalse:[
+            argValueArray := #()
+        ].
+        ^ r perform:selector inClass:class withArguments:argValueArray
+    ].
+
 
     argArray isNil ifTrue:[
         ^ (receiver evaluate) perform:selector
@@ -372,17 +384,24 @@
                                  with:(argArray at:3) evaluate
     ].
     r := receiver evaluate.
-    argValueArray := Array new:nargs.
-    index := 1.
-    [index <= nargs] whileTrue:[
-        argValueArray at:index put:((argArray at:index) evaluate).
-        index := index + 1
-    ].
+    argValueArray := argArray collect:[:arg | arg evaluate].
     ^ r perform:selector withArguments:argValueArray
 !
 
 evaluateForCascade
-    |r nargs argValueArray index|
+    |r nargs argValueArray class|
+
+    receiver isSuper ifTrue:[
+        r := receiver value.
+        class := receiver definingClass superclass.
+        argArray notNil ifTrue:[
+            argValueArray := argArray collect:[:arg | arg evaluate].
+        ] ifFalse:[
+            argValueArray := #()
+        ].
+        r perform:selector inClass:class withArguments:argValueArray.
+        ^ r
+    ].
 
     r := receiver evaluate.
     argArray isNil ifTrue:[
@@ -405,12 +424,7 @@
                            with:(argArray at:3) evaluate.
         ^ r
     ].
-    argValueArray := Array new:nargs.
-    index := 1.
-    [index <= nargs] whileTrue:[
-        argValueArray at:index put:((argArray at:index) evaluate).
-        index := index + 1
-    ].
+    argValueArray := argArray collect:[:arg | arg evaluate].
     r perform:selector withArguments:argValueArray.
     ^ r
 ! !
--- a/ParseNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/ParseNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/ParseNode.st,v 1.3 1993-10-13 02:41:34 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ParseNode.st,v 1.4 1994-01-16 03:51:38 claus Exp $
 '!
 
 !ParseNode class methodsFor:'instance creation'!
@@ -34,29 +34,51 @@
 !ParseNode methodsFor:'queries'!
 
 isConstant
+    "return true, if this is a node for a constant"
+
+    ^ false
+!
+
+isSuper
+    "return true, if this is a super-node"
+
+    ^ false
+!
+
+isReturnNode
+    "return true, if this is a node for a return expression"
+
     ^ false
 !
 
 isMessage
+    "return true, if this is a node for a message expression"
+
     ^ false
 !
 
 isBinaryMessage
+    "return true, if this is a node for a binary send"
+
     ^ false
 !
 
 isUnaryMessage
+    "return true, if this is a node for a unary send"
+
     ^ false
 ! !
 
 !ParseNode methodsFor:'accessing'!
 
 type
+    "return the nodes type"
+
     ^ type
 !
 
 lineNumber:dummy
-    "ignored here"
+    "set linenumber - ignored here"
 
     ^ self
 ! !
@@ -64,6 +86,8 @@
 !ParseNode methodsFor:'private'!
 
 type:t
+    "set the nodes type"
+
     type := t
 ! !
 
--- a/Parser.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/Parser.st	Sun Jan 16 04:51:45 1994 +0100
@@ -43,7 +43,7 @@
 a method - this is done by sending parseXXX message to a parser and asking
 the parser for referencedXVars or modifiedXVars (see SystemBrowser).
 
-$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.7 1994-01-09 21:30:19 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.8 1994-01-16 03:51:39 claus Exp $
 '!
 
 !Parser class methodsFor:'evaluating expressions'!
@@ -793,6 +793,7 @@
         ^ #Error
     ].
     expr := self expression.
+    (expr == #Error) ifTrue:[^ #Error].
 "
     classToCompileFor notNil ifTrue:[
         currentBlock isNil ifTrue:[
@@ -802,7 +803,6 @@
         ]
     ].
 "
-    (expr == #Error) ifTrue:[^ #Error].
     ^ StatementNode expression:expr
 !
 
@@ -890,8 +890,7 @@
         try := MessageNode receiver:receiver selector:sel args:args.
         (try isMemberOf:String) ifTrue:[
             self parseError:try position:pos1 to:pos2.
-            receiver := MessageNode receiver:receiver selector:sel args:args
-                                        fold:false
+            receiver := MessageNode receiver:receiver selector:sel args:args fold:false
         ] ifFalse:[
             receiver := try
         ].
@@ -963,8 +962,7 @@
         try := BinaryNode receiver:receiver selector:sel arg:arg.
         (try isMemberOf:String) ifTrue:[
             self parseError:try position:pos to:tokenPosition.
-            receiver := BinaryNode receiver:receiver selector:sel arg:arg
-                                       fold:false
+            receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:false
         ] ifFalse:[
             receiver := try
         ].
@@ -1072,7 +1070,7 @@
             ^ #Error
         ].
         selfNode isNil ifTrue:[
-            selfNode := PrimaryNode type:#Self value:selfValue
+            selfNode := SelfNode value:selfValue
         ].
         ^ selfNode
     ].
@@ -1125,7 +1123,7 @@
             ^ #Error
         ].
         superNode isNil ifTrue:[
-            superNode := PrimaryNode type:#Super value:selfValue
+            superNode := SuperNode value:selfValue inClass:classToCompileFor
         ].
         ^ superNode
     ].
@@ -1135,7 +1133,7 @@
             self parseError:'assignment to thisContext' position:pos to:tokenPosition.
             ^ #Error
         ].
-        ^ PrimaryNode type:#ThisContext value:nil
+        ^ VariableNode type:#ThisContext
     ].
     (tokenType == #HashLeftParen) ifTrue:[
         self nextToken.
@@ -1206,11 +1204,11 @@
                 runIndex := runIndex + 1
             ].
             tokenFound notNil ifTrue:[
-                ^ PrimaryNode type:#BlockArg
-                              name:varName
-                             token:tokenFound
-                             index:instIndex
-                             block:theBlock
+                ^ VariableNode type:#BlockArg
+                               name:varName
+                              token:tokenFound
+                              index:instIndex
+                              block:theBlock
             ]
         ].
 
@@ -1226,11 +1224,11 @@
                 runIndex := runIndex + 1
             ].
             tokenFound notNil ifTrue:[
-                ^ PrimaryNode type:#BlockVariable
-                              name:varName
-                             token:tokenFound
-                             index:instIndex
-                             block:theBlock
+                ^ VariableNode type:#BlockVariable
+                               name:varName
+                              token:tokenFound
+                              index:instIndex
+                              block:theBlock
             ]
         ].
         searchBlock := searchBlock home
@@ -1242,10 +1240,10 @@
         instIndex ~~ 0 ifTrue:[
             var := methodVars at:instIndex.
             var used:true.
-            ^ PrimaryNode type:#MethodVariable
-                          name:varName
-                         token:var
-                         index:instIndex
+            ^ VariableNode type:#MethodVariable
+                           name:varName
+                          token:var
+                          index:instIndex
         ]
     ].
 
@@ -1253,10 +1251,10 @@
     methodArgs notNil ifTrue:[
         instIndex := methodArgNames indexOf:varName.
         instIndex ~~ 0 ifTrue:[
-            ^ PrimaryNode type:#MethodArg
-                          name:varName
-                         token:(methodArgs at:instIndex)
-                         index:instIndex
+            ^ VariableNode type:#MethodArg
+                           name:varName
+                          token:(methodArgs at:instIndex)
+                          index:instIndex
         ]
     ].
 
@@ -1289,10 +1287,10 @@
             (usedVars includes:varName) ifFalse:[
                 usedVars add:varName
             ].
-            ^ PrimaryNode type:#InstanceVariable 
-                          name:varName
-                         index:instIndex
-                     selfValue:selfValue
+            ^ VariableNode type:#InstanceVariable 
+                           name:varName
+                          index:instIndex
+                      selfValue:selfValue
         ]
     ].
 
@@ -1312,10 +1310,10 @@
                 (usedVars includes:varName) ifFalse:[
                     usedVars add:varName
                 ].
-                ^ PrimaryNode type:#ClassInstanceVariable
-                              name:varName
-                             index:instIndex
-                         selfValue:selfValue
+                ^ VariableNode type:#ClassInstanceVariable
+                               name:varName
+                              index:instIndex
+                          selfClass:aClass
             ]
         ]
     ].
@@ -1351,8 +1349,8 @@
                 (usedVars includes:varName) ifFalse:[
                     usedVars add:varName
                 ].
-                ^ PrimaryNode type:#ClassVariable 
-                              name:(aClass name , ':' , varName) asSymbol
+                ^ VariableNode type:#ClassVariable 
+                               name:(aClass name , ':' , varName) asSymbol
             ]
         ]
     ].
@@ -1366,8 +1364,7 @@
         (usedVars includes:varName) ifFalse:[
             usedVars add:varName
         ].
-        ^ PrimaryNode type:#GlobalVariable 
-                      name:tokenSymbol
+        ^ VariableNode type:#GlobalVariable name:tokenSymbol
     ].
     ^ #Error
 !
@@ -1381,8 +1378,7 @@
     (v == #Error) ifFalse:[^ v].
     v := self correctVariable.
     (v == #Error) ifFalse:[^ v].
-    ^ PrimaryNode type:#GlobalVariable
-                  name:tokenName asSymbol
+    ^ VariableNode type:#GlobalVariable name:tokenName asSymbol
 !
 
 inWhichClassIsClassVar:aString
@@ -1781,8 +1777,7 @@
     ] ifFalse:[
         correctIt := self warning:(varName , ' is undefined') position:pos1 to:pos2.
         correctIt ifFalse:[
-            ^ PrimaryNode type:#GlobalVariable
-                          name:(varName asSymbol)
+            ^ VariableNode type:#GlobalVariable name:(varName asSymbol)
         ]
     ].
 
--- a/PrimaryNd.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/PrimaryNd.st	Sun Jan 16 04:51:45 1994 +0100
@@ -11,7 +11,7 @@
 "
 
 ParseNode subclass:#PrimaryNode
-       instanceVariableNames:'value name selfValue token index block'
+       instanceVariableNames:'value'
        classVariableNames:''
        poolDictionaries:''
        category:'System-Compiler-Support'
@@ -22,127 +22,12 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
              All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/PrimaryNd.st,v 1.4 1993-12-11 01:09:30 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/PrimaryNd.st,v 1.5 1994-01-16 03:51:42 claus Exp $
 written 88 by claus
 '!
 
-!PrimaryNode class methodsFor:'instance creation'!
-
-type:t token:tok
-    ^ (self basicNew) type:t token:tok
-!
-
-type:t name:n
-    ^ (self basicNew) type:t name:n
-!
-
-type:t index:i selfValue:s
-    ^ (self basicNew) type:t index:i selfValue:s
-!
-
-type:t value:val
-    ^ (self basicNew) type:t value:val
-!
-
-type:t name:n value:val
-    ^ (self basicNew) type:t name:n value:val
-!
-
-type:t name:n token:tok index:i
-    ^ (self basicNew) type:t name:n token:tok index:i
-!
-
-type:t name:n index:i selfValue:s
-    ^ (self basicNew) type:t name:n index:i selfValue:s
-!
-
-type:t name:n token:tok index:i block:b
-    ^ (self basicNew) type:t name:n token:tok index:i block:b
-!
-
-type:t token:tok index:i
-    ^ (self basicNew) type:t token:tok index:i
-!
-
-type:t token:tok index:i block:b
-    ^ (self basicNew) type:t token:tok index:i block:b
-! !
-
 !PrimaryNode methodsFor:'accessing'!
 
-type:t token:tok
-    type := t.
-    token := tok
-!
-
-type:t token:tok index:i
-    type := t.
-    index := i.
-    token := tok
-!
-
-type:t token:tok index:i block:b
-    type := t.
-    index := i.
-    block := b.
-    token := tok
-!
-
-type:t name:n
-    type := t.
-    value := nil.
-    name := n
-!
-
-type:t index:i selfValue:s
-    type := t.
-    value := nil.
-    index := i.
-    selfValue := s
-!
-
-type:t value:val
-    type := t.
-    value := val
-!
-
-type:t name:n value:val
-    type := t.
-    name := n.
-    value := val
-!
-
-type:t name:n index:i selfValue:s
-    type := t.
-    value := nil.
-    index := i.
-    selfValue := s.
-    name := n
-!
-
-type:t name:n token:tok index:i
-    type := t.
-    index := i.
-    token := tok.
-    name := n
-!
-
-type:t name:n token:tok index:i block:b
-    type := t.
-    index := i.
-    block := b.
-    token := tok.
-    name := n
-!
-
-name
-    ^ name
-!
-
-index
-    ^ index
-!
-
 value
     ^ value
 ! !
@@ -150,61 +35,11 @@
 !PrimaryNode methodsFor:'evaluating'!
 
 evaluate
-    (type == #MethodVariable) ifTrue:[
-        ^ token value
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        ^ selfValue instVarAt:index
-    ].
-    (type == #BlockArg) ifTrue:[
-        ^ token value
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        (Smalltalk includesKey:name) ifTrue:[
-            ^ Smalltalk at:name
-        ].
-"
-        self error:('global ' , name , ' is undefined').
-"
-
-        ^ UndefinedVariable name:name.
-        ^ nil
-    ].
-    (type == #BlockVariable) ifTrue:[
-        ^ token value
-    ].
-    (type == #ClassVariable) ifTrue:[
-        ^ Smalltalk at:name
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        ^ selfValue class instVarAt:index
-    ].
-    (type == #ThisContext) ifTrue:[
-        ^ thisContext
-    ].
-    ^ value
+    self subclassResponsibility
 !
 
 store:aValue
-    (type == #MethodVariable) ifTrue:[
-        token value:aValue
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        ^ selfValue instVarAt:index put:aValue
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        ^ Smalltalk at:name put:aValue
-    ].
-    (type == #ClassVariable) ifTrue:[
-        ^ Smalltalk at:name put:aValue
-    ].
-    (type == #BlockVariable) ifTrue:[
-        token value:aValue
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        ^ selfValue class instVarAt:index put:aValue
-    ].
-    ^ aValue
+    self subclassResponsibility
 ! !
 
 !PrimaryNode methodsFor:'code generation'!
@@ -215,264 +50,19 @@
 !
 
 codeOn:aStream inBlock:codeBlock
-    |theCode b deltaLevel|
-
-    (type == #Self) ifTrue:[
-        aStream nextPut:#pushSelf. ^ self
-    ].
-    (type == #MethodArg) ifTrue:[
-        (index <= 4) ifTrue:[
-            aStream nextPut:(#(pushMethodArg1
-                               pushMethodArg2
-                               pushMethodArg3 
-                               pushMethodArg4) at:index).
-            ^ self
-        ].
-        aStream nextPut:#pushMethodArg.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #MethodVariable) ifTrue:[
-        (index <= 6) ifTrue:[
-            aStream nextPut:(#(pushMethodVar1
-                               pushMethodVar2
-                               pushMethodVar3
-                               pushMethodVar4
-                               pushMethodVar5
-                               pushMethodVar6) at:index).
-            ^ self
-        ].
-        aStream nextPut:#pushMethodVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        (index <= 10) ifTrue:[
-            theCode := #(pushInstVar1 pushInstVar2 pushInstVar3
-                         pushInstVar4 pushInstVar5 pushInstVar6
-                         pushInstVar7 pushInstVar8 pushInstVar9
-                         pushInstVar10) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#pushInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #BlockArg) ifTrue:[
-        "find deltaLevel to block, where argument was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-        (deltaLevel == 0) ifTrue:[
-            (index <= 4) ifTrue:[
-                theCode := #(pushBlockArg1 pushBlockArg2 pushBlockArg3
-                             pushBlockArg4) at:index.
-                aStream nextPut:theCode.
-                ^ self
-            ].
-            aStream nextPut:#pushBlockArg.
-            aStream nextPut:index
-        ] ifFalse:[
-            (deltaLevel == 1) ifTrue:[
-                aStream nextPut:#pushOuter1BlockArg
-            ] ifFalse:[
-                (deltaLevel == 2) ifTrue:[
-                    aStream nextPut:#pushOuter2BlockArg
-                ] ifFalse:[
-                    aStream nextPut:#pushOuterBlockArg.
-                    aStream nextPut:deltaLevel
-                ]
-            ].
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #Super) ifTrue:[
-        aStream nextPut:#pushSelf. ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPut:#pushGlobal.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPut:#pushClassVar.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        "find deltaLevel to block, where variable was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-
-        (deltaLevel == 0) ifTrue:[
-            aStream nextPut:#pushBlockVar.
-            aStream nextPut:index
-        ] ifFalse:[
-            aStream nextPut:#pushOuterBlockVar.
-            aStream nextPut:deltaLevel.
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPut:#pushClassInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #ThisContext) ifTrue:[
-        aStream nextPut:#pushThisContext. ^ self
-    ].
-
-    "can this be reached ?"
-
-    aStream nextPut:#pushLit.
-    aStream nextPut:value
+    self subclassResponsibility
 !
 
 codeStoreOn:aStream inBlock:codeBlock valueNeeded:valueNeeded
-    |theCode b deltaLevel|
-
-    valueNeeded ifTrue:[
-        aStream nextPut:#dup
-    ].
-    (type == #MethodVariable) ifTrue:[
-        (index <= 6) ifTrue:[
-            theCode := #(storeMethodVar1 storeMethodVar2
-                         storeMethodVar3 storeMethodVar4
-                         storeMethodVar5 storeMethodVar6) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#storeMethodVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        (index <= 10) ifTrue:[
-            theCode := #(storeInstVar1 storeInstVar2
-                         storeInstVar3 storeInstVar4
-                         storeInstVar5 storeInstVar6
-                         storeInstVar7 storeInstVar8
-                         storeInstVar9 storeInstVar10) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#storeInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPut:#storeGlobal.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        "find deltaLevel to block, where variable was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-
-        (deltaLevel == 0) ifTrue:[
-            aStream nextPut:#storeBlockVar.
-            aStream nextPut:index
-        ] ifFalse:[
-            aStream nextPut:#storeOuterBlockVar.
-            aStream nextPut:deltaLevel.
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPut:#storeClassVar.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPut:#storeClassInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    "cannot be reached"
-    ^ self error:'bad assignment'
+    self subclassResponsibility
 ! !
 
 !PrimaryNode methodsFor:'printing'!
 
 displayString
-    ^ 'InterpreterVariable(' , self printString , ')'
+    self subclassResponsibility
 !
 
 printOn:aStream indent:i
-    (type == #Self) ifTrue:[
-        aStream nextPutAll:'self'. ^ self
-    ].
-    (type == #MethodArg) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #MethodVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #BlockArg) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #Super) ifTrue:[
-        aStream nextPutAll:'super'. ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPutAll:name.^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #ThisContext) ifTrue:[
-        aStream nextPutAll:'thisContext'. ^ self
-    ].
-    self halt
+    self subclassResponsibility
 ! !
--- a/PrimaryNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/PrimaryNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -11,7 +11,7 @@
 "
 
 ParseNode subclass:#PrimaryNode
-       instanceVariableNames:'value name selfValue token index block'
+       instanceVariableNames:'value'
        classVariableNames:''
        poolDictionaries:''
        category:'System-Compiler-Support'
@@ -22,127 +22,12 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
              All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/PrimaryNode.st,v 1.4 1993-12-11 01:09:30 claus Exp $
+$Header: /cvs/stx/stx/libcomp/PrimaryNode.st,v 1.5 1994-01-16 03:51:42 claus Exp $
 written 88 by claus
 '!
 
-!PrimaryNode class methodsFor:'instance creation'!
-
-type:t token:tok
-    ^ (self basicNew) type:t token:tok
-!
-
-type:t name:n
-    ^ (self basicNew) type:t name:n
-!
-
-type:t index:i selfValue:s
-    ^ (self basicNew) type:t index:i selfValue:s
-!
-
-type:t value:val
-    ^ (self basicNew) type:t value:val
-!
-
-type:t name:n value:val
-    ^ (self basicNew) type:t name:n value:val
-!
-
-type:t name:n token:tok index:i
-    ^ (self basicNew) type:t name:n token:tok index:i
-!
-
-type:t name:n index:i selfValue:s
-    ^ (self basicNew) type:t name:n index:i selfValue:s
-!
-
-type:t name:n token:tok index:i block:b
-    ^ (self basicNew) type:t name:n token:tok index:i block:b
-!
-
-type:t token:tok index:i
-    ^ (self basicNew) type:t token:tok index:i
-!
-
-type:t token:tok index:i block:b
-    ^ (self basicNew) type:t token:tok index:i block:b
-! !
-
 !PrimaryNode methodsFor:'accessing'!
 
-type:t token:tok
-    type := t.
-    token := tok
-!
-
-type:t token:tok index:i
-    type := t.
-    index := i.
-    token := tok
-!
-
-type:t token:tok index:i block:b
-    type := t.
-    index := i.
-    block := b.
-    token := tok
-!
-
-type:t name:n
-    type := t.
-    value := nil.
-    name := n
-!
-
-type:t index:i selfValue:s
-    type := t.
-    value := nil.
-    index := i.
-    selfValue := s
-!
-
-type:t value:val
-    type := t.
-    value := val
-!
-
-type:t name:n value:val
-    type := t.
-    name := n.
-    value := val
-!
-
-type:t name:n index:i selfValue:s
-    type := t.
-    value := nil.
-    index := i.
-    selfValue := s.
-    name := n
-!
-
-type:t name:n token:tok index:i
-    type := t.
-    index := i.
-    token := tok.
-    name := n
-!
-
-type:t name:n token:tok index:i block:b
-    type := t.
-    index := i.
-    block := b.
-    token := tok.
-    name := n
-!
-
-name
-    ^ name
-!
-
-index
-    ^ index
-!
-
 value
     ^ value
 ! !
@@ -150,61 +35,11 @@
 !PrimaryNode methodsFor:'evaluating'!
 
 evaluate
-    (type == #MethodVariable) ifTrue:[
-        ^ token value
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        ^ selfValue instVarAt:index
-    ].
-    (type == #BlockArg) ifTrue:[
-        ^ token value
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        (Smalltalk includesKey:name) ifTrue:[
-            ^ Smalltalk at:name
-        ].
-"
-        self error:('global ' , name , ' is undefined').
-"
-
-        ^ UndefinedVariable name:name.
-        ^ nil
-    ].
-    (type == #BlockVariable) ifTrue:[
-        ^ token value
-    ].
-    (type == #ClassVariable) ifTrue:[
-        ^ Smalltalk at:name
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        ^ selfValue class instVarAt:index
-    ].
-    (type == #ThisContext) ifTrue:[
-        ^ thisContext
-    ].
-    ^ value
+    self subclassResponsibility
 !
 
 store:aValue
-    (type == #MethodVariable) ifTrue:[
-        token value:aValue
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        ^ selfValue instVarAt:index put:aValue
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        ^ Smalltalk at:name put:aValue
-    ].
-    (type == #ClassVariable) ifTrue:[
-        ^ Smalltalk at:name put:aValue
-    ].
-    (type == #BlockVariable) ifTrue:[
-        token value:aValue
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        ^ selfValue class instVarAt:index put:aValue
-    ].
-    ^ aValue
+    self subclassResponsibility
 ! !
 
 !PrimaryNode methodsFor:'code generation'!
@@ -215,264 +50,19 @@
 !
 
 codeOn:aStream inBlock:codeBlock
-    |theCode b deltaLevel|
-
-    (type == #Self) ifTrue:[
-        aStream nextPut:#pushSelf. ^ self
-    ].
-    (type == #MethodArg) ifTrue:[
-        (index <= 4) ifTrue:[
-            aStream nextPut:(#(pushMethodArg1
-                               pushMethodArg2
-                               pushMethodArg3 
-                               pushMethodArg4) at:index).
-            ^ self
-        ].
-        aStream nextPut:#pushMethodArg.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #MethodVariable) ifTrue:[
-        (index <= 6) ifTrue:[
-            aStream nextPut:(#(pushMethodVar1
-                               pushMethodVar2
-                               pushMethodVar3
-                               pushMethodVar4
-                               pushMethodVar5
-                               pushMethodVar6) at:index).
-            ^ self
-        ].
-        aStream nextPut:#pushMethodVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        (index <= 10) ifTrue:[
-            theCode := #(pushInstVar1 pushInstVar2 pushInstVar3
-                         pushInstVar4 pushInstVar5 pushInstVar6
-                         pushInstVar7 pushInstVar8 pushInstVar9
-                         pushInstVar10) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#pushInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #BlockArg) ifTrue:[
-        "find deltaLevel to block, where argument was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-        (deltaLevel == 0) ifTrue:[
-            (index <= 4) ifTrue:[
-                theCode := #(pushBlockArg1 pushBlockArg2 pushBlockArg3
-                             pushBlockArg4) at:index.
-                aStream nextPut:theCode.
-                ^ self
-            ].
-            aStream nextPut:#pushBlockArg.
-            aStream nextPut:index
-        ] ifFalse:[
-            (deltaLevel == 1) ifTrue:[
-                aStream nextPut:#pushOuter1BlockArg
-            ] ifFalse:[
-                (deltaLevel == 2) ifTrue:[
-                    aStream nextPut:#pushOuter2BlockArg
-                ] ifFalse:[
-                    aStream nextPut:#pushOuterBlockArg.
-                    aStream nextPut:deltaLevel
-                ]
-            ].
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #Super) ifTrue:[
-        aStream nextPut:#pushSelf. ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPut:#pushGlobal.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPut:#pushClassVar.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        "find deltaLevel to block, where variable was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-
-        (deltaLevel == 0) ifTrue:[
-            aStream nextPut:#pushBlockVar.
-            aStream nextPut:index
-        ] ifFalse:[
-            aStream nextPut:#pushOuterBlockVar.
-            aStream nextPut:deltaLevel.
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPut:#pushClassInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #ThisContext) ifTrue:[
-        aStream nextPut:#pushThisContext. ^ self
-    ].
-
-    "can this be reached ?"
-
-    aStream nextPut:#pushLit.
-    aStream nextPut:value
+    self subclassResponsibility
 !
 
 codeStoreOn:aStream inBlock:codeBlock valueNeeded:valueNeeded
-    |theCode b deltaLevel|
-
-    valueNeeded ifTrue:[
-        aStream nextPut:#dup
-    ].
-    (type == #MethodVariable) ifTrue:[
-        (index <= 6) ifTrue:[
-            theCode := #(storeMethodVar1 storeMethodVar2
-                         storeMethodVar3 storeMethodVar4
-                         storeMethodVar5 storeMethodVar6) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#storeMethodVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        (index <= 10) ifTrue:[
-            theCode := #(storeInstVar1 storeInstVar2
-                         storeInstVar3 storeInstVar4
-                         storeInstVar5 storeInstVar6
-                         storeInstVar7 storeInstVar8
-                         storeInstVar9 storeInstVar10) at:index.
-            aStream nextPut:theCode.
-            ^ self
-        ].
-        aStream nextPut:#storeInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPut:#storeGlobal.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        "find deltaLevel to block, where variable was defined"
-        b := codeBlock.
-        deltaLevel := 0.
-        [b notNil and:[b ~~ block]] whileTrue:[
-            b inlineBlock ifFalse:[
-                deltaLevel := deltaLevel + 1
-            ].
-            b := b home
-        ].
-
-        (deltaLevel == 0) ifTrue:[
-            aStream nextPut:#storeBlockVar.
-            aStream nextPut:index
-        ] ifFalse:[
-            aStream nextPut:#storeOuterBlockVar.
-            aStream nextPut:deltaLevel.
-            aStream nextPut:index
-        ].
-        ^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPut:#storeClassVar.
-        aStream nextPut:name.
-        aStream nextPut:0.      "slot for generation "
-        aStream nextPut:0.      "slot for cell address (4 byte) "
-        aStream nextPut:0.
-        aStream nextPut:0.
-        aStream nextPut:0.
-        ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPut:#storeClassInstVar.
-        aStream nextPut:index.
-        ^ self
-    ].
-    "cannot be reached"
-    ^ self error:'bad assignment'
+    self subclassResponsibility
 ! !
 
 !PrimaryNode methodsFor:'printing'!
 
 displayString
-    ^ 'InterpreterVariable(' , self printString , ')'
+    self subclassResponsibility
 !
 
 printOn:aStream indent:i
-    (type == #Self) ifTrue:[
-        aStream nextPutAll:'self'. ^ self
-    ].
-    (type == #MethodArg) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #MethodVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #InstanceVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #BlockArg) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #Super) ifTrue:[
-        aStream nextPutAll:'super'. ^ self
-    ].
-    (type == #GlobalVariable) ifTrue:[
-        aStream nextPutAll:name.^ self
-    ].
-    (type == #ClassVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #BlockVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #ClassInstanceVariable) ifTrue:[
-        aStream nextPutAll:name. ^ self
-    ].
-    (type == #ThisContext) ifTrue:[
-        aStream nextPutAll:'thisContext'. ^ self
-    ].
-    self halt
+    self subclassResponsibility
 ! !
--- a/RetNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/RetNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/RetNode.st,v 1.3 1993-10-13 02:41:43 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/RetNode.st,v 1.4 1994-01-16 03:51:44 claus Exp $
 '!
 
 !ReturnNode methodsFor:'accessing'!
@@ -31,6 +31,12 @@
     blockHome := aBlockNode
 ! !
 
+!ReturnNode methodsFor:'queries'!
+
+isReturnNode
+    ^ true
+! !
+
 !ReturnNode methodsFor:'evaluating'!
 
 evaluateExpression
--- a/ReturnNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/ReturnNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/ReturnNode.st,v 1.3 1993-10-13 02:41:43 claus Exp $
+$Header: /cvs/stx/stx/libcomp/ReturnNode.st,v 1.4 1994-01-16 03:51:44 claus Exp $
 '!
 
 !ReturnNode methodsFor:'accessing'!
@@ -31,6 +31,12 @@
     blockHome := aBlockNode
 ! !
 
+!ReturnNode methodsFor:'queries'!
+
+isReturnNode
+    ^ true
+! !
+
 !ReturnNode methodsFor:'evaluating'!
 
 evaluateExpression
--- a/UnaryNd.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/UnaryNd.st	Sun Jan 16 04:51:45 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.4 1994-01-09 21:30:25 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/UnaryNd.st,v 1.5 1994-01-16 03:51:45 claus Exp $
 '!
 
 !UnaryNode class methodsFor:'instance creation'!
@@ -126,6 +126,9 @@
 evaluate
     "evaluate the expression represented by the receiver"
 
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
     ^ (receiver evaluate) perform:selector
 ! !
 
--- a/UnaryNode.st	Wed Jan 12 21:20:41 1994 +0100
+++ b/UnaryNode.st	Sun Jan 16 04:51:45 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.4 1994-01-09 21:30:25 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.5 1994-01-16 03:51:45 claus Exp $
 '!
 
 !UnaryNode class methodsFor:'instance creation'!
@@ -126,6 +126,9 @@
 evaluate
     "evaluate the expression represented by the receiver"
 
+    receiver isSuper ifTrue:[
+        ^ super evaluate
+    ].
     ^ (receiver evaluate) perform:selector
 ! !