[Python-checkins] python/dist/src/Parser asdl_c.py,1.1.2.2,1.1.2.3
jhylton at users.sourceforge.net
jhylton at users.sourceforge.net
Tue Apr 13 10:54:46 EDT 2004
Update of /cvsroot/python/python/dist/src/Parser
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15652/Parser
Modified Files:
Tag: ast-branch
asdl_c.py
Log Message:
Add incomplete code generator for methods to free ast structures.
Problems:
- Generates free functions for simple types that don't need extra
support.
- Doesn't handle all builtin types correctly.
Index: asdl_c.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/Attic/asdl_c.py,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** asdl_c.py 30 Aug 2002 19:11:39 -0000 1.1.2.2
--- asdl_c.py 13 Apr 2004 14:54:43 -0000 1.1.2.3
***************
*** 65,68 ****
--- 65,81 ----
return lines
+ def is_simple(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 = True
+ for t in sum.types:
+ if t.fields:
+ simple = False
+ break
+ return simple
+
class EmitVisitor(asdl.VisitorBase):
"""Visit that emits lines"""
***************
*** 82,98 ****
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):
--- 95,98 ----
***************
*** 104,108 ****
def visitSum(self, sum, name, depth):
! if self.is_simple(sum):
self.simple_sum(sum, name, depth)
else:
--- 104,108 ----
def visitSum(self, sum, name, depth):
! if is_simple(sum):
self.simple_sum(sum, name, depth)
else:
***************
*** 143,147 ****
def visitSum(self, sum, name, depth):
! if not self.is_simple(sum):
self.sum_with_constructors(sum, name, depth)
--- 143,147 ----
def visitSum(self, sum, name, depth):
! if not is_simple(sum):
self.sum_with_constructors(sum, name, depth)
***************
*** 207,211 ****
def visitSum(self, sum, name):
! if self.is_simple(sum):
pass # XXX
else:
--- 207,211 ----
def visitSum(self, sum, name):
! if is_simple(sum):
pass # XXX
else:
***************
*** 338,347 ****
visitProduct = visitSum = prototype
def find_sequence(fields):
"""Return True if any field uses a sequence."""
for f in fields:
if f.seq:
! return 1
! return 0
class MarshalFunctionVisitor(PickleVisitor):
--- 338,431 ----
visitProduct = visitSum = prototype
+ class FreePrototypeVisitor(PickleVisitor):
+
+ def prototype(self, sum, name):
+ ctype = get_c_type(name)
+ self.emit("void free_%s(%s);" % (name, ctype), 0)
+
+ visitProduct = visitSum = prototype
+
def find_sequence(fields):
"""Return True if any field uses a sequence."""
for f in fields:
if f.seq:
! return True
! return False
!
! def has_sequence(types):
! for t in types:
! if find_sequence(t.fields):
! return True
! return False
!
! class FreeVisitor(PickleVisitor):
!
! def func_begin(self, name, has_seq):
! ctype = get_c_type(name)
! self.emit("void", 0)
! self.emit("free_%s(%s o)" % (name, ctype), 0)
! self.emit("{", 0)
! if has_seq:
! self.emit("int i, n;", 1)
! self.emit("asdl_seq *seq;", 1)
!
! def func_end(self):
! self.emit("}", 0)
! self.emit("", 0)
!
! def visitSum(self, sum, name):
! has_seq = has_sequence(sum.types)
! self.func_begin(name, has_seq)
! if not is_simple(sum):
! self.emit("switch (o->kind) {", 1)
! for i in range(len(sum.types)):
! t = sum.types[i]
! self.visitConstructor(t, i + 1, name)
! self.emit("}", 1)
! self.func_end()
!
! def visitProduct(self, prod, name):
! self.func_begin(name, find_sequence(prod.fields))
! for field in prod.fields:
! self.visitField(field, name, 1, True)
! self.func_end()
!
! def visitConstructor(self, cons, enum, name):
! self.emit("case %s_kind:" % cons.name, 1)
! for f in cons.fields:
! self.visitField(f, cons.name, 2, False)
! self.emit("break;", 2)
!
! def visitField(self, field, name, depth, product):
! def emit(s, d):
! self.emit(s, depth + d)
! if product:
! value = "o->%s" % field.name
! else:
! value = "o->v.%s.%s" % (name, field.name)
! if field.seq:
! emit("seq = %s;" % value, 0)
! emit("n = asdl_seq_LEN(seq);", 0)
! emit("for (i = 0; i < n; i++)", 0)
! self.free(field, "asdl_seq_GET(seq, i)", depth + 1)
!
! # XXX need to know the simple types in advance, so that we
! # don't call free_TYPE() for them.
!
! elif field.opt:
! emit("if (%s)" % value, 0)
! self.free(field, value, depth + 1)
! else:
! self.free(field, value, depth)
!
! def free(self, field, value, depth):
! if str(field.type) in ("identifier", "string"):
! self.emit("Py_DECREF(%s);" % value, depth)
! elif str(field.type) == "bool":
! return
! else:
! print >> sys.stderr, field.type
! self.emit("free_%s(%s);" % (field.type, value), depth)
!
class MarshalFunctionVisitor(PickleVisitor):
***************
*** 362,372 ****
def visitSum(self, sum, name):
! has_seq = 0
! for t in sum.types:
! if find_sequence(t.fields):
! has_seq = 1
! break
self.func_begin(name, has_seq)
! simple = self.is_simple(sum)
if simple:
self.emit("switch (o) {", 1)
--- 446,452 ----
def visitSum(self, sum, name):
! has_seq = has_sequence(sum.types)
self.func_begin(name, has_seq)
! simple = is_simple(sum)
if simple:
self.emit("switch (o) {", 1)
***************
*** 443,446 ****
--- 523,527 ----
StructVisitor(f),
PrototypeVisitor(f),
+ FreePrototypeVisitor(f),
MarshalPrototypeVisitor(f),
)
***************
*** 458,461 ****
--- 539,543 ----
print >> f
v = ChainOfVisitors(FunctionVisitor(f),
+ FreeVisitor(f),
MarshalFunctionVisitor(f),
)
More information about the Python-checkins
mailing list