BCompiler.st
changeset 106 2653f74569d1
parent 105 16fd75fcbd3b
child 108 dc930059fbc9
--- a/BCompiler.st	Sun Aug 13 00:59:41 1995 +0200
+++ b/BCompiler.st	Sun Aug 13 22:52:47 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.32 1995-08-12 22:59:26 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.33 1995-08-13 20:51:58 claus Exp $
 '!
 
 !ByteCodeCompiler class methodsFor:'documentation'!
@@ -47,7 +47,7 @@
 
 version
 "
-$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.32 1995-08-12 22:59:26 claus Exp $
+$Header: /cvs/stx/stx/libcomp/Attic/BCompiler.st,v 1.33 1995-08-13 20:51:58 claus Exp $
 "
 !
 
@@ -534,6 +534,8 @@
 
     |canDo|
 
+    ObjectFileLoader isNil ifTrue:[^ false].
+
     canDo := false.
     OperatingSystem getSystemType = 'iris' ifTrue:[
 	canDo := true.
@@ -709,54 +711,17 @@
 		].
 		(extra == #lit) ifTrue:[
 		    index := self addLiteral:(symbolicCodeArray at:symIndex).
-		    index > 255 ifTrue:[
-			codeSymbol == #pushLit ifFalse:[
-			    round ~~ 1 ifTrue:[
-				self parseError:'too many (' , index printString , ') literals in method (at ' , codeSymbol , ') - please simplify'.
-				^ #Error
-			    ].
-			    "move that literal to the front"
-			    ('COMPILER: move literal', (litArray at:index) , ' to front') infoPrintNL.
-			    t := Array basicNew:litArray size.
-			    t replaceFrom:2 to:index - 1 with:litArray startingAt:1.
-			    t replaceFrom:index with:litArray startingAt:index+1.
-			    t at:1 put:(litArray at:index).
-			    litArray := t.
-			    needRetry := true.
-			    index := 0
-			] ifTrue:[
-			    "
-			     make pushLit into pushLLit and start over
-			    "
-			    'COMPILER: need long index for literal' infoPrintNL.
-			    symbolicCodeArray at:(symIndex - 1) put:#pushLLit.
-			    codeSize := codeSize + 1.
-			    needRetry := true.
-			    index := 0.
-			]
-		    ].
 		    symIndex := symIndex + 1.
 		    self appendByte:index
 		].
 		(extra == #speciallit) ifTrue:[
 		    index := self addLiteral:(symbolicCodeArray at:symIndex).
 		    index > 255 ifTrue:[
-		      round ~~ 1 ifTrue:[
 			self parseError:'too many globals (' , 
 					(symbolicCodeArray at:symIndex) ,
 					' index=' , index printString ,
 					') in method - please simplify'.
 			^ #Error
-		      ].
-		      "
-		       there is a last chance, if we move
-		       all global-literals to the beginning of the
-		       literal array ...
-		      "
-		      'COMPILER: resorted literals (almost at limits)' infoPrintNL.
-		      self moveGlobalsToFront.
-		      needRetry := true.
-		      index := 0.
 		    ].
 		    symIndex := symIndex + 1.
 		    self appendByte:index.
@@ -815,47 +780,72 @@
 		    symIndex := symIndex + 1.
 		    self appendByte:level
 		].
-		(extra == #llit) ifTrue:[
-		    index := self addLiteral:(symbolicCodeArray at:symIndex).
-		    index > 16rFFFF ifTrue:[
-			self parseError:'too many (' , index printString , ') literals in method - please simplify'.
-			^ #Error
-		    ].
-		    symIndex := symIndex + 1.
-		    self appendWord:index
-		].
 	    ].
 
