[Python-checkins] python/nondist/sandbox/parrotbench b0.py, 1.1, 1.2 out0, 1.1, 1.2

gvanrossum at users.sourceforge.net gvanrossum at users.sourceforge.net
Tue Dec 30 11:28:29 EST 2003


Update of /cvsroot/python/python/nondist/sandbox/parrotbench
In directory sc8-pr-cvs1:/tmp/cvs-serv31809

Modified Files:
	b0.py out0 
Log Message:
New version.  Better approach to self-checking and debugging.

Index: b0.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/parrotbench/b0.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** b0.py	30 Dec 2003 06:12:57 -0000	1.1
--- b0.py	30 Dec 2003 16:28:25 -0000	1.2
***************
*** 1,5 ****
! def check(b, msg=None):
!     if not b:
!         raise AssertionError(msg)
  
  def proto___new__(cls, name):
--- 1,7 ----
! def check(a, b):
!     if not a == b:
!         print (a, b)
!         if __debug__:
!             raise AssertionError("%r != %r" % (a, b))
  
  def proto___new__(cls, name):
***************
*** 35,40 ****
  OPERATOR = Token('OPERATOR')
  
- ##print INDENT, DEDENT
- 
  class Scanner(object):
  
--- 37,40 ----
***************
*** 176,179 ****
--- 176,180 ----
              d, d1 = a//b, a1//b1
  def strhash(s):
+     # Python 2.x string hash algorithm
      if s == '':
          return 0
***************
*** 191,195 ****
      L.append(pair)
  L2 = list(it2)
