added "pystone" benchmark
diff --git a/Tools/scripts/README b/Tools/scripts/README
index 2b7f49f..58059ee 100644
--- a/Tools/scripts/README
+++ b/Tools/scripts/README
@@ -25,6 +25,7 @@
 pdeps.py		Print dependencies between Python modules
 pindent.py		Indent Python code, giving block-closing comments
 ptags.py		Create vi tags file for Python modules
+pystone.py		Benchmark, based on "Dhrystone" C benchmark
 suff.py			Sort a list of files by suffix
 sum5.py			Print md5 checksums of files
 which.py		Find a program in $PATH
diff --git a/Tools/scripts/pystone.py b/Tools/scripts/pystone.py
new file mode 100755
index 0000000..954e6c9
--- /dev/null
+++ b/Tools/scripts/pystone.py
@@ -0,0 +1,229 @@
+#! /usr/local/bin/python
+
+"""
+"PYSTONE" Benchmark Program
+
+Version:	Python/1.0 (corresponds to C/1.1)
+
+Author:		Reinhold P. Weicker,  CACM Vol 27, No 10, 10/84 pg. 1013.
+
+		Translated from ADA to C by Rick Richardson.
+		Every method to preserve ADA-likeness has been used,
+		at the expense of C-ness.
+
+		Translated from C to Python by Guido van Rossum.
+"""
+
+LOOPS = 1000
+
+from time import clock
+
+__version__ = "1.0"
+
+[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6)
+
+class Record:
+
+	def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0,
+		           IntComp = 0, StringComp = 0):
+		self.PtrComp = PtrComp
+		self.Discr = Discr
+		self.EnumComp = EnumComp
+		self.IntComp = IntComp
+		self.StringComp = StringComp
+
+	def copy(self):
+		return Record(self.PtrComp, self.Discr, self.EnumComp,
+			      self.IntComp, self.StringComp)
+
+TRUE = 1
+FALSE = 0
+
+def main():
+	Proc0()
+
+IntGlob = 0
+BoolGlob = FALSE
+Char1Glob = '\0'
+Char2Glob = '\0'
+Array1Glob = [0]*51
+Array2Glob = map(lambda x: x[:], [Array1Glob]*51)
+PtrGlb = None
+PtrGlbNext = None
+
+def Proc0():
+	global IntGlob
+	global BoolGlob
+	global Char1Glob
+	global Char2Glob
+	global Array1Glob
+	global Array2Glob
+	global PtrGlb
+	global PtrGlbNext
+	
+	starttime = clock()
+	for i in range(LOOPS):
+		pass
+	nulltime = clock() - starttime
+	
+	PtrGlbNext = Record()
+	PtrGlb = Record()
+	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[8][7] = 10
+	
+	starttime = clock()
+	
+	for i in range(LOOPS):
+		Proc5()
+		Proc4()
+		IntLoc1 = 2
+		IntLoc2 = 3
+		String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING"
+		EnumLoc = Ident2
+		BoolGlob = not Func2(String1Loc, String2Loc)
+		while IntLoc1 < IntLoc2:
+			IntLoc3 = 5 * IntLoc1 - IntLoc2
+			IntLoc3 = Proc7(IntLoc1, IntLoc2)
+			IntLoc1 = IntLoc1 + 1
+		Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3)
+		PtrGlb = Proc1(PtrGlb)
+		CharIndex = 'A'
+		while CharIndex <= Char2Glob:
+			if EnumLoc == Func1(CharIndex, 'C'):
+				EnumLoc = Proc6(Ident1)
+			CharIndex = chr(ord(CharIndex)+1)
+		IntLoc3 = IntLoc2 * IntLoc1
+		IntLoc2 = IntLoc3 / IntLoc1
+		IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1
+		IntLoc1 = Proc2(IntLoc1)
+	
+	benchtime = clock() - starttime - nulltime
+	print "Pystone(%s) time for %d passes = %g" % \
+	      (__version__, LOOPS, benchtime)
+	print "This machine benchmarks at %g pystones/second" % \
+	      (LOOPS/benchtime)
+
+def Proc1(PtrParIn):
+	PtrParIn.PtrComp = NextRecord = PtrGlb.copy()
+	PtrParIn.IntComp = 5
+	NextRecord.IntComp = PtrParIn.IntComp
+	NextRecord.PtrComp = PtrParIn.PtrComp
+	NextRecord.PtrComp = Proc3(NextRecord.PtrComp)
+	if NextRecord.Discr == Ident1:
+		NextRecord.IntComp = 6
+		NextRecord.EnumComp = Proc6(PtrParIn.EnumComp)
+		NextRecord.PtrComp = PtrGlb.PtrComp
+		NextRecord.IntComp = Proc7(NextRecord.IntComp, 10)
+	else:
+		PtrParIn = NextRecord.copy()
+	return PtrParIn
+
+def Proc2(IntParIO):
+	IntLoc = IntParIO + 10
+	while 1:
+		if Char1Glob == 'A':
+			IntLoc = IntLoc - 1
+			IntParIO = IntLoc - IntGlob
+			EnumLoc = Ident1
+		if EnumLoc == Ident1:
+			break
+	return IntParIO
+
+def Proc3(PtrParOut):
+	global IntGlob
+	
+	if PtrGlb != None:
+		PtrParOut = PtrGlb.PtrComp
+	else:
+		IntGlob = 100
+	PtrGlb.IntComp = Proc7(10, IntGlob)
+	return PtrParOut
+
+def Proc4():
+	global Char2Glob
+	
+	BoolLoc = Char1Glob == 'A'
+	BoolLoc = BoolLoc or BoolGlob
+	Char2Glob = 'B'
+
+def Proc5():
+	global Char1Glob
+	global BoolGlob
+	
+	Char1Glob = 'A'
+	BoolGlob = FALSE
+
+def Proc6(EnumParIn):
+	EnumParOut = EnumParIn
+	if not Func3(EnumParIn):
+		EnumParOut = Ident4
+	if EnumParIn == Ident1:
+		EnumParOut = Ident1
+	elif EnumParIn == Ident2:
+		if IntGlob > 100:
+			EnumParOut = Ident1
+		else:
+			EnumParOut = Ident4
+	elif EnumParIn == Ident3:
+		EnumParOut = Ident2
+	elif EnumParIn == Ident4:
+		pass
+	elif EnumParIn == Ident5:
+		EnumParOut = Ident3
+	return EnumParOut
+
+def Proc7(IntParI1, IntParI2):
+	IntLoc = IntParI1 + 2
+	IntParOut = IntParI2 + IntLoc
+	return IntParOut
+
+def Proc8(Array1Par, Array2Par, IntParI1, IntParI2):
+	global IntGlob
+	
+	IntLoc = IntParI1 + 5
+	Array1Par[IntLoc] = IntParI2
+	Array1Par[IntLoc+1] = Array1Par[IntLoc]
+	Array1Par[IntLoc+30] = IntLoc
+	for IntIndex in range(IntLoc, IntLoc+2):
+		Array2Par[IntLoc][IntIndex] = IntLoc
+	Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1
+	Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc]
+	IntGlob = 5
+
+def Func1(CharPar1, CharPar2):
+	CharLoc1 = CharPar1
+	CharLoc2 = CharLoc1
+	if CharLoc2 != CharPar2:
+		return Ident1
+	else:
+		return Ident2
+
+def Func2(StrParI1, StrParI2):
+	IntLoc = 1
+	while IntLoc <= 1:
+		if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1:
+			CharLoc = 'A'
+			IntLoc = IntLoc + 1
+	if CharLoc >= 'W' and CharLoc <= 'Z':
+		IntLoc = 7
+	if CharLoc == 'X':
+		return TRUE
+	else:
+		if StrParI1 > StrParI2:
+			IntLoc = IntLoc + 7
+			return TRUE
+		else:
+			return FALSE
+
+def Func3(EnumParIn):
+	EnumLoc = EnumParIn
+	if EnumLoc == Ident3: return TRUE
+	return FALSE
+
+if __name__ == '__main__':
+	main()