[Python-checkins] python/nondist/sandbox/ast asdl_c.py,1.9,1.10

jhylton@sourceforge.net jhylton@sourceforge.net
2002年4月15日 20:59:12 -0700


Update of /cvsroot/python/python/nondist/sandbox/ast
In directory usw-pr-cvs1:/tmp/cvs-serv23805
Modified Files:
	asdl_c.py 
Log Message:
Factor out the simple test into a method is_simple().
Add some preliminary code (not hooked up) to generate C code to write
pickles.
Index: asdl_c.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/ast/asdl_c.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** asdl_c.py	16 Apr 2002 03:22:54 -0000	1.9
--- asdl_c.py	16 Apr 2002 03:59:10 -0000	1.10
***************
*** 81,84 ****
--- 81,97 ----
 self.file.write(line)
 
+ def is_simple(self, sum):
+ """Return true if a sum is a simple.
+ 
+ A sum is simple if its types have no fields, e.g.
+ unaryop = Invert | Not | UAdd | USub
+ """
+ simple = 1
+ for t in sum.types:
+ if t.fields:
+ simple = 0
+ break
+ return simple
+ 
 class TypeDefVisitor(EmitVisitor):
 def visitModule(self, mod):
***************
*** 90,99 ****
 
 def visitSum(self, sum, name, depth):
! simple = 1
! for t in sum.types:
! if t.fields:
! simple = 0
! break
! if simple:
 self.simple_sum(sum, name, depth)
 else:
--- 103,107 ----
 
 def visitSum(self, sum, name, depth):
! if self.is_simple(sum):
 self.simple_sum(sum, name, depth)
 else:
***************
*** 134,143 ****
 
 def visitSum(self, sum, name, depth):
! simple = 1
! for t in sum.types:
! if t.fields:
! simple = 0
! break
! if not simple:
 self.sum_with_constructors(sum, name, depth)
 
--- 142,146 ----
 
 def visitSum(self, sum, name, depth):
! if not self.is_simple(sum):
 self.sum_with_constructors(sum, name, depth)
 
***************
*** 198,208 ****
 
 def visitSum(self, sum, name):
! simple = 1
! for t in sum.types:
! if t.fields:
! simple = 0
! break
! 
! if simple:
 pass # XXX
 else:
--- 201,205 ----
 
 def visitSum(self, sum, name):
! if self.is_simple(sum):
 pass # XXX
 else:
***************
*** 273,277 ****
 emit("}")
 emit("")
! 
 class ChainOfVisitors:
 def __init__(self, *visitors):
--- 270,334 ----
 emit("}")
 emit("")
! 
! class PickleVisitor(EmitVisitor):
! 
! def visitModule(self, mod):
! for dfn in mod.dfns:
! self.visit(dfn)
! 
! def visitType(self, type):
! self.visit(type.value, type.name)
! 
! def visitSum(self, sum, name):
! pass
! 
! def visitProduct(self, sum, name):
! pass
! 
! def visitConstructor(self, cons, name):
! pass
! 
! def visitField(self, sum):
! pass
! 
! class PicklePrototypeVisitor(PickleVisitor):
! 
! def visitSum(self, sum, name):
! ctype = get_c_type(name)
! self.emit("int pkl_write_%s(PyObject *write, %s o);" % (name, ctype),
! 0)
! 
! class PickleFunctionVisitor(PickleVisitor):
! 
! def visitSum(self, sum, name):
! ctype = get_c_type(name)
! self.emit("int", 0)
! self.emit("pkl_write_%s(PyObject *write, %s o)" % (name, ctype), 0)
! self.emit("{", 0)
! self.emit("switch (o->kind) {", 1)
! simple = self.is_simple(sum)
! for i in range(len(sum.types)):
! t = sum.types[i]
! self.visit(t, i + 1, name, simple)
! self.emit("}", 1)
! self.emit("return 0;", 1)
! self.emit("}", 0)
! self.emit("", 0)
! 
! def visitConstructor(self, cons, enum, name, simple):
! if simple:
! pass
! else:
! self.emit("case %s_kind:" % cons.name, 1)
! self.emit("pkl_write_int(write, %d);" % enum, 2)
! for f in cons.fields:
! self.visit(f, cons.name)
! self.emit("break;", 2)
! 
! def visitField(self, field, name):
! # handle seq and opt
! self.emit("pkl_write_%s(write, o->v.%s.%s);" % (
! field.type, name, field.name), 2)
! 
 class ChainOfVisitors:
 def __init__(self, *visitors):
***************
*** 292,296 ****
 c = ChainOfVisitors(TypeDefVisitor(f),
 StructVisitor(f),
! PrototypeVisitor(f)
 )
 c.visit(mod)
--- 349,354 ----
 c = ChainOfVisitors(TypeDefVisitor(f),
 StructVisitor(f),
! PrototypeVisitor(f),
! ## PicklePrototypeVisitor(f),
 )
 c.visit(mod)
***************
*** 300,304 ****
 print >> f, '#include "Python.h"'
 print >> f, '#include "%s-ast.h"' % mod.name
! v = FunctionVisitor(f)
 v.visit(mod)
 f.close()
--- 358,364 ----
 print >> f, '#include "Python.h"'
 print >> f, '#include "%s-ast.h"' % mod.name
! v = ChainOfVisitors(FunctionVisitor(f),
! ## PickleFunctionVisitor(f),
! )
 v.visit(mod)
 f.close()

AltStyle によって変換されたページ (->オリジナル) /