! check(L == L2)
  
  operators = {
--- 192,196 ----
      L.append(pair)
  L2 = list(it2)
! check(L, L2)
  
  operators = {
***************
*** 265,269 ****
          self.globals = globals
      def __call__(self, *args):
!         check(len(args) == len(self.args))
          locals = dict(zip(self.args, args))
          try:
--- 266,270 ----
          self.globals = globals
      def __call__(self, *args):
!         check(len(args), len(self.args))
          locals = dict(zip(self.args, args))
          try:
***************
*** 274,278 ****
  class Generator(Function):
      def __call__(self, *args):
!         check(len(args) == len(self.args))
          locals = dict(zip(self.args, args))
          try:
--- 275,279 ----
  class Generator(Function):
      def __call__(self, *args):
!         check(len(args), len(self.args))
          locals = dict(zip(self.args, args))
          try:
***************
*** 523,527 ****
      def nexttoken(self):
          self.token, self.value = rv = self.scanner.next()
-         ##print rv
          return rv
      def expect(self, token, value=None):
--- 524,527 ----
***************
*** 675,686 ****
  root = parser.parse()
  
  indent = ""
! def writeln(s):
!     print s
  def instrumentClass(cls):
      for name in cls.__dict__:
          descr = getattr(cls, name)
          if hasattr(descr, '__get__'):
!             setattr(cls, name, instrumentDescriptor(name, descr))
  class instrumentDescriptor(object):
      def __init__(self, name, obj):
--- 675,728 ----
  root = parser.parse()
  
+ class List(list):
+     __setitem__ = list.__setitem__
+     __getitem__ = list.__getitem__
+ 
+ class Str(str):
+     __getitem__ = str.__getitem__
+ 
+ class OutputFile(object):
+     data = []
+     def write(self, s):
+         self.data.append(s)
+     def getvalue(self):
+         r = "".join(self.data)
+         self.data = List()
+         return r
+ 
+ output = OutputFile()
+ def write(s):
+     s = str(s)
+     i = s.find(' at 0x')
+     while i > 0:
+         j = s.find('>', i+6)
+         if j < 0:
+             break
+         digits = s[i+4:j]
+         try:
+             number = int(digits, 0)
+         except ValueError:
+             break
+         else:
+             s = s[:i+5] + s[j:]
+             i = s.find(' at 0x')
+     if __debug__:
+         print s,
+     print >>output, s,
+ def writeln(s=''):
+     write(str(s) + '\n')
  indent = ""
! OutputFile.softspace = True
  def instrumentClass(cls):
+     cname = cls.__name__ + '.'
      for name in cls.__dict__:
          descr = getattr(cls, name)
          if hasattr(descr, '__get__'):
!             setattr(cls, name, instrumentDescriptor(cname+name, descr))
! def unInstrumentClass(cls):
!     for name in cls.__dict__:
!         descr = getattr(cls, name)
!         if isinstance(descr, instrumentDescriptor):
!             setattr(cls, name, descr.obj)
  class instrumentDescriptor(object):
      def __init__(self, name, obj):
***************
*** 725,737 ****
  instrumentClass(Parser)
  root = parser.parse()
- env = {}
- eval(root, env, env)
- g = env['pi']()
- for i in range(1000):
-     print g.next(),
- print
- strhash = env['strhash']
  
! def myhash(s):
      if not s:
          return 0
--- 767,772 ----
  instrumentClass(Parser)
  root = parser.parse()
  
! def myhash(s, ord=ord):
      if not s:
          return 0
***************
*** 741,748 ****
      return x^len(s)
  
  for x in '', 'x', 'abc', 'abc'*100:
!     a, b, c = strhash(x), myhash(x), hash(x) & 0xffffffffL
!     if a == b == c:
!         print a
!     else:
!         print a, b, c
--- 776,854 ----
      return x^len(s)
  
+ def checkoutput(n=0):
+     outputtext = output.getvalue()
+     check(strhash(outputtext), n)
+ 
+ strhash = myhash
+ 
+ checkoutput(1365277872)
+ 
+ env = {}
+ eval(root, env, env)
+ g = env['pi']()
+ for i in range(1000):
+     write(g.next())
+ writeln('')
+ strhash = env['strhash']
+ 
  for x in '', 'x', 'abc', 'abc'*100:
!     check(strhash(x), myhash(x))
! 
! strhash = myhash
! checkoutput(3960406533)
! 
! ##unInstrumentClass(Parser)
! it = Clone(getcFromString(unicode(sample, "utf8")))
! it2 = Clone(it)
! scanner = Scanner(it.next).tokenize()
! parser = Parser(scanner)
! root = parser.parse()
! checkoutput(2293472643)
! env = {}
! eval(root, env, env)
! g = env['pi']()
! for i in range(1000):
!     write(g.next())
! writeln()
! checkoutput(3960406533)
! 
! def instrumentTree(base):
!     instrumentClass(base)
!     for cls in base.__subclasses__():
!         instrumentTree(cls)
! def unInstrumentTree(base):
!     unInstrumentClass(base)
!     for cls in base.__subclasses__():
!         unInstrumentTree(cls)
! 
! instrumentTree(Node)
! scanner = Clone(Scanner(it2.next).tokenize())
! scanner2 = Clone(scanner)
! parser = Parser(scanner)
! root = parser.parse()
! env = {}
! eval(root, env, env)
! g = env['pi']()
! for i in range(10):
!     write(g.next())
! writeln()
! out = output.getvalue()
! 
! unInstrumentTree(Node)
! unInstrumentClass(Parser)
! parser = Parser(scanner2)
! root = parser.parse()
! env = {}
! eval(root, env, env)
! g = env['pi']()
! for i in range(10):
!     write(g.next())
! writeln()
! out2 = output.getvalue()
! check(out, out2)
! check(strhash(out[:1000]), 773700721)
! check(strhash(out[100000:101000]), 3131788725)
! check(strhash(out[200000:201000]), 3508888315)
! check(strhash(out[300000:301000]), 199799004)
! check(strhash(out[400000:401000]), 84251599)
! check(strhash(out[-1000:]), 620844360)

Index: out0
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/parrotbench/out0,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** out0	30 Dec 2003 06:12:57 -0000	1.1
--- out0	30 Dec 2003 16:28:25 -0000	1.2
***************
*** 1,42 ****
!  parse()
!   parse_stmt()
!    parse_def()
!     expect(NAME, 'def')
!      nexttoken()
       return (NAME, 'pi')
      return 'def'
!     expect(NAME)
!      nexttoken()
       return (OPERATOR, '(')
[...16941 lines suppressed...]
!   Exprs.assign((3L, 3L), {u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 4L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!    Name.assign(3L, {u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 4L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!    return
!    Name.assign(3L, {u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!    return
!   return
!  return
!  While.geneval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!  return <generator object at 0>
!  Binop.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!   Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!   return 3L
!   Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!   return 3L
!  return True
!  Yield.geneval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!  return <generator object at 0>
!  Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L})
!  return 3L
! 3 





More information about the Python-checkins mailing list