Tim Felgentreff uploaded a new version of EToys to project The Trunk:
http://source.squeak.org/trunk/EToys-tfel.225.mcz ==================== Summary ==================== Name: EToys-tfel.225 Author: tfel Time: 31 August 2016, 3:13:09.554793 pm UUID: b4c31ceb-3ed5-ba40-a351-1672deafcacd Ancestors: EToys-tfel.224 if any subnode of a message node sends a sequential selector, we need to make the node itself sequential, too =============== Diff against EToys-tfel.224 =============== Item was changed: ----- Method: KedamaExamplerPlayer>>containsSequentialSelector: (in category '*Etoys-Squeakland-private') ----- containsSequentialSelector: aSymbol + ^ (#(random random: atRandom) includes: aSymbol)! - ^ (#(random random:) includes: aSymbol)! Item was changed: ----- Method: KedamaTurtleMethodAttributionDefinition2 class>>determineStatementType:fromDict:primaryBreedPair:messageType:isStatement:receiverObject: (in category 'rules') ----- determineStatementType: parentStmtType fromDict: dict primaryBreedPair: myPrimaryBreedPair messageType: myMessageType isStatement: myIsStatement receiverObject: myReceiverObject | vectorTurtle turtleSelectors participants reads writes unknownReceiverSelectors | "Do the calculation only at the statement level." myIsStatement ifFalse: [^ parentStmtType]. "If there is a doSequentially: block, the block is sequential." participants := dict at: self. (participants select: [:e | (e first notNil and: [e first isPrototypeTurtlePlayer])]) size = 0 ifTrue: [^ #none]. myMessageType = #sequential ifTrue: [^ #sequential]. parentStmtType = #sequential ifTrue: [^ #sequential]. "If there is not turtle involved in the statement, it is not transformed." myPrimaryBreedPair ifNil: [^ #none]. vectorTurtle := myPrimaryBreedPair first. myMessageType = #condition ifTrue: [ reads := IdentitySet new. writes := IdentitySet new. participants do: [:list | (((list at: 5) = #testBody or: [(list at: 5) = #testCond]) and: [(list at: 4) ~= #read]) ifTrue: [list first ifNotNil: [writes add: list first]]. (((list at: 5) = #testBody or: [(list at: 5) = #testCond]) and: [(list at: 4) = #read]) ifTrue: [list first ifNotNil: [reads add: list first]]. ]. ((writes intersection: reads) copyWithout: vectorTurtle) ifNotEmpty: [ ^ #sequential ]. ^ #parallel. ]. reads := IdentitySet new. writes := IdentitySet new. turtleSelectors := OrderedCollection new. unknownReceiverSelectors := OrderedCollection new. participants do: [:list | list first = vectorTurtle ifTrue: [ ((vectorTurtle isBreedSelector: list second) or: [ (vectorTurtle isUserDefinedSelector: list second)]) ifFalse: [ turtleSelectors add: list second ]. ]. list first ifNil: [unknownReceiverSelectors add: list second] ifNotNil: [ ((list at: 4) == #read) ifTrue: [reads add: list first]. ((list at: 4) == #read) ifFalse: [writes add: list first]. ]. (vectorTurtle containsSequentialSelector: list second) ifTrue: [^ #sequential]. ]. (turtleSelectors includes: #die) ifTrue: [^ #die]. (((self isKindOf: AssignmentNode) and: [myReceiverObject = vectorTurtle]) and: [vectorTurtle isBreedSelector: self property property]) ifTrue: [^ #none]. (vectorTurtle areOkaySelectors: unknownReceiverSelectors) ifFalse: [ ^ #sequential. ]. (vectorTurtle vectorizableTheseSelectors: turtleSelectors) ifFalse: [^ #sequential]. ((reads intersection: writes) copyWithout: vectorTurtle) ifNotEmpty: [^ #sequential]. + + "Check the hard way. If any leaf nodes" + self nodesDo: [:node | + (node isMessageNode and: [vectorTurtle containsSequentialSelector: node selector]) + ifTrue: [^ #sequential]]. + ^ #parallel. ! Item was changed: ----- Method: MessageAsTempNode>>determineStatementType:fromDict:primaryBreedPair:messageType:isStatement:receiverObject: (in category '*Etoys-Tweak-Kedama-Generated') ----- determineStatementType: t1 fromDict: t2 primaryBreedPair: t3 messageType: t4 isStatement: t5 receiverObject: t6 | t7 t8 t9 t10 t11 t13 | t5 ifFalse: [^ t1]. t9 := t2 at: self. (t9 select: [:t14 | t14 first notNil and: [t14 first isPrototypeTurtlePlayer]]) size = 0 ifTrue: [^ #none]. t4 = #sequential ifTrue: [^ #sequential]. t1 = #sequential ifTrue: [^ #sequential]. t3 ifNil: [^ #none]. t7 := t3 first. t4 = #condition ifTrue: [t11 := IdentitySet new. t13 := IdentitySet new. t9 do: [:t14 | (((t14 at: 5) = #testBody or: [(t14 at: 5) = #testCond]) and: [(t14 at: 4) ~= #read]) ifTrue: [t14 first ifNotNil: [t13 add: t14 first]]. (((t14 at: 5) = #testBody or: [(t14 at: 5) = #testCond]) and: [(t14 at: 4) = #read]) ifTrue: [t14 first ifNotNil: [t11 add: t14 first]]]. ((t13 intersection: t11) copyWithout: t7) ifNotEmpty: [^ #sequential]. ^ #parallel]. t11 := IdentitySet new. t13 := IdentitySet new. t8 := OrderedCollection new. t10 := OrderedCollection new. t9 do: [:t14 | t14 first = t7 ifTrue: [((t7 isBreedSelector: t14 second) or: [t7 isUserDefinedSelector: t14 second]) ifFalse: [t8 add: t14 second]]. t14 first ifNil: [t10 add: t14 second] ifNotNil: [(t14 at: 4) == #read ifTrue: [t11 add: t14 first]. (t14 at: 4) == #read ifFalse: [t13 add: t14 first]]. (t7 containsSequentialSelector: t14 second) ifTrue: [^ #sequential]]. (t8 includes: #die) ifTrue: [^ #die]. (((self isKindOf: AssignmentNode) and: [t6 = t7]) and: [t7 isBreedSelector: self property property]) ifTrue: [^ #none]. (t7 areOkaySelectors: t10) ifFalse: [^ #sequential]. (t7 vectorizableTheseSelectors: t8) ifFalse: [^ #sequential]. ((t11 intersection: t13) copyWithout: t7) ifNotEmpty: [^ #sequential]. + self + nodesDo: [:t14 | (t14 isLeaf + and: [t7 containsSequentialSelector: t14 key]) + ifTrue: [^ #sequential]]. ^ #parallel! Item was changed: ----- Method: MessageNode>>determineStatementType:fromDict:primaryBreedPair:messageType:isStatement:receiverObject: (in category '*Etoys-Tweak-Kedama-Generated') ----- determineStatementType: t1 fromDict: t2 primaryBreedPair: t3 messageType: t4 isStatement: t5 receiverObject: t6 | t7 t8 t9 t10 t11 t13 | t5 ifFalse: [^ t1]. t9 := t2 at: self. (t9 select: [:t14 | t14 first notNil and: [t14 first isPrototypeTurtlePlayer]]) size = 0 ifTrue: [^ #none]. t4 = #sequential ifTrue: [^ #sequential]. t1 = #sequential ifTrue: [^ #sequential]. t3 ifNil: [^ #none]. t7 := t3 first. t4 = #condition ifTrue: [t11 := IdentitySet new. t13 := IdentitySet new. t9 do: [:t14 | (((t14 at: 5) = #testBody or: [(t14 at: 5) = #testCond]) and: [(t14 at: 4) ~= #read]) ifTrue: [t14 first ifNotNil: [t13 add: t14 first]]. (((t14 at: 5) = #testBody or: [(t14 at: 5) = #testCond]) and: [(t14 at: 4) = #read]) ifTrue: [t14 first ifNotNil: [t11 add: t14 first]]]. ((t13 intersection: t11) copyWithout: t7) ifNotEmpty: [^ #sequential]. ^ #parallel]. t11 := IdentitySet new. t13 := IdentitySet new. t8 := OrderedCollection new. t10 := OrderedCollection new. t9 do: [:t14 | t14 first = t7 ifTrue: [((t7 isBreedSelector: t14 second) or: [t7 isUserDefinedSelector: t14 second]) ifFalse: [t8 add: t14 second]]. t14 first ifNil: [t10 add: t14 second] ifNotNil: [(t14 at: 4) == #read ifTrue: [t11 add: t14 first]. (t14 at: 4) == #read ifFalse: [t13 add: t14 first]]. (t7 containsSequentialSelector: t14 second) ifTrue: [^ #sequential]]. (t8 includes: #die) ifTrue: [^ #die]. (((self isKindOf: AssignmentNode) and: [t6 = t7]) and: [t7 isBreedSelector: self property property]) ifTrue: [^ #none]. (t7 areOkaySelectors: t10) ifFalse: [^ #sequential]. (t7 vectorizableTheseSelectors: t8) ifFalse: [^ #sequential]. ((t11 intersection: t13) copyWithout: t7) ifNotEmpty: [^ #sequential]. + self + nodesDo: [:t14 | (t14 isLeaf + and: [t7 containsSequentialSelector: t14 key]) + ifTrue: [^ #sequential]]. ^ #parallel! |
Free forum by Nabble | Edit this page |