--- a/IRAccess.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRAccess.st Thu Mar 29 18:03:58 2012 +0000
@@ -29,13 +29,13 @@
!IRAccess class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRAccess.st,v 1.3 2009/10/08 11:57:08 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRAccess.st,v 1.3 2009/10/08 11:57:08 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRAccess.st,v 1.3 2009/10/08 11:57:08 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRBlockReturnTop.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRBlockReturnTop.st Thu Mar 29 18:03:58 2012 +0000
@@ -41,13 +41,13 @@
!IRBlockReturnTop class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBlockReturnTop.st,v 1.3 2009/10/08 11:58:58 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBlockReturnTop.st,v 1.3 2009/10/08 11:58:58 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBlockReturnTop.st,v 1.3 2009/10/08 11:58:58 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRBuilder.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRBuilder.st Thu Mar 29 18:03:58 2012 +0000
@@ -106,13 +106,6 @@
"Modified: / 30-03-2009 / 11:15:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
-tempNames
-
- ^ir tempNames
-
- "Modified: / 30-03-2009 / 11:15:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
-!
-
testJumpAheadTarget: label
jumpAheadStacks at: label ifPresent: [:stack |
@@ -127,20 +120,6 @@
self addTemps: {tempKey}
!
-addTempIfNotDefined: tempKey
-
- self addTempsIfNotDefined: (Array with: tempKey)
-
- "Created: / 23-03-2010 / 13:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-addTempsIfNotDefined: temps
-
- ir addTempsIfNotDefined: temps
-
- "Created: / 23-03-2010 / 13:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
initialize
^self initializeFor: IRMethod new.
@@ -478,13 +457,13 @@
!IRBuilder class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBuilder.st,v 1.3 2009/10/08 11:57:58 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBuilder.st,v 1.3 2009/10/08 11:57:58 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBuilder.st,v 1.3 2009/10/08 11:57:58 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRBuilderTest.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRBuilderTest.st Thu Mar 29 18:03:58 2012 +0000
@@ -186,11 +186,10 @@
!IRBuilderTest methodsFor:'testing'!
-error
+halt
"Redefinition for testing the #send:toSuperOf:"
"Created: / 11-06-2008 / 16:08:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Created: / 15-11-2011 / 22:27:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
isThisEverCalled
@@ -465,7 +464,7 @@
iRMethod := (IRBuilder new)
numRargs:1;
addTemps:#( #self );
- pushLiteralVariable:#ArithmeticError;
+ pushLiteralVariable:(ArithmeticValue bindingOf:#ArithmeticSignal);
returnTop;
ir.
aCompiledMethod := iRMethod compiledCode.
@@ -474,7 +473,6 @@
= ArithmeticValue arithmeticSignal).
"Modified: / 11-06-2008 / 11:31:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 15-11-2011 / 22:25:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testLiteralVariableGlobale
@@ -670,7 +668,7 @@
numRargs:1;
addTemps:#( #self );
pushReceiver;
- send:#error toSuperOf:IRBuilderTest;
+ send:#halt toSuperOf:IRBuilderTest;
returnTop;
ir.
aCompiledMethod := iRMethod compiledCode.
@@ -682,7 +680,6 @@
raise:Error.
"Modified: / 11-06-2008 / 16:09:12 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 15-11-2011 / 22:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testStorIntoVariable
@@ -692,7 +689,7 @@
numRargs:1;
addTemps:#( #self );
pushLiteral:4;
- storeIntoLiteralVariable:(#'IRBuilderTest:TestToPush');
+ storeIntoLiteralVariable:(IRBuilderTest bindingOf:#TestToPush);
returnTop;
ir.
aCompiledMethod := iRMethod compiledCode.
@@ -700,8 +697,6 @@
aCompiledMethod valueWithReceiver:nil arguments:#().
self assert:(IRBuilderTest testToPush = 4).
IRBuilderTest testToPush:nil.
-
- "Modified: / 15-11-2011 / 22:27:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testStoreTemp
@@ -1035,5 +1030,5 @@
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRBytecodeGenerator.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRBytecodeGenerator.st Thu Mar 29 18:03:58 2012 +0000
@@ -37,6 +37,17 @@
!IRBytecodeGenerator methodsFor:'accessing'!
+getCode
+
+ "
+ Private entry for IRBytecodeGenerator>>makeBlock:
+ "
+
+ ^code
+
+ "Created: / 30-03-2009 / 19:00:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
properties: aDictionary
properties := aDictionary.
@@ -213,6 +224,7 @@
at: index + 1
put: (closureCode at: index + 1) + pos + 4]].
+
code addAll: closureCode.
"Patch number of closure bytecodes"
@@ -220,7 +232,6 @@
"Created: / 30-03-2009 / 18:16:10 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified: / 12-05-2009 / 08:58:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 23-03-2010 / 22:34:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
popTop
@@ -715,38 +726,6 @@
"Modified: / 13-05-2009 / 10:42:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
-getCode
-
- | stream basicBlockStartOffset |
- [ orderSeq
- inject: false
- into: [:changed :seqId | (self updateJump: seqId) | changed]
- ] whileTrue.
-
- stream := (OrderedCollection new: 200) writeStream.
- basicBlockStartOffset := 0.
- orderSeq do: [:seqId |
- (instrMaps at: seqId) do: [:assoc |
- assoc key "instr" bytecodeIndex: stream position + assoc value.
- ].
- "Patch makeBlock offsets"
- (seqCode at: seqId) withIndexDo:
- [:instr :index|
- instr == #makeBlock ifTrue:
- [(seqCode at: seqId)
- at: index + 1
- put: ((seqCode at: seqId) at: index + 1) + basicBlockStartOffset]].
-
- stream nextPutAll: (seqCode at: seqId).
- basicBlockStartOffset := basicBlockStartOffset + (seqCode at: seqId) size.
- ].
- ^stream contents
-
- "Created: / 11-06-2008 / 14:00:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 13-05-2009 / 11:15:41 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 24-03-2010 / 08:42:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
literals
^literals asArray
@@ -829,13 +808,13 @@
!IRBytecodeGenerator class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBytecodeGenerator.st,v 1.3 2009/10/08 12:04:39 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBytecodeGenerator.st,v 1.3 2009/10/08 12:04:39 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRBytecodeGenerator.st,v 1.3 2009/10/08 12:04:39 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRClosure.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRClosure.st Thu Mar 29 18:03:58 2012 +0000
@@ -10,6 +10,10 @@
!IRClosure methodsFor:'accessing'!
+environmentIr
+ ^ environmentIr
+!
+
environmentIr:something
environmentIr := something.
! !
@@ -55,13 +59,13 @@
!IRClosure class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRClosure.st,v 1.3 2009/10/08 12:00:40 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRClosure.st,v 1.3 2009/10/08 12:00:40 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRClosure.st,v 1.3 2009/10/08 12:00:40 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRConstant.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRConstant.st Thu Mar 29 18:03:58 2012 +0000
@@ -61,13 +61,13 @@
!IRConstant class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRConstant.st,v 1.3 2009/10/08 12:03:32 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRConstant.st,v 1.3 2009/10/08 12:03:32 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRConstant.st,v 1.3 2009/10/08 12:03:32 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IRDecompiler.st Thu Mar 29 18:03:58 2012 +0000
@@ -0,0 +1,1305 @@
+"{ Package: 'cvut:stx/goodies/newcompiler' }"
+
+IRInterpreter subclass:#IRDecompiler
+ instanceVariableNames:'stack sp scope currentInstr valueLabelMap mapEmptyStatement'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'NewCompiler-IR'
+!
+
+IRDecompiler comment:'I interpret IRMethod instructions and generate a Smalltalk abstract syntax tree rooted at a RBMethodNode.
+This is implemented like a shift-reduce parser. Each instruction either causes a node to be pushed on the stack (shift), or causes one or more nodes to be popped and combined into a single node which is push back on the stack (reduce). Most reduction is done at the "label: labelNum" instruction where it tries to reduce jump structures into control messages like #ifTrue:, whileFalse:, etc.
+Several pseudo nodes (RBPseudoNode and subclasses) are used to represent basic instructions that have not been reduced to real AST nodes yet.
+'
+!
+
+
+!IRDecompiler class methodsFor:'as yet unclassified'!
+
+dummySelector: numArgs
+ "Answer a dummy selector with number of args"
+
+ | sel |
+ sel _ 'unknown'.
+ 1 to: numArgs do: [:i |
+ sel _ sel, 'with:'].
+ ^ sel asSymbol
+! !
+
+!IRDecompiler methodsFor:'accessing'!
+
+scope
+
+ ^scope
+! !
+
+!IRDecompiler methodsFor:'init'!
+
+addTempToScope: ir
+
+ "Temp may be created only if they are not used in the method"
+ 0 to: ir numRargs - 1 do: [:i | (scope
+ rawVarAt: i
+ ifNone: [
+ scope capturedVars do: [:each |
+ each index = i ifTrue:[
+ scope tempVarAt: scope capturedVars size + scope tempVars size.
+ ^self]].
+ scope tempVarAt: i]) markArg]
+!
+
+decompileIR: ir
+ | sequenceNode temps args goto seq value method |
+ scope isBlockScope
+ ifTrue:[(scope addTemp: 'parent env') markArg]
+ ifFalse:[(scope addTemp: 'self') markArg].
+ ir tempKeys do: [:temp | scope tempVarAt: temp].
+ 0 to: ir numRargs - 1 do: [:i | (scope tempVarAt: i) markArg].
+ self interpret: ir.
+
+ self addTempToScope: ir.
+ self label: #return.
+ self Label: #return.
+ (self endCase: #lastReturn) ifFalse:[self Label: #return.].
+ goto := self Goto.
+ value := self ValueOrNone.
+ seq := self Sequence.
+ self removeClosureCreation: seq.
+ sp = 1 ifFalse: [stack explore. self error: 'error'].
+ value ifNotNil: [seq addNode: value].
+ sequenceNode := (self newBlock: seq return: goto) body.
+ temps := scope compactIndexTemps asArray.
+ ir tempKeys: temps.
+ args := (temps first: ir numRargs) allButFirst.
+ args := args collect: [:var | self newVar: var].
+ temps := temps allButFirst: ir numRargs.
+ sequenceNode temporaries: (temps collect: [:var | self newVar: var]),
+ ((scope capturedVars select:[:var | var name ~= 'self' and: [var sourceTemp == nil]])
+ collect:[:var | self newVar: var]).
+ method := (RBMethodNode new)
+ selectorParts: (self
+ newSelectorParts: (self class dummySelector: args size));
+ arguments: args;
+ body: sequenceNode;
+ primitiveNode: ir primitiveNode;
+ scope: scope.
+ sequenceNode parent: method.
+ Preferences compileBlocksAsClosures
+ ifFalse: [ASTFixDecompileBlockScope new visitNode: method].
+ ^ method
+!
+
+removeClosureCreation: seq
+ (Preferences compileBlocksAsClosures
+ and: [seq statements size > 0]
+ and: [seq statements first isClosureEnvironmentCreation]) ifTrue: [
+ seq statements removeFirst.
+ (seq statements size > 0
+ and: [seq statements first isClosureEnvironmentRegistration])
+ ifTrue: [seq statements removeFirst]].
+
+ [Preferences compileBlocksAsClosures
+ and: [seq statements size > 0]
+ and: [seq statements first isClosureRegistrationAndCreation
+ or: [seq statements first isSelfClosureRegistration]
+ or: [seq statements first isTempClosureRegistration]]]
+ whileTrue: [seq statements removeFirst]
+!
+
+scope: aLexicalScope
+
+ scope := aLexicalScope
+! !
+
+!IRDecompiler methodsFor:'instructions'!
+
+goto: seqNum
+
+ self stackPush: (RBPseudoGotoNode new destination: seqNum).
+!
+
+if: bool goto: seqNum1 otherwise: seqNum2
+
+ self stackPush: (RBPseudoIfNode new
+ boolean: bool;
+ destination: seqNum1;
+ otherwise: seqNum2)
+!
+
+label: seqNum
+
+ stack isEmpty ifTrue: [ "start"
+ ^ stack addLast: (RBPseudoLabelNode new destination: seqNum)].
+
+ self captureEmptyStatement.
+ "Reduce jump structures to one of the following if possible"
+ [ (self endBlock: seqNum) or: [
+ (self endAndOr: seqNum) or: [
+ (self endAndOr2: seqNum) or: [
+ (self endIfThen: seqNum) or: [
+ (self endIfThen2: seqNum) or:[
+ (self endIfThenElse: seqNum) or: [
+ (self endCase: seqNum) or: [
+ (self endToDo: seqNum) or: [
+ (self endWhile: seqNum) or: [
+ (self endWhile2: seqNum) or: [
+ (self endIfNil: seqNum)]]]]]]]]]]
+ ] whileTrue.
+
+ stack addLast: (RBPseudoLabelNode new destination: seqNum).
+!
+
+popTop
+
+ | value |
+ stack last ifNil: [^ stack removeLast]. "pop no-op from #simplifyTempAssign:"
+ [stack last isLabel
+ and: [(stack atLast:2) isGoto]
+ and: [stack last destination = (stack atLast: 2) destination]]
+ whileTrue: [
+ stack removeLast.
+ stack removeLast].
+ stack last isValue ifTrue: [
+ (stack atLast: 2) isSequence ifTrue: [
+ value := stack removeLast.
+ ^ stack last addNode: value.
+ ] ifFalse: [(stack atLast: 2) isPseudo ifTrue: [
+ value := stack removeLast.
+ ^ stack addLast: (RBSequenceNode statements: {value}).
+ ]].
+ ].
+ stack addLast: RBPseudoPopNode new
+!
+
+pushBlock: irMethod
+
+ self block: irMethod env: nil
+!
+
+pushBlockMethod: irMethod
+
+ "block will recognized when send: #createBlock:"
+ self pushLiteral: irMethod
+!
+
+pushDup
+
+ stack addLast: RBPseudoDupNode new
+!
+
+pushInstVar: index
+
+ self stackPush: (self newVar: (scope instanceScope instVar: index))
+!
+
+pushLiteral: object
+
+ self stackPush: (self newLiteral: object).
+!
+
+pushLiteralVariable: object
+
+ | var |
+ var := scope lookupVar: object key asString.
+ self stackPush: (self newVar: var)
+!
+
+pushTemp: tempIndex
+
+ | var |
+ var := scope basicTempVarAt: tempIndex.
+ var isTemp ifTrue: [var cantBeCapture].
+ self stackPush: (self newVar: var).
+!
+
+remoteReturn
+
+ stack removeLast. "pop home context free var"
+ self goto: #return.
+!
+
+returnTop
+
+ self goto: #return.
+!
+
+send: selector numArgs: numArgs
+
+ | args rcvr |
+ selector = #caseError ifTrue:[^self stackPush: (RBPseudoSendNode new selector: selector)].
+ args := OrderedCollection new.
+ [ selector numArgs timesRepeat: [args addFirst: self Value].
+ rcvr := self Value.
+ ] on: Abort do: [
+ [self stackPush: (RBPseudoSendNode new selector: selector).
+ ^self cascade] on: Abort do:[^false]
+ ].
+
+ Preferences compileBlocksAsClosures
+ ifTrue: [ (rcvr isLiteral and: [selector = #createBlock:]) ifTrue: [
+ ^ self block: rcvr value env: args first]]
+ ifFalse: [ (selector = #blockCopy:) ifTrue: [
+ ^ self stackPush: (RBPseudoSendNode new selector: selector; arguments: args)]].
+
+ self stackPush: (self simplify: (RBMessageNode new
+ receiver: rcvr
+ selectorParts: (self newSelectorParts: selector)
+ arguments: args)).
+
+ "Created: / 01-12-2008 / 19:40:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+send: selector numArgs: numArgs toSuperOf: behavior
+
+ | args rcvr |
+ args := OrderedCollection new.
+ selector numArgs timesRepeat: [args addFirst: self Value].
+ rcvr := self Value.
+ (rcvr isVariable and: [rcvr name = 'self']) ifFalse: [self patternError].
+
+ rcvr identifierToken: (SqueakToken value: 'super' start: 0).
+ self stackPush: (RBMessageNode new
+ receiver: rcvr
+ selectorParts: (self newSelectorParts: selector)
+ arguments: args).
+
+ "Created: / 01-12-2008 / 19:45:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+!
+
+storeIntoLiteralVariable: association
+
+ | var |
+ var := scope lookupVar: association key asString.
+ self stackPush: (self simplifyTempAssign:
+ (RBAssignmentNode variable: (self newVar: (var markWrite)) value: self Value))
+!
+
+storeTemp: tempIndex
+
+ | var |
+ var := scope basicTempVarAt: tempIndex.
+ var isCaptured ifFalse: [var cantBeCapture].
+ var isTemp ifTrue:[
+ var isArg: false].
+ self stackPush: (self simplifyTempAssign:
+ (RBAssignmentNode variable: (self newVar: (var markWrite)) value: self Value)).
+! !
+
+!IRDecompiler methodsFor:'interpret'!
+
+interpretInstruction: irInstruction
+
+ currentInstr := irInstruction.
+ super interpretInstruction: irInstruction.
+!
+
+interpretSequence: instructionSequence
+
+ super interpretSequence: instructionSequence.
+ "currentInstr := nil."
+! !
+
+!IRDecompiler methodsFor:'old blocks'!
+
+blockReturnTop
+
+ self goto: #return.
+!
+
+endBlock: seqNum
+
+ | blockSeq block goto startBlock |
+ [
+ goto := self GotoOrReturn: seqNum.
+ (goto isRet
+ or:[goto mapInstr notNil
+ and: [goto mapInstr isBlockReturnTop]]) ifFalse: [self abort].
+ sp = 0 ifTrue: [self abort].
+ blockSeq := self Sequence2.
+ startBlock := self Label.
+ block := self Block.
+ (goto isRet not
+ and:[goto mapInstr notNil]
+ and: [goto mapInstr isBlockReturnTop]
+ and: [block successor ~= seqNum]) ifTrue:[
+ self stackPush: block.
+ self stackPush: startBlock.
+ self stackPush: blockSeq.
+ self stackPush: goto.
+ self abort].
+ self Send.
+ ] on: Abort do: [^ false].
+
+ self stackPush: (self newBlock: blockSeq return: goto).
+ stack last arguments: block arguments.
+ "No extra scope is need if we don't use any temporaries and arguments.
+ so we remove them"
+ (stack last arguments isEmpty and: [stack last body temporaries isEmpty])
+ ifTrue:[ASTReplaceVariableScope replace: stack last scope: scope outerScope ].
+ scope := scope outerScope.
+ currentInstr := nil.
+ self goto: block successor.
+ ^ true
+!
+
+jumpOverBlock: seqNum1 to: seqNum2
+ | numArgs args oldscope pseudoBlock |
+
+ oldscope := scope.
+ self scope: (scope newBlockScope).
+ oldscope tempVarAt: 0.
+ (scope addObjectTemp: (oldscope tempVarAt: 0)).
+ numArgs := stack last arguments first value.
+ self stackPush: (pseudoBlock := RBPseudoBlockNode new).
+
+ args := OrderedCollection new.
+ numArgs timesRepeat: [ | var instr |
+ instr := currentInstr blockSequence removeFirst.
+ var := oldscope tempVarAt: instr number.
+ args add: (self newVar: var).
+ var isUnused ifTrue: [oldscope removeTempFromOldBlock: var].
+ scope addObjectTemp: var.
+ currentInstr blockSequence first isPop
+ ifFalse: [
+ currentInstr blockSequence sequence addFirst: (IRInstruction pushTemp: var index)]
+ ifTrue:[currentInstr blockSequence removeFirst].
+
+ ].
+ args := args reverse.
+ pseudoBlock
+ block: seqNum1;
+ successor: seqNum2;
+ arguments: args
+
+!
+
+storeInstVar: number
+
+ | var |
+ var := scope instanceScope instVar: number.
+ self stackPush: (RBAssignmentNode variable: (self newVar: var) value: self Value)
+! !
+
+!IRDecompiler methodsFor:'priv instructions'!
+
+addReturn: statements from: goto
+
+ | ret |
+ statements last isReturn ifTrue:[^self].
+ ret := RBReturnNode value: statements last.
+ Preferences compileBlocksAsClosures ifTrue:[
+ scope isHome ifFalse: [ret homeBinding: scope outerEnvScope thisEnvVar]].
+ goto mapInstr sourceNode: ret.
+ statements atLast: 1 put: ret.
+!
+
+block: method env: envRefNode
+
+ self stackPush: (IRDecompiler new
+ scope: (scope newBlockScope "capturedVars: vars");
+ decompileIR: method ir)
+ asBlock
+!
+
+cascade
+
+ | messages selector args rcvr |
+ messages := OrderedCollection new.
+ "last message"
+ selector _ self Send selector.
+ args := OrderedCollection new.
+ selector numArgs timesRepeat: [args addFirst: self Value].
+ messages addFirst: selector -> args.
+
+ "rest of messages"
+ [(rcvr := self ValueOrNone) isNil] whileTrue: [
+ self Pop.
+ selector := self Send selector.
+ args := OrderedCollection new.
+ selector numArgs timesRepeat: [args addFirst: self Value].
+ self Dup.
+ messages addFirst: selector -> args.
+ ].
+
+ messages := messages collect: [:assoc |
+ RBMessageNode
+ receiver: rcvr
+ selector: assoc key
+ arguments: assoc value].
+ self stackPush: (RBCascadeNode messages: messages).
+!
+
+endAndOr2: seqNum
+
+ | goto seq p if2 test else o if1 seqValue elseTest otherwise |
+ [
+ goto _ self Goto.
+ seqValue _ self ValueOrNone.
+ seq _ self Sequence.
+ p _ self Label destination.
+ if2 _ self IfGoto: seqNum otherwise: p.
+ elseTest _ self Value.
+ else _ self SequenceBackTo: goto destination.
+ o _ self Label destination.
+ o = goto destination ifTrue: [self abort].
+ if1 _ self IfGoto: seqNum otherwise: o.
+ test _ self Value.
+ ] on: Abort do: [^ false].
+
+ if1 boolean = if2 boolean
+ ifFalse: [
+ otherwise := RBSequenceNode statements: #().
+ otherwise addNode: (self newLiteral: if2 boolean).
+ self stackPush: (RBMessageNode
+ receiver: test
+ selector: (if2 boolean ifTrue: [#ifTrue:ifFalse:] ifFalse: [#ifFalse:ifTrue:])
+ arguments: {self newBlock: (else addNode: elseTest).
+ self newBlock: otherwise}).]
+ ifTrue:[self stackPush: (RBMessageNode
+ receiver: test
+ selector: (if2 boolean ifTrue: [#or:] ifFalse: [#and:])
+ arguments: {self newBlock: (else addNode: elseTest)})].
+ stack addLast: if2.
+ self label: p.
+ stack addLast: seq.
+ seqValue ifNotNil: [stack addLast: seqValue].
+ stack addLast: goto.
+ ^ true
+!
+
+endAndOr: seqNum
+
+ | o test branches if body block sel1 sel2 if2 |
+ branches := OrderedCollection new.
+ [
+ (if2 := self If) otherwise = seqNum ifFalse: [self abort].
+ [ test := self Value.
+ body := self Sequence.
+ branches add: {body. test}.
+ o := self Label destination.
+ (if := self If) otherwise = o ifFalse: [self abort].
+ if destination = seqNum
+ ] whileFalse: [
+ if boolean = if2 boolean ifFalse: [self abort].
+ if destination = if2 destination ifFalse: [self abort].
+ ].
+ if boolean = if2 boolean ifTrue: [self abort].
+ test := self Value.
+ ] on: Abort do: [^ false].
+
+ if boolean
+ ifTrue: [sel1 := #or:. sel2 := #and:]
+ ifFalse: [sel1 := #and:. sel2 := #or:].
+ block := self newBlock: (branches first first addNode: branches first second).
+ branches allButFirstDo: [:pair |
+ block := self newBlock: (pair first addNode: (RBMessageNode
+ receiver: pair second
+ selector: sel2
+ arguments: {block})).
+ ].
+ self stackPush: (RBMessageNode
+ receiver: test
+ selector: sel1
+ arguments: {block}).
+ stack addLast: if2.
+ ^ true
+!
+
+endCase: seqNum
+
+ | otherwiseGoto goto node otherwiseValue otherwiseSeq n branchValue branchSeq f caseValue caseSeq rcvr branches message seqEnd afterOterwise seq afterOterwiseValue |
+ branches := OrderedCollection new.
+ [ "otherwise"
+ otherwiseGoto := self Goto.
+ node := self stackDown.
+ node isSequence ifTrue: [(node statements size = 1
+ and:[node statements first isSend]
+ and: [
+ node := node statements first.
+ node selector == #caseError]) ifFalse: [
+ otherwiseSeq := node] ].
+ (node isPop or: [node isSend and: [node selector == #caseError]]) ifTrue: [
+ node isPop ifTrue: [node := self Send].
+ node selector == #caseError ifFalse: [self abort].
+ ] ifFalse: [
+ sp := sp + 1. "stackUp"
+
+ seqNum == #lastReturn
+ ifFalse: [
+ otherwiseValue := self ValueOrNone.
+ otherwiseSeq := self Sequence]
+ ifTrue: [
+ afterOterwiseValue := self ValueOrNone.
+ otherwiseSeq := RBSequenceNode statements: #().
+ afterOterwise := self SequenceOtherwise].
+ ].
+ n := self Label destination.
+ "last case branch"
+ seqNum == #lastReturn
+ ifFalse: [goto := self GotoOrReturn: seqNum]
+ ifTrue: [
+ seqEnd := n.
+ goto := self GotoOrReturn: n.
+ otherwiseGoto := goto].
+ branchValue := self ValueOrNone.
+ branchSeq := self Sequence.
+ (stack at: sp) isPop ifTrue: [self stackDown].
+ f := self Label destination.
+
+ "last case"
+ self IfGoto: n otherwise: f.
+ self Send selector == #= ifFalse: [self abort].
+ caseValue := self Value.
+ caseSeq := self Sequence.
+ otherwiseSeq ifNil: [self Dup].
+ branches addFirst: ({caseSeq. caseValue} -> {branchSeq. branchValue. goto}).
+
+ [(rcvr := self ValueOrNone) isNil] whileTrue: [
+ "case branch"
+ n := self Label destination.
+ seqNum == #lastReturn
+ ifFalse: [goto := self GotoOrReturn: seqNum]
+ ifTrue: [goto := self GotoOrReturn: seqEnd].
+ branchValue := self ValueOrNone.
+ branchSeq := self Sequence.
+ self Pop.
+ f := self Label destination.
+ "case"
+ self IfGoto: n otherwise: f.
+ self Send selector == #= ifFalse: [self abort].
+ caseValue := self Value.
+ caseSeq := self Sequence.
+ self Dup.
+ branches addFirst: ({caseSeq. caseValue} -> {branchSeq. branchValue. goto}).
+ ].
+ ] on: Abort do: [^ false].
+
+ branches := branches collect: [:assoc |
+ assoc key second
+ ifNotNil: [assoc key first addNode: assoc key second].
+ assoc value second
+ ifNotNil: [assoc value first addNode: assoc value second].
+ RBMessageNode
+ receiver: (self newBlock: assoc key first return: nil)
+ selector: #->
+ arguments:
+ {self newBlock: assoc value first return: assoc value third}
+ ].
+ message := otherwiseSeq
+ ifNil: [
+ RBMessageNode
+ receiver: rcvr
+ selector: #caseOf:
+ arguments: {RBArrayNode statements: branches}]
+ ifNotNil: [
+ otherwiseValue
+ ifNotNil: [otherwiseSeq addNode: otherwiseValue].
+ RBMessageNode
+ receiver: rcvr
+ selector: #caseOf:otherwise:
+ arguments:
+ {RBArrayNode statements: branches.
+ self newBlock: otherwiseSeq return: otherwiseGoto}.
+ ].
+ self stackPush: message.
+ seqNum == #lastReturn ifTrue: [
+ self popTop.
+ seq := self Sequence.
+ afterOterwise ifNotNil:[seq statements addAllLast: afterOterwise statements].
+ self stackPush: seq.
+ afterOterwiseValue ifNotNil:[self stackPush: afterOterwiseValue].
+ branchValue := 1].
+ branchValue ifNil: [self popTop].
+ self stackPush: otherwiseGoto.
+ ^ true
+!
+
+endIfNil: seqNum
+
+ | goto branch o if rcvr value |
+ [
+ goto := self Goto.
+ value := self Value.
+ branch := self Sequence.
+ self Pop.
+ o := self Label destination.
+ if := self IfGoto: seqNum otherwise: o.
+ self Send selector == #== ifFalse: [self abort].
+ (self Value isLiteral: [:v | v isNil]) ifFalse: [self abort].
+ self Dup.
+ rcvr := self Value.
+ ] on: Abort do: [^ false].
+
+ branch addNode: value.
+ self stackPush: (RBMessageNode
+ receiver: rcvr
+ selector: (if boolean ifTrue: [#ifNotNil:] ifFalse: [#ifNil:])
+ arguments: {self newBlock: branch return: goto}).
+ self goto: seqNum.
+ ^ true
+!
+
+endIfThen2: seqNum
+
+ | goto branch o if test value gotoNum branch2 |
+ [
+ goto := self Goto.
+ (goto mapInstr ~= nil
+ and: [goto mapInstr isJump]
+ and: [goto mapInstr destination size = 1]
+ and: [goto mapInstr destination last isJump])
+ ifTrue: [gotoNum := goto
+ mapInstr destination last destination orderNumber]
+ ifFalse:[self abort].
+ (currentInstr ~= nil
+ and: [currentInstr isJump]
+ and: [currentInstr destination orderNumber = goto destination])
+ ifFalse: [self abort].
+ value := self Value.
+ branch := self Sequence.
+ o := self Label destination.
+ seqNum = gotoNum
+ ifFalse:[if := self IfGoto: gotoNum otherwise: o]
+ ifTrue:[self abort].
+ test := self Value.
+ ] on: Abort do: [^ false].
+
+ value ifNotNil: [branch addNode: value].
+ branch2 := RBSequenceNode statements: #().
+ branch2 addNode: (self newLiteral: if boolean).
+ self stackPush: (self simplify: (RBMessageNode
+ receiver: test
+ selector: (if boolean ifTrue: [#ifFalse:ifTrue:] ifFalse: [#ifTrue:ifFalse:])
+ arguments: {self newBlock: branch return: goto.
+ self newBlock: branch2})).
+ self goto: goto destination.
+ ^true
+!
+
+endIfThen3: seqNum
+
+ | goto branch o if test value |
+ [
+ goto := self Goto.
+ (goto destination == seqNum or: [self isExplicitReturn: goto])
+ ifFalse: [self abort].
+ goto isRet ifTrue: [value := self Value].
+ branch := self Sequence.
+ o := self Label destination.
+ if := self If.
+ ((if destination = seqNum
+ or: [if destination = (mapEmptyStatement at: seqNum ifAbsent:[seqNum])])
+ and: [if otherwise = o])
+ ifFalse:[self abort].
+ test := self Value.
+ ] on: Abort do: [^ false].
+
+
+ value ifNotNil: [branch addNode: value].
+ self stackPush: (self simplify: (RBMessageNode
+ receiver: test
+ selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
+ arguments: {self newBlock: branch return: goto})).
+ self popTop.
+ self goto: seqNum.
+ ^ true
+!
+
+endIfThen: seqNum
+
+ | goto branch o if test value |
+ [
+ goto := self Goto.
+ (goto destination == seqNum or: [self isExplicitReturn: goto])
+ ifFalse: [self abort].
+ goto isRet ifTrue: [value := self Value].
+ branch := self Sequence.
+ o := self Label destination.
+ if := self IfGoto: seqNum otherwise: o.
+ test := self Value.
+ ] on: Abort do: [^ false].
+
+
+ value ifNotNil: [branch addNode: value].
+ self stackPush: (self simplify: (RBMessageNode
+ receiver: test
+ selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
+ arguments: {self newBlock: branch return: goto})).
+ self popTop.
+ self goto: seqNum.
+ ^ true
+!
+
+endIfThenElse: seqNum
+
+ | goto2 else d goto1 then o if test value2 value1 |
+ [
+ goto2 := self Goto.
+ value2 := self ValueOrNone.
+ else := self Sequence.
+ d := self Label destination.
+ goto1 := self Goto.
+ ((self isExplicitReturn: goto2) or: [goto2 destination == goto1 destination]) ifFalse: [self abort].
+ value1 := self ValueOrNone.
+ then := self Sequence.
+ o := self Label destination.
+ if := self IfGoto: d otherwise: o.
+ test := self Value.
+ ] on: Abort do: [^ false].
+
+ value2 ifNotNil: [else addNode: value2].
+ value1 ifNotNil: [then addNode: value1].
+ (self isExplicitReturn: goto1) ifTrue:[self addReturn: then statements from: goto1].
+ (self isExplicitReturn: goto2) ifTrue:[self addReturn: else statements from: goto2].
+ self stackPush: (self simplify: (else isEmpty
+ ifTrue: [RBMessageNode
+ receiver: test
+ selector: (if boolean ifTrue: [#ifFalse:] ifFalse: [#ifTrue:])
+ arguments: {self newBlock: then return: goto1}]
+ ifFalse: [RBMessageNode
+ receiver: test
+ selector: (if boolean
+ ifTrue: [#ifFalse:ifTrue:]
+ ifFalse: [#ifTrue:ifFalse:])
+ arguments: {
+ self newBlock: then return: goto1.
+ self newBlock: else return: goto2}])).
+ value1 ifNil: [self popTop].
+ currentInstr := goto1 mapInstr.
+ self stackPush: goto1.
+ (else statements isEmpty and:
+ [stack anySatisfy: [:n | n isIf and: [n destination = d]]]
+ ) ifTrue: [
+ self label: d.
+ currentInstr := goto2 mapInstr.
+ self stackPush: goto2.
+ ].
+ ^ true
+!
+
+endToDo: seqNum
+
+ | start limit incr iter step loopBlock o if test limitExpr init |
+ [
+ start := self Goto destination.
+ limit := self Value.
+ incr := self Assignment.
+ iter := incr variable.
+ (incr value isMessage and:
+ [incr value selector == #+ and:
+ [incr value receiver isVariable and:
+ [incr value receiver binding == iter binding]]]
+ ) ifFalse: [self abort].
+ step := incr value arguments first.
+ loopBlock := self Sequence.
+ o := self Label destination.
+ if := self IfGoto: seqNum otherwise: o.
+ test := self Value.
+ (test isMessage and:
+ [(test selector == #<= or: [test selector == #>=]) and:
+ [(valueLabelMap at: test arguments first ifAbsent: [self abort]) destination = start]]
+ ) ifFalse: [self abort].
+ limitExpr := test arguments first.
+ limitExpr isAssignment ifTrue: [
+ (limitExpr variable binding index == limit binding index
+ and:[limitExpr variable binding scope == limit binding scope]) ifFalse: [self abort].
+ limitExpr := limitExpr value.
+ ].
+ init := test receiver.
+ (init isAssignment and: [init variable binding == iter binding])
+ ifFalse: [self abort].
+ ] on: Abort do: [^ false].
+ limit isVariable
+ ifTrue:[scope
+ removeTemp: limit binding
+ ifAbsent:[Preferences compileBlocksAsClosures
+ ifFalse:[scope removeTempFromOldBlock: limit]]].
+ loopBlock := self newBlock: loopBlock.
+ loopBlock arguments: {iter}.
+ self stackPush: ((step isLiteral: [:c | c = 1])
+ ifTrue: [RBMessageNode
+ receiver: init value
+ selector: #to:do:
+ arguments: {limitExpr. loopBlock}]
+ ifFalse: [RBMessageNode
+ receiver: init value
+ selector: #to:by:do:
+ arguments: {limitExpr. step. loopBlock}]).
+ self popTop.
+ self goto: seqNum.
+ ^ true
+!
+
+endWhile2: seqNum
+
+ | start loopBlock if test sequence o goto previousStack |
+ [
+ stack := (previousStack := stack) copy.
+ start := (goto := self Goto) destination.
+ self stackPush: goto.
+ [self endIfThen3: start] whileTrue.
+ start := self Goto destination.
+ loopBlock _ self Sequence.
+ o _ self Label destination.
+ if _ self IfGoto: seqNum otherwise: o.
+ test _ self Value.
+ sequence _ self SequenceBackTo: start.
+ self Label: start.
+ sp _ sp + 1. "stackUp"
+ ] on: Abort do: [stack := previousStack. ^ false].
+ loopBlock isEmpty
+ ifTrue:[self stackPush: (self simplify: (RBMessageNode
+ receiver: (self newBlock: (sequence addNode: test))
+ selector: (if boolean ifTrue: [#whileFalse] ifFalse: [#whileTrue])
+ arguments: #()))]
+ ifFalse:[self stackPush: (self simplify: (RBMessageNode
+ receiver: (self newBlock: (sequence addNode: test))
+ selector: (if boolean ifTrue: [#whileFalse:] ifFalse: [#whileTrue:])
+ arguments: {self newBlock: loopBlock}))].
+ self popTop.
+ self goto: seqNum.
+ ^ true
+!
+
+endWhile: seqNum
+
+ | start loopBlock if test sequence o |
+ [
+ start _ self Goto destination.
+ loopBlock _ self Sequence.
+ o _ self Label destination.
+ if _ self IfGoto: seqNum otherwise: o.
+ test _ self Value.
+ sequence _ self SequenceBackTo: start.
+ self Label: start.
+ sp _ sp + 1. "stackUp"
+ ] on: Abort do: [^ false].
+ loopBlock isEmpty
+ ifTrue:[self stackPush: (self simplify: (RBMessageNode
+ receiver: (self newBlock: (sequence addNode: test))
+ selector: (if boolean ifTrue: [#whileFalse] ifFalse: [#whileTrue])
+ arguments: #()))]
+ ifFalse:[self stackPush: (self simplify: (RBMessageNode
+ receiver: (self newBlock: (sequence addNode: test))
+ selector: (if boolean ifTrue: [#whileFalse:] ifFalse: [#whileTrue:])
+ arguments: {self newBlock: loopBlock}))].
+ self popTop.
+ self goto: seqNum.
+ ^ true
+! !
+
+!IRDecompiler methodsFor:'private'!
+
+captureEmptyStatement
+ | by replace node |
+
+ [by := self Goto destination.
+ replace := self Label destination.
+ replace = 0 ifTrue: [self abort]]
+ on: Abort
+ do: [^ false].
+ mapEmptyStatement at: by put: replace.
+ sp := nil.
+ ^ true
+!
+
+fixInnerFreeVar: aRcvrTemp
+
+ | scopeInnerFreeVar |
+ scopeInnerFreeVar := scope outerScope.
+ [aRcvrTemp scope = scopeInnerFreeVar] whileFalse:[
+ scopeInnerFreeVar hasInnerFreeVars: true.
+ scopeInnerFreeVar := scopeInnerFreeVar outerScope].
+ aRcvrTemp scope hasInnerFreeVars: true
+!
+
+initialize
+
+ stack := OrderedCollection new.
+ scope := nil parseScope newMethodScope. "in case never set"
+ valueLabelMap := IdentityDictionary new.
+ mapEmptyStatement := IdentityDictionary new
+!
+
+isExplicitReturn: goto
+
+ Preferences compileBlocksAsClosures
+ ifTrue:[^ goto isRet
+ and: [goto mapInstr notNil]
+ and: [goto mapInstr isRemote or: [scope isBlockScope not]]]
+ ifFalse: [^goto isRet and: [goto mapInstr isBlockReturnTop not]]
+!
+
+mapNode: node
+
+ currentInstr ifNil: [^ self].
+ node isPseudo
+ ifTrue: [node mapInstr: currentInstr]
+ ifFalse: [currentInstr sourceNode: node]
+!
+
+newBlock: sequence
+
+ ^ self newBlock: sequence return: nil
+!
+
+newBlock: sequence return: goto
+
+ | statements block |
+ statements := sequence statements.
+ (goto notNil and: [self isExplicitReturn: goto]) ifTrue: [
+ self addReturn: statements from: goto
+ ].
+ sequence statements: statements.
+ block := RBBlockNode body: sequence.
+ sequence parent: block.
+ Preferences compileBlocksAsClosures ifFalse: [block scope: scope].
+ ^block
+!
+
+newLiteral: literal
+
+ ^ RBLiteralNode value: literal
+!
+
+newSelectorParts: selector
+
+ ^ selector keywords collect: [:word |
+ RBLiteralToken value: word]
+!
+
+newVar: semVar
+
+ ^ RBVariableNode new
+ identifierToken: (RBIdentifierToken value: semVar name start: 0);
+ binding: semVar
+!
+
+simplify: mess
+ "mess is a messageNode. If it is a message created by the compiler convert it back to its normal form"
+
+ | rcvr var |
+" (mess selector == #value and: [mess receiver isLiteral]) ifTrue: [
+ ^ self newVar: (GlobalVar new assoc: mess receiver value; scope: scope)
+ ]."
+
+ (mess selector = #privSetInHolder: and: [mess arguments first isLiteral]) ifTrue: [
+ ^ RBAssignmentNode
+ variable: (self newVar: (GlobalVar new assoc: mess arguments first value; scope: scope) markWrite)
+ value: mess receiver
+ ].
+
+ (mess selector = #privGetInstVar: and:
+ [mess arguments first isLiteral and:
+ [mess receiver isVariable]]) ifTrue: [
+ rcvr := mess receiver binding.
+ rcvr == scope receiverVar ifTrue: [
+ ^ self newVar: (scope receiverVarAt: mess arguments first value)].
+ (rcvr isContextVar and: [mess arguments first value == 5]) ifTrue: [
+ var := scope tempVarAt: -1.
+ ^self newVar: var].
+ (rcvr isCaptured and:[rcvr sourceTemp = rcvr scope receiverVar])
+ ifTrue:[
+ self fixInnerFreeVar: rcvr.
+ ^self newVar: (rcvr scope receiverVarAt: mess arguments first value)].
+ rcvr isEnv ifTrue: [^self newVar: (rcvr scope captureVarAt: mess arguments first value)]].
+
+ (mess selector = #privStoreIn:instVar: and:
+ [mess arguments last isLiteral and:
+ [mess arguments first isVariable]]) ifTrue: [
+ rcvr := mess arguments first binding.
+ (mess receiver name = 'self' and: [rcvr isEnv])
+ ifTrue:[scope captureSelf: mess arguments last value.
+ ^mess].
+ rcvr == scope receiverVar ifTrue: [^ RBAssignmentNode
+ variable: (self newVar: (scope receiverVarForAssignmentAt: mess arguments last value) markWrite)
+ value: mess receiver].
+ (rcvr isCaptured and:[rcvr sourceTemp = rcvr scope receiverVar])
+ ifTrue:[
+ self fixInnerFreeVar: rcvr.
+ ^RBAssignmentNode
+ variable: (self newVar: (rcvr scope receiverVarForAssignmentAt: mess arguments last value) markWrite)
+ value: mess receiver].
+ mess isClosureEnvironmentRegistration
+ ifTrue: [
+ scope captureSelf: mess arguments last value.
+ ^mess].
+ rcvr isEnv ifTrue:[
+ mess receiver isTemp
+ ifTrue:[var := (scope
+ captureVarAt: mess arguments last value
+ sourceTemp: mess receiver binding) markWrite.]
+ ifFalse:[var := (scope
+ captureVarAt: mess arguments last value sourceTemp: ((TempVar new)
+ name: (scope captureVarName: mess arguments last value);
+ index: mess arguments last value;
+ scope: self;
+ cantBeCapture)) markWrite
+ ].
+ ^ RBAssignmentNode
+ variable: (self newVar: var)
+ value: mess receiver]].
+ ^mess
+!
+
+simplifyTempAssign: assignment
+ "If it is a assignment created by the compiler convert it back to its normal form"
+
+ | mess |
+ ((mess := assignment value) isMessage and:
+ [mess selector = #wrapInTempHolder and:
+ [mess receiver isLiteral: [:v | v isNil]]]
+ ) ifTrue: [
+ ^ nil "no-op"
+ ].
+
+ ^ assignment
+! !
+
+!IRDecompiler methodsFor:'stack'!
+
+Assignment
+
+ | node |
+ (node := self stackDown) isAssignment ifTrue: [^ node].
+ self abort
+!
+
+Block
+
+ | node |
+ (node := self stackDown) isBlock ifTrue: [^ node].
+ self abort
+!
+
+Dup
+
+ | node |
+ (node := self stackDown) isDup ifTrue: [^ node].
+ self abort
+!
+
+Goto
+
+ | node |
+ (node := self stackDown) isGoto ifTrue: [^ node].
+ self abort
+!
+
+Goto: seqNum
+
+ | goto |
+ (goto := self Goto) destination = seqNum ifTrue: [^ goto].
+ self abort
+!
+
+GotoOrReturn: seqNum
+
+ | goto |
+ goto := self Goto.
+ (goto destination = seqNum or: [goto isRet]) ifTrue: [^ goto].
+ self abort
+!
+
+If
+
+ | node |
+ (node := self stackDown) isIf ifTrue: [^ node].
+ self abort
+!
+
+IfGoto: seqNum otherwise: seqNum2
+
+ | if |
+ ((if := self If) destination = seqNum and: [if otherwise = seqNum2])
+ ifTrue: [^ if].
+ self abort
+!
+
+Label
+
+ | node |
+ (node := self stackDown) isLabel ifTrue: [^ node].
+ self abort
+!
+
+Label: seqNum
+
+ | label |
+ (label := self Label) destination = seqNum ifTrue: [^ label].
+ self abort
+!
+
+Pop
+
+ | node |
+ (node := self stackDown) isPop ifTrue: [^ node].
+ self abort
+!
+
+Send
+
+ | node |
+ (node := self stackDown) isPseudoSend ifTrue: [^ node].
+ self abort
+!
+
+Sequence
+ | node seq i goto |
+ seq := RBSequenceNode statements: #().
+ i := self spIndex.
+ [node := stack at: i.
+ node isSequence
+ ifTrue:
+ [seq addNodesFirst: node statements.
+ node := stack at: (i := i - 1)].
+ (node isLabel and: [i > 1])
+ ifFalse:
+ [sp := i.
+ ^ seq].
+ goto := stack at: (i := i - 1).
+ goto isGoto and: [goto destination = node destination]]
+ whileTrue: [i := i - 1].
+ sp := i + 1.
+ ^ seq
+!
+
+Sequence2
+ | node seq i block temps label |
+ seq := RBSequenceNode statements: #().
+ i := self spIndex.
+ node := stack at: i.
+ [(node isLabel and: [(stack at: i - 1) isGoto] and:[node destination = (stack at: i - 1) destination])
+ ifTrue:[
+ i := i - 2.
+ node := stack at: i].
+ (node isLabel not and: [i > 1])] whileTrue:
+ [
+ node isSequence
+ ifTrue: [seq addNodesFirst: node statements]
+ ifFalse: [seq addNodeFirst: node].
+ i := i - 1.
+ node := stack at: i].
+ sp := i.
+ label := self Label.
+ block := self Block.
+ self stackPush: block.
+ self stackPush: label.
+ "Add the temporaries find"
+ temps := scope tempVars asArray allButFirst.
+ temps := temps select: [:each | ((block arguments
+ collect: [:var | var binding]) includes: each) not].
+ seq temporaries: (temps collect: [:var | self newVar: var]).
+ ^ seq
+!
+
+SequenceBackTo: labelNum
+ | node seq i goto |
+ seq := RBSequenceNode statements: #().
+ i := self spIndex.
+ [node := stack at: i.
+ node isSequence
+ ifTrue:
+ [seq addNodesFirst: node statements.
+ node := stack at: (i := i - 1)].
+ (node isLabel and: [i > 1])
+ ifFalse:
+ [sp := i.
+ ^ seq].
+ node destination = labelNum
+ ifTrue:
+ [sp := i.
+ ^ seq].
+ goto := stack at: (i := i - 1).
+ goto isGoto and: [goto destination = node destination]]
+ whileTrue: [i := i - 1].
+ sp := i + 1.
+ ^ seq
+!
+
+SequenceOtherwise
+ | node seq i |
+ seq := RBSequenceNode statements: #().
+ i := self spIndex.
+ node := stack at: i.
+ node isSequence ifTrue: [
+ seq addNodesFirst: node statements.
+ self stackDown]
+ ifFalse:[node isLabel ifFalse:[self abort]].
+ ^ seq
+!
+
+Value
+
+ | node |
+ node := self ValueOrNone.
+ node ifNil: [self abort].
+ ^ node
+!
+
+ValueOrNone
+ | node i label |
+ i := self spIndex.
+ [node := stack at: i.
+ node isValue
+ ifTrue:
+ [label ifNotNil: [valueLabelMap at: node put: label].
+ sp := i - 1.
+ ^ node].
+ (node isLabel and: [i > 1]) ifFalse: [^ nil].
+ label := node.
+ node := stack at: (i := i - 1).
+ node isGoto and: [node destination = label destination]]
+ whileTrue: [i := i - 1].
+ ^ nil
+!
+
+abort
+
+ | spWas |
+ spWas := sp.
+ sp := nil.
+ Abort signal
+!
+
+fixStack
+
+ sp ifNotNil: [stack removeLast: (stack size - sp)].
+ sp := nil.
+!
+
+spIndex
+ ^ sp ifNil: [sp := stack size]
+!
+
+stackDown
+
+ | node |
+ sp ifNil: [sp _ stack size].
+ sp = 0 ifTrue: [self abort].
+ node _ stack at: sp.
+ sp _ sp - 1.
+ ^ node
+!
+
+stackPush: node
+
+ self fixStack.
+ stack addLast: node.
+ node ifNil: [^ self]. "no op"
+ self mapNode: node.
+! !
+
+!IRDecompiler class methodsFor:'documentation'!
+
+version
+ ^ '$Id$'
+!
+
+version_CVS
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRDecompiler.st,v 1.3 2009/10/08 12:04:20 fm Exp §'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
--- a/IRDup.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRDup.st Thu Mar 29 18:03:58 2012 +0000
@@ -21,13 +21,13 @@
!IRDup class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRDup.st,v 1.3 2009/10/08 11:57:50 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRDup.st,v 1.3 2009/10/08 11:57:50 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRDup.st,v 1.3 2009/10/08 11:57:50 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRFunction.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRFunction.st Thu Mar 29 18:03:58 2012 +0000
@@ -50,23 +50,6 @@
"Modified: / 12-08-2009 / 09:22:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
!
-addTempsIfNotDefined: temps
-
- | ir tempsToAdd |
- ir := self.
- tempsToAdd := temps asSet.
- [ ir isNil ] whileFalse:
- [ir tempNames do:
- [:temp|
- (tempsToAdd includes:temp)
- ifTrue:[tempsToAdd remove: temp]].
- ir := ir environmentIr].
- tempsToAdd isEmpty ifTrue:[^self].
- self addTemps: tempsToAdd
-
- "Created: / 23-03-2010 / 13:51:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
additionalLiterals
^additionalLiterals.
!
@@ -110,10 +93,6 @@
^self allInstructionsMatching: [:bc | bc isTempStore].
!
-environmentIr
- ^ environmentIr
-!
-
ir
^self.
!
@@ -195,12 +174,11 @@
inspector2TabIRCode
^Tools::Inspector2Tab new
- label: 'IR Code';
- priority: 75;
- text: self longPrintString.
+ label: 'IR Code';
+ priority: 75;
+ view: ((ScrollableView for:TextView) contents: self longPrintString; yourself)
"Created: / 11-06-2008 / 01:05:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 15-02-2010 / 13:04:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!IRFunction methodsFor:'decompiling'!
@@ -500,13 +478,13 @@
!IRFunction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRFunction.st,v 1.4 2009/10/08 11:59:08 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRFunction.st,v 1.4 2009/10/08 11:59:08 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRFunction.st,v 1.4 2009/10/08 11:59:08 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRInstVarAccess.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRInstVarAccess.st Thu Mar 29 18:03:58 2012 +0000
@@ -30,13 +30,13 @@
!IRInstVarAccess class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarAccess.st,v 1.3 2009/10/08 12:01:34 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarAccess.st,v 1.3 2009/10/08 12:01:34 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarAccess.st,v 1.3 2009/10/08 12:01:34 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRInstVarRead.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRInstVarRead.st Thu Mar 29 18:03:58 2012 +0000
@@ -30,13 +30,13 @@
!IRInstVarRead class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarRead.st,v 1.3 2009/10/08 11:56:08 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarRead.st,v 1.3 2009/10/08 11:56:08 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarRead.st,v 1.3 2009/10/08 11:56:08 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRInstVarStore.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRInstVarStore.st Thu Mar 29 18:03:58 2012 +0000
@@ -33,13 +33,13 @@
!IRInstVarStore class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarStore.st,v 1.3 2009/10/08 11:59:32 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarStore.st,v 1.3 2009/10/08 11:59:32 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstVarStore.st,v 1.3 2009/10/08 11:59:32 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRInstruction.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRInstruction.st Thu Mar 29 18:03:58 2012 +0000
@@ -409,13 +409,13 @@
!IRInstruction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstruction.st,v 1.3 2009/10/08 11:55:09 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstruction.st,v 1.3 2009/10/08 11:55:09 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInstruction.st,v 1.3 2009/10/08 11:55:09 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRInterpreter.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRInterpreter.st Thu Mar 29 18:03:58 2012 +0000
@@ -111,13 +111,13 @@
!IRInterpreter class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInterpreter.st,v 1.3 2009/10/08 11:58:54 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInterpreter.st,v 1.3 2009/10/08 11:58:54 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRInterpreter.st,v 1.3 2009/10/08 11:58:54 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRJump.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRJump.st Thu Mar 29 18:03:58 2012 +0000
@@ -52,13 +52,13 @@
!IRJump class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJump.st,v 1.3 2009/10/08 12:01:23 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJump.st,v 1.3 2009/10/08 12:01:23 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJump.st,v 1.3 2009/10/08 12:01:23 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRJumpIf.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRJumpIf.st Thu Mar 29 18:03:58 2012 +0000
@@ -61,13 +61,13 @@
!IRJumpIf class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpIf.st,v 1.3 2009/10/08 12:05:24 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpIf.st,v 1.3 2009/10/08 12:05:24 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpIf.st,v 1.3 2009/10/08 12:05:24 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRJumpOverBlock.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRJumpOverBlock.st Thu Mar 29 18:03:58 2012 +0000
@@ -40,13 +40,13 @@
!IRJumpOverBlock class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpOverBlock.st,v 1.3 2009/10/08 11:56:16 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpOverBlock.st,v 1.3 2009/10/08 11:56:16 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRJumpOverBlock.st,v 1.3 2009/10/08 11:56:16 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRLine.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRLine.st Thu Mar 29 18:03:58 2012 +0000
@@ -34,13 +34,13 @@
!IRLine class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLine.st,v 1.3 2009/10/08 12:03:44 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLine.st,v 1.3 2009/10/08 12:03:44 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLine.st,v 1.3 2009/10/08 12:03:44 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRLiteralVariableAccess.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRLiteralVariableAccess.st Thu Mar 29 18:03:58 2012 +0000
@@ -33,13 +33,13 @@
!IRLiteralVariableAccess class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableAccess.st,v 1.3 2009/10/08 11:59:04 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableAccess.st,v 1.3 2009/10/08 11:59:04 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableAccess.st,v 1.3 2009/10/08 11:59:04 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRLiteralVariableRead.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRLiteralVariableRead.st Thu Mar 29 18:03:58 2012 +0000
@@ -27,13 +27,13 @@
!IRLiteralVariableRead class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableRead.st,v 1.3 2009/10/08 12:03:40 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableRead.st,v 1.3 2009/10/08 12:03:40 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableRead.st,v 1.3 2009/10/08 12:03:40 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRLiteralVariableStore.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRLiteralVariableStore.st Thu Mar 29 18:03:58 2012 +0000
@@ -27,13 +27,13 @@
!IRLiteralVariableStore class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableStore.st,v 1.3 2009/10/08 11:56:40 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableStore.st,v 1.3 2009/10/08 11:56:40 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRLiteralVariableStore.st,v 1.3 2009/10/08 11:56:40 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRMethod.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRMethod.st Thu Mar 29 18:03:58 2012 +0000
@@ -52,13 +52,13 @@
!IRMethod class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRMethod.st,v 1.3 2009/10/08 11:56:48 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRMethod.st,v 1.3 2009/10/08 11:56:48 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRMethod.st,v 1.3 2009/10/08 11:56:48 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRPop.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRPop.st Thu Mar 29 18:03:58 2012 +0000
@@ -27,13 +27,13 @@
!IRPop class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPop.st,v 1.3 2009/10/08 11:57:32 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPop.st,v 1.3 2009/10/08 11:57:32 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPop.st,v 1.3 2009/10/08 11:57:32 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRPrinter.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRPrinter.st Thu Mar 29 18:03:58 2012 +0000
@@ -210,13 +210,13 @@
!IRPrinter class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPrinter.st,v 1.3 2009/10/08 12:00:24 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPrinter.st,v 1.3 2009/10/08 12:00:24 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRPrinter.st,v 1.3 2009/10/08 12:00:24 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRReturn.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRReturn.st Thu Mar 29 18:03:58 2012 +0000
@@ -42,13 +42,13 @@
!IRReturn class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRReturn.st,v 1.3 2009/10/08 12:01:32 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRReturn.st,v 1.3 2009/10/08 12:01:32 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRReturn.st,v 1.3 2009/10/08 12:01:32 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRSend.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRSend.st Thu Mar 29 18:03:58 2012 +0000
@@ -78,13 +78,13 @@
!IRSend class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSend.st,v 1.3 2009/10/08 12:03:48 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSend.st,v 1.3 2009/10/08 12:03:48 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSend.st,v 1.3 2009/10/08 12:03:48 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRSequence.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRSequence.st Thu Mar 29 18:03:58 2012 +0000
@@ -407,13 +407,13 @@
!IRSequence class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSequence.st,v 1.3 2009/10/08 11:59:45 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSequence.st,v 1.3 2009/10/08 11:59:45 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRSequence.st,v 1.3 2009/10/08 11:59:45 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRStackCount.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRStackCount.st Thu Mar 29 18:03:58 2012 +0000
@@ -121,13 +121,13 @@
!IRStackCount class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRStackCount.st,v 1.3 2009/10/08 11:59:57 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRStackCount.st,v 1.3 2009/10/08 11:59:57 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRStackCount.st,v 1.3 2009/10/08 11:59:57 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRTempAccess.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRTempAccess.st Thu Mar 29 18:03:58 2012 +0000
@@ -59,13 +59,13 @@
!IRTempAccess class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempAccess.st,v 1.3 2009/10/08 12:03:42 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempAccess.st,v 1.3 2009/10/08 12:03:42 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempAccess.st,v 1.3 2009/10/08 12:03:42 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRTempRead.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRTempRead.st Thu Mar 29 18:03:58 2012 +0000
@@ -29,13 +29,13 @@
!IRTempRead class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempRead.st,v 1.3 2009/10/08 12:00:10 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempRead.st,v 1.3 2009/10/08 12:00:10 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempRead.st,v 1.3 2009/10/08 12:00:10 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRTempStore.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRTempStore.st Thu Mar 29 18:03:58 2012 +0000
@@ -29,13 +29,13 @@
!IRTempStore class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempStore.st,v 1.3 2009/10/08 12:04:11 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempStore.st,v 1.3 2009/10/08 12:04:11 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTempStore.st,v 1.3 2009/10/08 12:04:11 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRTransformTest.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRTransformTest.st Thu Mar 29 18:03:58 2012 +0000
@@ -60,13 +60,12 @@
(iRMethod allSequences last) last delete.
(iRMethod allSequences last)
- addInstructions: (Array with:(IRInstruction pushLiteral: 2) with: (IRInstruction returnTop)).
+ addInstructions: {(IRInstruction pushLiteral: 2). (IRInstruction returnTop)}.
aCompiledMethod := iRMethod compiledCode.
self should: [(aCompiledMethod valueWithReceiver: nil arguments: #() ) = 2].
"Modified: / 30-03-2009 / 19:40:10 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 07-05-2011 / 14:17:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testAddIntructionsBefore
@@ -83,13 +82,12 @@
push := (iRMethod allSequences last) at: (iRMethod allSequences size - 1) .
(iRMethod allSequences last)
- addInstructions: (Array with:(IRInstruction pushLiteral: 2) with: (IRInstruction returnTop)) before: push.
+ addInstructions: {(IRInstruction pushLiteral: 2). (IRInstruction returnTop)} before: push.
aCompiledMethod := iRMethod compiledCode.
self should: [(aCompiledMethod valueWithReceiver: nil arguments: #() ) = 2].
"Modified: / 30-03-2009 / 19:40:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 07-05-2011 / 14:18:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testAddIntructionsBeforeFromLList
@@ -165,13 +163,13 @@
!IRTransformTest class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTransformTest.st,v 1.3 2009/10/08 11:56:52 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTransformTest.st,v 1.3 2009/10/08 11:56:52 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTransformTest.st,v 1.3 2009/10/08 11:56:52 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/IRTranslator.st Tue Nov 15 21:28:05 2011 +0000
+++ b/IRTranslator.st Thu Mar 29 18:03:58 2012 +0000
@@ -167,11 +167,10 @@
kind == #BArg ifTrue:[^gen pushBlockArg: index].
kind == #BVar ifTrue:[^gen pushBlockVar: index].
- self error:'Should never be reached'.
+ self halt:'Should never be reached'.
"Created: / 30-03-2009 / 14:06:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
"Modified: / 30-03-2009 / 19:02:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
- "Modified: / 09-04-2010 / 15:05:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
remoteReturn
@@ -372,13 +371,13 @@
!IRTranslator class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTranslator.st,v 1.3 2009/10/08 12:04:47 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTranslator.st,v 1.3 2009/10/08 12:04:47 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/IRTranslator.st,v 1.3 2009/10/08 12:04:47 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/Make.proto Tue Nov 15 21:28:05 2011 +0000
+++ b/Make.proto Thu Mar 29 18:03:58 2012 +0000
@@ -1,7 +1,7 @@
# $Header$
#
# DO NOT EDIT
-# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler.
+# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler at 2012-03-29 19:04:24.824.
#
# Warning: once you modify this file, do not rerun
# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
@@ -34,7 +34,7 @@
# add the path(es) here:,
# ********** OPTIONAL: MODIFY the next lines ***
# LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libcompat -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libtool
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/goodies/libtool3 -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libcompat -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libtool
# if you need any additional defines for embedded C code,
@@ -44,7 +44,7 @@
LOCALDEFINES=
LIBNAME=libcvut_stx_goodies_newcompiler
-STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -H. -varPrefix=$(LIBNAME)
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=. -varPrefix=$(LIBNAME)
# ********** OPTIONAL: MODIFY the next line ***
@@ -63,17 +63,31 @@
all:: preMake classLibRule postMake
-pre_objs:: update-svn-revision
+pre_objs::
+
-update-svn-revision:
- if [ ! -r .svnversion -o "$(shell svnversion -n)" != "$(shell cat .svnversion)" ]; then \
- svnversion -n > .svnversion; \
- sed -i -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"'$(shell svnversion -n)'\"\$$\"/g" \
- cvut_stx_goodies_newcompiler.st; \
+# Update SVN revision in stx_libbasic3.st
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+ if [ -d .svn ]; then \
+ rev=$(shell svnversion -n); \
+ echo -n $$rev > .svnversion; \
+ else \
+ echo -n exported > .svnversion; \
fi
-.PHONY: update-svn-revision
+
+cvut_stx_goodies_newcompiler.o: cvut_stx_goodies_newcompiler.st .svnversion
+ if [ -d .svn ]; then \
+ rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+ sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .cvut_stx_goodies_newcompiler.svn.st; \
+ fi
+ $(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.cvut_stx_goodies_newcompiler.svn $(O_RULE);
+ mv .cvut_stx_goodies_newcompiler.svn.$(O) cvut_stx_goodies_newcompiler.$(O)
+endif
+
+
# add more install actions here
@@ -90,20 +104,22 @@
prereq: $(REQUIRED_SUPPORT_DIRS)
cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/goodies/libtool3 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/goodies/refactoryBrowser/parser && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libcomp && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
- cd $(TOP)/libbasic3 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/libdb && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libboss && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
- cd $(TOP)/goodies/xml/vw && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/libdb/libodbc && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/libdb/libsqlite && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libui && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
- cd $(TOP)/goodies/xml/stx && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/libbasic3 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libwidg && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd $(TOP)/libhtml && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libwidg2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
- cd $(TOP)/libwidg3 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libtool && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/libcompat && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
cd $(TOP)/librun && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
@@ -111,6 +127,7 @@
cleanjunk::
+ -rm -f *.s *.s2
clean::
-rm -f *.o *.H
@@ -131,6 +148,7 @@
$(OUTDIR)IRAccess.$(O) IRAccess.$(H): IRAccess.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInstruction.$(H) $(INCLUDE_TOP)/stx/libbasic/Link.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
$(OUTDIR)IRClosure.$(O) IRClosure.$(H): IRClosure.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
$(OUTDIR)IRConstant.$(O) IRConstant.$(H): IRConstant.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInstruction.$(H) $(INCLUDE_TOP)/stx/libbasic/Link.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)IRDecompiler.$(O) IRDecompiler.$(H): IRDecompiler.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInterpreter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
$(OUTDIR)IRDup.$(O) IRDup.$(H): IRDup.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInstruction.$(H) $(INCLUDE_TOP)/stx/libbasic/Link.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
$(OUTDIR)IRJump.$(O) IRJump.$(H): IRJump.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInstruction.$(H) $(INCLUDE_TOP)/stx/libbasic/Link.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
$(OUTDIR)IRLine.$(O) IRLine.$(H): IRLine.st $(INCLUDE_TOP)/cvut/stx/goodies/newcompiler/IRInstruction.$(H) $(INCLUDE_TOP)/stx/libbasic/Link.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec Tue Nov 15 21:28:05 2011 +0000
+++ b/Make.spec Thu Mar 29 18:03:58 2012 +0000
@@ -1,7 +1,7 @@
# $Header$
#
-# DO NOT EDIT
-# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler.
+# DO NOT EDIT
+# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler at 2012-03-29 19:04:23.686.
#
# Warning: once you modify this file, do not rerun
# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
@@ -18,7 +18,7 @@
# Argument(s) to the stc compiler (stc --usage).
-# -H. : create header files locally
+# -headerDir=. : create header files locally
# (if removed, they will be created as common
# -Pxxx : defines the package
# -Zxxx : a prefix for variables within the classLib
@@ -61,6 +61,7 @@
IRAccess \
IRClosure \
IRConstant \
+ IRDecompiler \
IRDup \
IRJump \
IRLine \
@@ -98,6 +99,7 @@
$(OUTDIR)IRAccess.$(O) \
$(OUTDIR)IRClosure.$(O) \
$(OUTDIR)IRConstant.$(O) \
+ $(OUTDIR)IRDecompiler.$(O) \
$(OUTDIR)IRDup.$(O) \
$(OUTDIR)IRJump.$(O) \
$(OUTDIR)IRLine.$(O) \
--- a/Makefile Tue Nov 15 21:28:05 2011 +0000
+++ b/Makefile Thu Mar 29 18:03:58 2012 +0000
@@ -1,7 +1,7 @@
#
-# DO NOT EDIT
+# DO NOT EDIT
#
-# make uses this file (Makefile) only, if there is no
+# make uses this file (Makefile) only, if there is no
# file named "makefile" (lower-case m) in the same directory.
# My only task is to generate the real makefile and call make again.
# Thereafter, I am no longer used and needed.
@@ -16,4 +16,4 @@
include Make.proto
makefile:
- $(TOP)/rules/stmkmf
+ $(TOP)/rules/stmkmf
--- a/abbrev.stc Tue Nov 15 21:28:05 2011 +0000
+++ b/abbrev.stc Thu Mar 29 18:03:58 2012 +0000
@@ -1,16 +1,20 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
IRBuilder IRBuilder cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
-IRBuilderTest IRBuilderTest cvut:stx/goodies/newcompiler 'NewCompiler-IR-Tests' 4
+IRBuilderTest IRBuilderTest cvut:stx/goodies/newcompiler 'NewCompiler-IR-Tests' 1
IRBytecodeGenerator IRBytecodeGenerator cvut:stx/goodies/newcompiler 'NewCompiler-Bytecode' 0
IRFunction IRFunction cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRInstruction IRInstruction cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRInterpreter IRInterpreter cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRSequence IRSequence cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRStackCount IRStackCount cvut:stx/goodies/newcompiler 'NewCompiler-Bytecode' 0
-IRTransformTest IRTransformTest cvut:stx/goodies/newcompiler 'NewCompiler-IR-Tests' 4
-cvut_stx_goodies_newcompiler cvut_stx_goodies_newcompiler cvut:stx/goodies/newcompiler '* Projects & Packages *' 4
+IRTransformTest IRTransformTest cvut:stx/goodies/newcompiler 'NewCompiler-IR-Tests' 1
+cvut_stx_goodies_newcompiler cvut_stx_goodies_newcompiler cvut:stx/goodies/newcompiler '* Projects & Packages *' 3
IRAccess IRAccess cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRClosure IRClosure cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRConstant IRConstant cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
+IRDecompiler IRDecompiler cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRDup IRDup cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRJump IRJump cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
IRLine IRLine cvut:stx/goodies/newcompiler 'NewCompiler-IR' 0
--- a/bc.mak Tue Nov 15 21:28:05 2011 +0000
+++ b/bc.mak Thu Mar 29 18:03:58 2012 +0000
@@ -1,18 +1,24 @@
# $Header$
#
# DO NOT EDIT
-# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler.
+# automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler at 2012-03-29 19:04:25.464.
#
# Warning: once you modify this file, do not rerun
# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
#
-# This file contains make rules for the win32 platform (using borland-bcc).
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
# It shares common definitions with the unix-make in Make.spec.
-# The nt.mak supports the following targets:
+# The bc.mak supports the following targets:
# bmake - compile all st-files to a classLib (dll)
# bmake clean - clean all temp files
# bmake clobber - clean all
#
+# Historic Note:
+# this used to contain only rules to make with borland
+# (called via bmake, by "make.exe -f bc.mak")
+# this has changed; it is now also possible to build using microsoft visual c
+# (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
#
TOP=..\..\..\..\stx
INCLUDE_TOP=$(TOP)\..
@@ -28,10 +34,10 @@
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libcompat -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libtool
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\goodies\libtool3 -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libcompat -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libtool
LOCALDEFINES=
-STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -H. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
LOCALLIBS=
OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
@@ -45,20 +51,22 @@
# build all prerequisite packages for this package
prereq:
pushd ..\..\..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\goodies\libtool3 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\goodies\refactoryBrowser\parser & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libcomp & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
- pushd ..\..\..\..\stx\libbasic3 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\libdb & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libboss & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
- pushd ..\..\..\..\stx\goodies\xml\vw & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\libdb\libodbc & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\libdb\libsqlite & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libui & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
- pushd ..\..\..\..\stx\goodies\xml\stx & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\libbasic3 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libwidg & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\..\..\..\stx\libhtml & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libwidg2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
- pushd ..\..\..\..\stx\libwidg3 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libtool & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\libcompat & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
pushd ..\..\..\..\stx\librun & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
@@ -66,6 +74,7 @@
+
# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
$(OUTDIR)IRBuilder.$(O) IRBuilder.$(H): IRBuilder.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRBytecodeGenerator.$(O) IRBytecodeGenerator.$(H): IRBytecodeGenerator.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -78,6 +87,7 @@
$(OUTDIR)IRAccess.$(O) IRAccess.$(H): IRAccess.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInstruction.$(H) $(INCLUDE_TOP)\stx\libbasic\Link.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRClosure.$(O) IRClosure.$(H): IRClosure.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRConstant.$(O) IRConstant.$(H): IRConstant.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInstruction.$(H) $(INCLUDE_TOP)\stx\libbasic\Link.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)IRDecompiler.$(O) IRDecompiler.$(H): IRDecompiler.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInterpreter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRDup.$(O) IRDup.$(H): IRDup.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInstruction.$(H) $(INCLUDE_TOP)\stx\libbasic\Link.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRJump.$(O) IRJump.$(H): IRJump.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInstruction.$(H) $(INCLUDE_TOP)\stx\libbasic\Link.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
$(OUTDIR)IRLine.$(O) IRLine.$(H): IRLine.st $(INCLUDE_TOP)\cvut\stx\goodies\newcompiler\IRInstruction.$(H) $(INCLUDE_TOP)\stx\libbasic\Link.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/bmake.bat Tue Nov 15 21:28:05 2011 +0000
+++ b/bmake.bat Thu Mar 29 18:03:58 2012 +0000
@@ -3,6 +3,6 @@
@REM type bmake, and wait...
@REM do not edit - automatically generated from ProjectDefinition
@REM -------
-make.exe -N -f bc.mak %1 %2
+make.exe -N -f bc.mak %*
--- a/cvut_stx_goodies_newcompiler.st Tue Nov 15 21:28:05 2011 +0000
+++ b/cvut_stx_goodies_newcompiler.st Thu Mar 29 18:03:58 2012 +0000
@@ -11,48 +11,37 @@
!cvut_stx_goodies_newcompiler class methodsFor:'description'!
preRequisites
- "list all required packages.
- This list can be maintained manually or (better) generated and
- updated by scanning the superclass hierarchies and looking for
- global variable accesses. (the browser has a menu function for that)
- Howevery, often too much is found, and you may want to explicitely
- exclude individual packages in the #excludedFromPrerequisites method."
-
^ #(
- #'stx:goodies/refactoryBrowser/parser'
+ #'stx:goodies/libtool3' "Tools::Inspector2Tab - referenced by IRFunction>>inspector2TabIRCode "
+ #'stx:goodies/refactoryBrowser/parser' "RBIdentifierToken - referenced by IRDecompiler>>newVar: "
#'stx:goodies/sunit' "TestCase - superclass of IRTransformTest "
#'stx:libbasic' "Link - superclass of IRLine "
#'stx:libbasic2' "OrderedDictionary - referenced by IRBytecodeGenerator>>initialize "
#'stx:libcomp' "PrimitiveNode - referenced by IRFunction>>initialize "
- #'stx:libcompat'
- #'stx:libtool' "Tools::Inspector2Tab - referenced by IRFunction>>inspector2TabIRCode "
- #'stx:libwidg'
+ #'stx:libcompat' "Preferences - referenced by IRDecompiler>>removeClosureCreation: "
+ #'stx:libwidg' "ScrollableView - referenced by IRFunction>>inspector2TabIRCode "
)
! !
!cvut_stx_goodies_newcompiler class methodsFor:'description - contents'!
classNamesAndAttributes
- "lists the classes which are to be included in the project.
- Each entry in the list may be: a single class-name (symbol),
- or an array-literal consisting of class name and attributes.
- Attributes are: #autoload or #<os> where os is one of win32, unix,..."
-
^ #(
"<className> or (<className> attributes...) in load order"
IRBuilder
- (IRBuilderTest autoload)
+ IRBuilderTest
IRBytecodeGenerator
IRFunction
IRInstruction
IRInterpreter
IRSequence
IRStackCount
- (IRTransformTest autoload)
+ IRTransformTest
#'cvut_stx_goodies_newcompiler'
IRAccess
IRClosure
IRConstant
+ IRDecompiler
IRDup
IRJump
IRLine
@@ -78,9 +67,6 @@
!
extensionMethodNames
- "lists the extension methods which are to be included in the project.
- Entries are 2-element array literals, consisting of class-name and selector."
-
^ #(
ByteCodeCompiler literalArray:
Class binding
@@ -124,23 +110,32 @@
!cvut_stx_goodies_newcompiler class methodsFor:'description - svn'!
+svnRepositoryUrlString
+ "Return a SVN repository URL of myself.
+ (Generated since 2011-04-08)
+ Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+ "
+
+ ^ '$URL:: $'
+!
+
svnRevisionNr
"Return a SVN revision number of myself.
This number is updated after a commit"
- ^ "$SVN-Revision:"'34M'"$"
+ ^ "$SVN-Revision:"'nil '"$"
! !
!cvut_stx_goodies_newcompiler class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/cvut_stx_goodies_newcompiler.st,v 1.4 2009/10/08 12:00:46 fm Exp $'
+ ^ '$Id$'
!
version_CVS
- ^ '$Header: /cvs/stx/cvut/stx/goodies/newcompiler/cvut_stx_goodies_newcompiler.st,v 1.4 2009/10/08 12:00:46 fm Exp $'
+ ^ '§Header: /cvs/stx/cvut/stx/goodies/newcompiler/cvut_stx_goodies_newcompiler.st,v 1.4 2009/10/08 12:00:46 fm Exp §'
!
version_SVN
- ^ '$Id$'
+ ^ '$Id:: $'
! !
--- a/extensions.st Tue Nov 15 21:28:05 2011 +0000
+++ b/extensions.st Thu Mar 29 18:03:58 2012 +0000
@@ -1,6 +1,4 @@
-"{ Package: 'cvut:stx/goodies/newcompiler' }"
-
-!
+"{ Package: 'cvut:stx/goodies/newcompiler' }"!
!ByteCodeCompiler methodsFor:'accessing'!
@@ -11,6 +9,7 @@
"Created: / 03-11-2008 / 14:09:33 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
+
!Class methodsFor:'accessing'!
binding
@@ -19,8 +18,18 @@
"Created: / 11-06-2008 / 11:20:35 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !
+
+!Class methodsFor:'accessing'!
+
+bindingOf: classVarName
+
+ ^(self fullName , ':' , classVarName) asSymbol
+
+ "Created: / 11-06-2008 / 11:29:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
!cvut_stx_goodies_newcompiler class methodsFor:'documentation'!
extensionsVersion_SVN
- ^ '$Id$'
-! !
+ ^ '$Id:: $'
+! !
\ No newline at end of file
--- a/libInit.cc Tue Nov 15 21:28:05 2011 +0000
+++ b/libInit.cc Thu Mar 29 18:03:58 2012 +0000
@@ -38,6 +38,7 @@
_IRAccess_Init(pass,__pRT__,snd);
_IRClosure_Init(pass,__pRT__,snd);
_IRConstant_Init(pass,__pRT__,snd);
+_IRDecompiler_Init(pass,__pRT__,snd);
_IRDup_Init(pass,__pRT__,snd);
_IRJump_Init(pass,__pRT__,snd);
_IRLine_Init(pass,__pRT__,snd);
--- a/newcompiler.rc Tue Nov 15 21:28:05 2011 +0000
+++ b/newcompiler.rc Thu Mar 29 18:03:58 2012 +0000
@@ -1,15 +1,17 @@
//
-// DO NOT EDIT
+// DO NOT EDIT
// automagically generated from the projectDefinition: cvut_stx_goodies_newcompiler.
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 6,1,33,33
- PRODUCTVERSION 6,1,2,1
+ FILEVERSION 6,2,0,1
+ PRODUCTVERSION 6,2,1,1
+#if (__BORLANDC__)
FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VS_USER_DEFINED
+#endif
BEGIN
BLOCK "StringFileInfo"
@@ -18,12 +20,12 @@
BEGIN
VALUE "CompanyName", "CVUT FEI & Mathieu Suen\0"
VALUE "FileDescription", "Smalltalk/X Bytecode generation library based on Squeak's NewCompiler (LIB)\0"
- VALUE "FileVersion", "6.1.33.33\0"
+ VALUE "FileVersion", "6.2.0.1\0"
VALUE "InternalName", "cvut:stx/goodies/newcompiler\0"
VALUE "LegalCopyright", "Copyright Jan Vrany & Mathieu Suen 2008\0"
VALUE "ProductName", "NewCompiler\0"
- VALUE "ProductVersion", "6.1.2.1\0"
- VALUE "ProductDate", "Sat, 07 May 2011 13:19:03 GMT\0"
+ VALUE "ProductVersion", "6.2.1.1\0"
+ VALUE "ProductDate", "Thu, 29 Mar 2012 18:04:25 GMT\0"
END
END
--- a/vcmake.bat Tue Nov 15 21:28:05 2011 +0000
+++ b/vcmake.bat Thu Mar 29 18:03:58 2012 +0000
@@ -3,6 +3,10 @@
@REM type vcmake, and wait...
@REM do not edit - automatically generated from ProjectDefinition
@REM -------
-make.exe -N -f bc.mak -DUSEVC %1 %2
+
+@if not defined VSINSTALLDIR (
+ call "C:\Program Files\Microsoft Visual Studio 10.0"\VC\bin\vcvars32.bat
+)
+make.exe -N -f bc.mak -DUSEVC %*