Object subclass: #PyStoneRecord instanceVariableNames: 'ptrComp discr enumComp intComp stringComp' category: 'Pystone'! !PyStoneRecord commentStamp! Record class used in Pystone benchmark.! !PyStoneRecord methodsFor: 'accessing'! discr ^discr ! discr: p discr := p ! enumComp ^enumComp ! enumComp: p enumComp := p ! intComp ^intComp ! intComp: p intComp := p ! ptrComp ^ptrComp ! ptrComp: p ptrComp := p ! stringComp ^stringComp ! stringComp: p stringComp := p ! ! !PyStoneRecord methodsFor: 'copying'! copy ^PyStoneRecord ptrComp: ptrComp discr: discr enumComp: enumComp intComp: intComp stringComp: stringComp ! ! !PyStoneRecord methodsFor: 'initialize-release'! ptrComp: p discr: d enumComp: e intComp: i stringComp: s ptrComp := p. discr := d. enumComp := e. intComp := i. stringComp := s ! ! !PyStoneRecord class methodsFor: 'instance-creation'! new ^self ptrComp: nil discr: 0 enumComp: 0 intComp: 0 stringComp: 0 ! ptrComp: p discr: d enumComp: e intComp: i stringComp: s ^super new ptrComp: p discr: d enumComp: e intComp: i stringComp: s ! ! Object subclass: #Pystone instanceVariableNames: 'nulltime ptrGlbNext ptrGlb ident1 ident3 ident2 ident4 ident5 ident6 intGlob boolGlob char1Glob char2Glob array1Glob array2Glob func3 func2 func1' category: 'Pystone'! !Pystone commentStamp! This is a straight translation of pystone 1.1 from Python to Squeak. Procedures have been mapped to instance side methods, functions have been mapped to blocks. Open a transcript and run: Pystone run! !Pystone methodsFor: 'as yet unclassified'! defineFunctions "Functions have been mapped to blocks, since that would be natural." func1 := [:charPar1 :charPar2 | | charLoc1 charLoc2 | charLoc1 := charPar1. charLoc2 := charLoc1. (charLoc2 = charPar2) ifTrue: [ident2] ifFalse: [ident1]]. func2 := [:strParI1 :strParI2 | | intLoc charLoc | intLoc := 1. [intLoc <= 1] whileTrue: [ ((func1 value: (strParI1 at: intLoc) value: (strParI1 at: intLoc + 1)) = ident1) ifTrue: [ charLoc := 'A'. intLoc := intLoc + 1]]. (charLoc >= 'W' and: [charLoc <= 'Z']) ifTrue: [ intLoc := 7]. (charLoc = 'X') ifTrue: [true] ifFalse: [ (strParI1 > strParI2) ifTrue: [ intLoc := intLoc + 7. true] ifFalse: [ false]]]. func3 := [:enumParIn | | enumLoc | enumLoc := enumParIn. enumLoc = ident3] ! main: loops "Adaption of pystone.py version 1.9 from Python." ident1 := 1. ident2 := 2. ident3 := 3. ident4 := 4. ident5 := 5. ident6 := 6. intGlob := 0. boolGlob := false. char1Glob := String value: 0. char2Glob := String value: 0. array1Glob := Array new. 51 timesRepeat: [ array1Glob add: 0]. array2Glob := ((1 to: 51) collect: [:i | array1Glob copy]) asArray. self defineFunctions. self pystones: loops block: [:benchtime :stones | self log: 'Pystone(1.1) time for ', loops asString, ' passes = ', benchtime asString. self log: 'This machine benchmarks at ', ((stones / 0.1) rounded * 0.1) asString, ' pystones/second'] ! log: aString (smalltalk at: #Transcript) ifNotNil: [ Transcript show: aString;cr] ifNil: [ console log: aString] ! proc0: loops block: aBlock | string1Loc starttime intLoc1 intLoc2 string2Loc enumLoc intLoc3 charIndex benchtime | loops timesRepeat: []. benchtime := Date millisecondsToRun: [ ptrGlbNext := PyStoneRecord new. ptrGlb := PyStoneRecord new. ptrGlb ptrComp: ptrGlbNext. ptrGlb discr: ident1. ptrGlb enumComp: ident3. ptrGlb intComp: 40. ptrGlb stringComp: 'DHRYSTONE PROGRAM, SOME STRING'. string1Loc := 'DHRYSTONE PROGRAM, 1''ST STRING'. (array2Glob at: 8) at: 7 put: 10. "1 to: loops - 1 do: [:i | Changed this to use timesRepeat: since i is not used at all in the loop" loops timesRepeat: [ self proc5; proc4. intLoc1 := 2. intLoc2 := 3. string2Loc := 'DHRYSTONE PROGRAM, 2''ND STRING'. enumLoc := ident2. boolGlob := (func2 value: string1Loc value: string2Loc) not. [intLoc1 < intLoc2] whileTrue: [ intLoc3 := 5 * intLoc1 - intLoc2. intLoc3 := self proc7: intLoc1 with: intLoc2. intLoc1 := intLoc1 + 1]. self proc8:array1Glob with: array2Glob with: intLoc1 with: intLoc3. ptrGlb := self proc1: ptrGlb. charIndex := 'A'. [charIndex <= char2Glob] whileTrue: [ (enumLoc = (func1 value: charIndex value: 'C')) ifTrue: [enumLoc := self proc6: ident1]. charIndex := String value: (charIndex asciiValue + 1)]. intLoc3 := intLoc2 * intLoc1. intLoc2 := intLoc3 / intLoc1. intLoc2 := 7 * (intLoc3 - intLoc2) - intLoc1. intLoc1 := self proc2: intLoc1]]. ^ aBlock value: (benchtime / 1000) value: (loops / benchtime) * 1000 ! proc1: ptrParIn | nextRecord tmp | tmp := ptrParIn. nextRecord := ptrGlb copy. ptrParIn ptrComp: nextRecord. ptrParIn intComp: 5. nextRecord intComp: ptrParIn intComp. nextRecord ptrComp: ptrParIn ptrComp. nextRecord ptrComp: (self proc3: nextRecord ptrComp). (nextRecord discr = ident1) ifTrue: [ nextRecord intComp: 6. nextRecord enumComp: (self proc6: ptrParIn enumComp). nextRecord ptrComp: ptrGlb ptrComp. nextRecord intComp: (self proc7: nextRecord intComp with: 10) ] ifFalse: [ tmp := nextRecord copy]. nextRecord ptrComp: nil. ^tmp ! proc2: intParIO | tmp intLoc enumLoc | tmp := intParIO. intLoc := intParIO + 10. [true] whileTrue: [ (char1Glob = 'A') ifTrue: [ intLoc := intLoc - 1. tmp := intLoc - intGlob. enumLoc := ident1]. (enumLoc = ident1) ifTrue: [ ^ tmp]] ! proc3: ptrParOut | tmp | tmp := ptrParOut. ptrGlb ifNotNil: [ tmp := ptrGlb ptrComp] ifNil: [ intGlob := 100]. ptrGlb intComp: (self proc7: 10 with: intGlob). ^tmp ! proc4 | boolLoc | boolLoc := char1Glob = 'A'. boolLoc := boolLoc | boolGlob. char2Glob := 'B' ! proc5 char1Glob := 'A'. boolGlob := false ! proc6: enumParIn | enumParOut | enumParOut := enumParIn. (func3 value: enumParIn) ifFalse: [ enumParOut := ident4]. (enumParIn = ident1) ifTrue: [ enumParOut := ident1] ifFalse: [ (enumParIn = ident2) ifTrue: [ intGlob > 100 ifTrue: [ enumParOut := ident1] ifFalse: [ enumParOut := ident4]] ifFalse: [ (enumParIn = ident3) ifTrue: [ enumParOut := ident2] ifFalse: [ (enumParIn = ident4) ifTrue: [] ifFalse: [ (enumParIn = ident5) ifTrue: [ enumParOut := ident3]]]]]. ^enumParOut ! proc7: intParI1 with: intParI2 | intLoc intParOut | intLoc := intParI1 + 2. intParOut := intParI2 + intLoc. ^ intParOut ! proc8: array1Par with: array2Par with: intParI1 with: intParI2 | intLoc | intLoc := intParI1 + 5. array1Par at: intLoc put: intParI2. array1Par at: intLoc + 1 put: (array1Par at: intLoc). array1Par at: intLoc + 30 put: intLoc. intLoc to: intLoc + 1 do: [:intIndex | (array2Par at: intLoc) at: intIndex put: intLoc. (array2Par at: intLoc) at: intLoc - 1 put: ((array2Par at: intLoc) at: intLoc - 1) + 1. (array2Par at: intLoc + 20) at: intLoc put: (array1Par at: intLoc)]. intGlob := 5 ! pystones: loops block: aBlock ^self proc0: loops block: aBlock ! ! Pystone class instanceVariableNames: 'nulltime'! !Pystone class methodsFor: 'as yet unclassified'! main "self main" self run: 50000 ! run: loops "self run: 50000" self new main: loops ! !