-	    ((codeSymbol == #send) 
-	     or:[codeSymbol == #superSend
-	     or:[codeSymbol == #hereSend]]) ifTrue:[
-	      index := self addLiteral:(symbolicCodeArray at:symIndex).
-	      symIndex := symIndex + 1.
-	      nargs := symbolicCodeArray at:symIndex.
-	      symIndex := symIndex + 1.
-	      self appendByte:nargs.
-	      self appendByte:index.
-	      (codeSymbol == #superSend) ifTrue:[
-		  symIndex := symIndex + 1.
-		  index := self addLiteral:(classToCompileFor superclass).
-		  self appendByte:index
-	      ].
-	      (codeSymbol == #hereSend) ifTrue:[
-		  symIndex := symIndex + 1.
-		  index := self addLiteral:classToCompileFor.
-		  self appendByte:index
-	      ].
-	      stackDelta := nargs negated
-	    ] ifFalse:[
-	      (codeSymbol == #sendDrop) ifTrue:[
-		  index := self addLiteral:(symbolicCodeArray at:symIndex).
-		  symIndex := symIndex + 1.
-		  nargs := symbolicCodeArray at:symIndex.
-		  symIndex := symIndex + 1.
-		  self appendByte:nargs.
-		  self appendByte:index.
-		  stackDelta := (nargs + 1) negated
-		]
+	    extra == #special ifTrue:[
+		((codeSymbol == #send) 
+		 or:[codeSymbol == #superSend
+		 or:[codeSymbol == #hereSend]]) ifTrue:[
+		    index := symbolicCodeArray at:symIndex.
+		    symIndex := symIndex + 1.
+		    nargs := symbolicCodeArray at:symIndex.
+		    symIndex := symIndex + 1.
+		    self appendByte:nargs.
+		    self appendByte:index.
+		    (codeSymbol == #superSend) ifTrue:[
+			symIndex := symIndex + 1.
+			index := self addLiteral:(classToCompileFor superclass).
+			self appendByte:index
+		    ].
+		    (codeSymbol == #hereSend) ifTrue:[
+			symIndex := symIndex + 1.
+			index := self addLiteral:classToCompileFor.
+			self appendByte:index
+		    ].
+		    stackDelta := nargs negated
+		] ifFalse:[
+		    (codeSymbol == #sendDrop) ifTrue:[
+			index := symbolicCodeArray at:symIndex.
+			symIndex := symIndex + 1.
+			nargs := symbolicCodeArray at:symIndex.
+			symIndex := symIndex + 1.
+			self appendByte:nargs.
+			self appendByte:index.
+			stackDelta := (nargs + 1) negated
+		    ] ifFalse:[
+			(codeSymbol == #sendDropL) ifTrue:[
+			    index := symbolicCodeArray at:symIndex.
+			    symIndex := symIndex + 2.
+			    nargs := symbolicCodeArray at:symIndex.
+			    symIndex := symIndex + 1.
+			    self appendByte:nargs.
+			    self appendWord:index.
+			    stackDelta := (nargs + 1) negated
+			] ifFalse:[
+			    ((codeSymbol == #sendL) 
+			     or:[codeSymbol == #superSendL
+			     or:[codeSymbol == #hereSendL]]) ifTrue:[
+				index := symbolicCodeArray at:symIndex.
+				symIndex := symIndex + 1.
+				nargs := symbolicCodeArray at:symIndex.
+				symIndex := symIndex + 1.
+				self appendByte:nargs.
+				self appendWord:index.
+				(codeSymbol == #superSendL) ifTrue:[
+				    symIndex := symIndex + 1.
+				    index := self addLiteral:(classToCompileFor superclass).
+				    self appendByte:index
+				].
+				(codeSymbol == #hereSendL) ifTrue:[
+				    symIndex := symIndex + 1.
+				    index := self addLiteral:classToCompileFor.
+				    self appendByte:index
+				].
+				stackDelta := nargs negated
+			    ]
+			]
+		    ]
+		].
 	    ].
 	    stackDepth := stackDepth + stackDelta.
 	    (stackDepth > maxStackDepth) ifTrue:[
@@ -1303,9 +1293,9 @@
 
     (aSymbol == #lineno) ifTrue:[lineno := true. ^ 8].
 
-    (aSymbol == #send) ifTrue:[lineno := true. ^ 19].
-    (aSymbol == #superSend) ifTrue:[lineno := true. ^ 20].
-    (aSymbol == #hereSend) ifTrue:[lineno := true. ^ 20].
+    (aSymbol == #send) ifTrue:[lineno := true. extra := #special. ^ 19].
+    (aSymbol == #superSend) ifTrue:[lineno := true. extra := #special. ^ 20].
+    (aSymbol == #hereSend) ifTrue:[lineno := true. extra := #special. ^ 20].
 
     (aSymbol == #drop) ifTrue:[stackDelta := -1. ^ 18].
     (aSymbol == #dup) ifTrue:[stackDelta := 1. ^ 47].
@@ -1336,25 +1326,25 @@
     (aSymbol == #push2) ifTrue:[stackDelta := 1. ^139].
     (aSymbol == #pushMinus1) ifTrue:[stackDelta := 1. ^122].
 
-    (aSymbol == #send0) ifTrue:[lineno := true. extra := #lit. ^21].
-    (aSymbol == #send1) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^22].
-    (aSymbol == #send2) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^23].
-    (aSymbol == #send3) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^24].
+    (aSymbol == #send0) ifTrue:[lineno := true. extra := #index. ^21].
+    (aSymbol == #send1) ifTrue:[lineno := true. extra := #index. stackDelta := -1. ^22].
+    (aSymbol == #send2) ifTrue:[lineno := true. extra := #index. stackDelta := -2. ^23].
+    (aSymbol == #send3) ifTrue:[lineno := true. extra := #index. stackDelta := -3. ^24].
 
-    (aSymbol == #sendSelf0) ifTrue:[lineno := true. extra := #lit. stackDelta := 1. ^180].
-    (aSymbol == #sendSelf1) ifTrue:[lineno := true. extra := #lit. ^181].
-    (aSymbol == #sendSelf2) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^182].
-    (aSymbol == #sendSelf3) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^183].
-    (aSymbol == #sendSelfDrop0) ifTrue:[lineno := true. extra := #lit. ^184].
-    (aSymbol == #sendSelfDrop1) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^185].
-    (aSymbol == #sendSelfDrop2) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^186].
-    (aSymbol == #sendSelfDrop3) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^187].
+    (aSymbol == #sendSelf0) ifTrue:[lineno := true. extra := #index. stackDelta := 1. ^180].
+    (aSymbol == #sendSelf1) ifTrue:[lineno := true. extra := #index. ^181].
+    (aSymbol == #sendSelf2) ifTrue:[lineno := true. extra := #index. stackDelta := -1. ^182].
+    (aSymbol == #sendSelf3) ifTrue:[lineno := true. extra := #index. stackDelta := -2. ^183].
+    (aSymbol == #sendSelfDrop0) ifTrue:[lineno := true. extra := #index. ^184].
+    (aSymbol == #sendSelfDrop1) ifTrue:[lineno := true. extra := #index. stackDelta := -1. ^185].
+    (aSymbol == #sendSelfDrop2) ifTrue:[lineno := true. extra := #index. stackDelta := -2. ^186].
+    (aSymbol == #sendSelfDrop3) ifTrue:[lineno := true. extra := #index. stackDelta := -3. ^187].
 
-    (aSymbol == #sendDrop) ifTrue:[lineno := true. ^25].
-    (aSymbol == #sendDrop0) ifTrue:[lineno := true. extra := #lit. stackDelta := -1. ^26].
-    (aSymbol == #sendDrop1) ifTrue:[lineno := true. extra := #lit. stackDelta := -2. ^27].
-    (aSymbol == #sendDrop2) ifTrue:[lineno := true. extra := #lit. stackDelta := -3. ^28].
-    (aSymbol == #sendDrop3) ifTrue:[lineno := true. extra := #lit. stackDelta := -4. ^29].
+    (aSymbol == #sendDrop) ifTrue:[lineno := true. extra := #special. ^25].
+    (aSymbol == #sendDrop0) ifTrue:[lineno := true. extra := #index. stackDelta := -1. ^26].
+    (aSymbol == #sendDrop1) ifTrue:[lineno := true. extra := #index. stackDelta := -2. ^27].
+    (aSymbol == #sendDrop2) ifTrue:[lineno := true. extra := #index. stackDelta := -3. ^28].
+    (aSymbol == #sendDrop3) ifTrue:[lineno := true. extra := #index. stackDelta := -4. ^29].
 
     (aSymbol == #pushMethodVar1) ifTrue:[stackDelta := 1. ^80].
     (aSymbol == #pushMethodVar2) ifTrue:[stackDelta := 1. ^81].
@@ -1473,6 +1463,8 @@
     (aSymbol == #mkNilBlock) ifTrue:[^ 157].
 
     (aSymbol == #gt0) ifTrue:[lineno := true. self addLiteral:#>. ^ 212].
+    (aSymbol == #basicNew) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 211].
+    (aSymbol == #new) ifTrue:[lineno := true. self addLiteral:aSymbol. ^ 213].
 
     (aSymbol == #falseJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 190].
     (aSymbol == #trueJumpabs) ifTrue:[stackDelta := -1. extra := #absoffset. ^ 191].
@@ -1486,12 +1478,16 @@
     (aSymbol == #notEqJumpabs) ifTrue:[stackDelta := -2. extra := #absoffset. ^ 199].
 
     (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144].
-    (aSymbol == #pushLLit) ifTrue:[stackDelta := 1. extra := #llit. ^ 201].
 
     (aSymbol == #isNil) ifTrue:[^ 188].
     (aSymbol == #notNil) ifTrue:[^ 189].
     (aSymbol == #not) ifTrue:[lineno := true. ^ 179].
 
+    (aSymbol == #sendL) ifTrue:[lineno := true. extra := #special. ^ 205].
+    (aSymbol == #sendDropL) ifTrue:[lineno := true. extra := #special. ^ 204].
+    (aSymbol == #superSendL) ifTrue:[lineno := true. extra := #special. ^ 206].
+    (aSymbol == #hereSendL) ifTrue:[lineno := true. extra := #special. ^ 206].
+
     self error:'invalid code symbol'.
     errorFlag := #Error
 ! !