[Zope-Checkins] CVS: Zope/lib/python/RestrictedPython/compiler - pyassem.py:220.127.116.11
Thu, 9 Aug 2001 13:34:11 -0400
Update of /cvs-repository/Zope/lib/python/RestrictedPython/compiler
In directory cvs.zope.org:/tmp/cvs-serv29115/lib/python/RestrictedPython/compiler
Sync NR-branch with trunk. Sorry about so many checkin messages...
=== Zope/lib/python/RestrictedPython/compiler/pyassem.py 1.2 => 18.104.22.168 ===
- This class builds the lnotab, which is undocumented but described
- by com_set_lineno in compile.c. Here's an attempt at explanation:
+ This class builds the lnotab, which is documented in compile.c.
+ Here's a brief recap:
For each SET_LINENO instruction after the first one, two bytes are
added to lnotab. (In some cases, multiple two-byte entries are
added.) The first byte is the distance in bytes between the
instruction for the last SET_LINENO and the current SET_LINENO.
The second byte is offset in line numbers. If either offset is
- greater than 255, multiple two-byte entries are added -- one entry
- for each factor of 255.
+ greater than 255, multiple two-byte entries are added -- see
+ compile.c for the delicate details.
@@ -657,19 +657,16 @@
# compiler because it only generates a SET_LINENO instruction
# for the assignment.
if line > 0:
- while addr > 0 or line > 0:
- # write the values in 1-byte chunks that sum
- # to desired value
- trunc_addr = addr
- trunc_line = line
- if trunc_addr > 255:
- trunc_addr = 255
- if trunc_line > 255:
- trunc_line = 255
- addr = addr - trunc_addr
- line = line - trunc_line
+ push = self.lnotab.append
+ while addr > 255:
+ push(255); push(0)
+ addr -= 255
+ while line > 255:
+ push(addr); push(255)
+ line -= 255
+ addr = 0
+ if addr > 0 or line > 0:
+ push(addr); push(line)
self.lastline = lineno
self.lastoff = self.codeOffset