--- a/MessageNode.st Wed Jul 02 16:46:26 1997 +0200
+++ b/MessageNode.st Wed Jul 02 17:35:44 1997 +0200
@@ -251,7 +251,10 @@
receiver := r.
selector := s asSymbol.
argArray := a.
- lineNr := l
+ lineNr := l.
+ self checkInlinability.
+
+ "Modified: 2.7.1997 / 17:01:24 / cg"
!
selector
@@ -260,6 +263,83 @@
!MessageNode methodsFor:'checks'!
+checkInlinability
+ "early check for possible inlinability"
+
+ |numArgs arg1 arg2 arg3|
+
+ (numArgs := argArray size) >= 1 ifTrue:[
+ arg1 := argArray at:1.
+ ].
+ numArgs == 0 ifTrue:[
+ (selector == #whileTrue
+ or:[selector == #whileFalse]) ifTrue:[
+ receiver isBlock ifTrue:[
+ receiver possiblyInlined:true
+ ].
+ ].
+ ].
+
+ numArgs == 1 ifTrue:[
+ (selector == #ifTrue:
+ or:[selector == #ifFalse:]) ifTrue:[
+ arg1 isBlock ifTrue:[
+ arg1 possiblyInlined:true
+ ].
+ ].
+
+ (selector == #whileTrue:
+ or:[selector == #whileFalse:]) ifTrue:[
+ arg1 isBlock ifTrue:[
+ arg1 possiblyInlined:true
+ ].
+ receiver isBlock ifTrue:[
+ receiver possiblyInlined:true
+ ].
+ ].
+ selector == #timesRepeat: ifTrue:[
+ arg1 isBlock ifTrue:[
+ arg1 possiblyInlined:true
+ ]
+ ].
+ ^ self
+ ].
+ numArgs >= 2 ifTrue:[
+ arg2 := argArray at:2.
+ ].
+ numArgs == 2 ifTrue:[
+ (selector == #ifTrue:ifFalse:
+ or:[selector == #ifFalse:ifTrue:]) ifTrue:[
+ (arg1 isBlock
+ and:[arg2 isBlock]) ifTrue:[
+ arg1 possiblyInlined:true.
+ arg2 possiblyInlined:true.
+ ].
+ ].
+ selector == #to:do: ifTrue:[
+ arg2 isBlock ifTrue:[
+ arg2 possiblyInlined:true.
+ ].
+ ].
+ ^ self
+ ].
+ numArgs >= 3 ifTrue:[
+ arg3 := argArray at:3.
+ ].
+ numArgs == 3 ifTrue:[
+ selector == #to:by:do: ifTrue:[
+ arg3 isBlock ifTrue:[
+ arg3 possiblyInlined:true.
+ ].
+ ].
+ ^ self
+ ].
+ ^ self
+
+ "Created: 2.7.1997 / 17:01:10 / cg"
+ "Modified: 2.7.1997 / 17:33:20 / cg"
+!
+
plausibilityCheck
|rec arg operand|
@@ -798,7 +878,9 @@
^ self
].
((selector == #whileTrue) or:[selector == #whileFalse]) ifTrue:[
- ^ self codeWhileOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+ receiver isInlinable ifTrue:[
+ ^ self codeWhileOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
+ ]
].
].
@@ -818,7 +900,7 @@
].
].
- (arg1 isBlock) ifTrue:[
+ (arg1 isBlock and:[arg1 isInlinable]) ifTrue:[
((selector == #ifTrue:) or:[selector == #ifFalse:]) ifTrue:[
receiver isBlock ifFalse:[
^ self codeIfOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
@@ -862,8 +944,8 @@
((selector == #ifTrue:ifFalse:) or:[selector == #ifFalse:ifTrue:]) ifTrue:[
receiver isBlock ifFalse:[
- arg1 isBlock ifTrue:[
- arg2 isBlock ifTrue:[
+ (arg1 isBlock and:[arg1 isInlinable]) ifTrue:[
+ (arg2 isBlock and:[arg2 isInlinable]) ifTrue:[
^ self codeIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler.
]
]
@@ -871,12 +953,7 @@
].
selector == #to:do: ifTrue:[
- okToInline := true.
-
- (arg2 isBlock and:[arg2 numArgs == 1]) ifFalse:[
- okToInline := false.
- ].
- okToInline ifTrue:[
+ (arg2 isBlock and:[arg2 isInlinable and:[arg2 numArgs == 1]]) ifTrue:[
^ self codeToDoOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
]
].
@@ -892,11 +969,11 @@
selector == #to:by:do: ifTrue:[
okToInline := true.
+ "/ step must be a constant (need to know how to compare)
(arg2 isConstant and:[arg2 type == #Integer]) ifFalse:[
- "/ step must be a constant (need to know how to compare)
okToInline := false.
].
- (arg3 isBlock and:[arg3 numArgs == 1]) ifFalse:[
+ (arg3 isBlock and:[arg3 isInlinable and:[arg3 numArgs == 1]]) ifTrue:[
okToInline := false.
].
okToInline ifTrue:[
@@ -1064,7 +1141,7 @@
].
"Modified: 3.9.1995 / 12:55:42 / claus"
- "Modified: 27.6.1997 / 15:08:45 / cg"
+ "Modified: 2.7.1997 / 10:46:22 / cg"
!
codeOrIfElseOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler
@@ -2122,5 +2199,5 @@
!MessageNode class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.76 1997-06-28 13:36:23 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.77 1997-07-02 15:34:38 cg Exp $'
! !