| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 | 
							- Object subclass: #PyStoneRecord
 
- 	instanceVariableNames: 'ptrComp discr enumComp intComp stringComp'
 
- 	package: '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
 
- ! !
 
 
  |