|
@@ -0,0 +1,306 @@
|
|
|
+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
|
|
|
+! !
|
|
|
+
|