| 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'	package: '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! !
 |