Browse Source

Merge branch 'master', remote-tracking branch 'gokr/master'

Nicolas Petton 13 years ago
parent
commit
136a3d52ad

+ 8 - 0
examples/nodejs/pystone/Makefile

@@ -0,0 +1,8 @@
+Program.js: Pystone.st
+	../../../bin/jtalkc -m Pystone Pystone.st Program
+
+run: Program.js
+	./pystone
+
+clean:
+	rm -f *.js

+ 306 - 0
examples/nodejs/pystone/Pystone.st

@@ -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
+! !
+

+ 1 - 0
examples/nodejs/pystone/pystone

@@ -0,0 +1 @@
+node Program.js $@