Mercurial > cpython-lru_cache-weakref
annotate Python/compile.c @ 38453:29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Inherits test_gzip/test_tarfile failures on 64-bit platforms from the trunk,
but I don't want the merge to hang around too long (even though the regular
p3yk-contributors are/have been busy with other things.)
Merged revisions 45621-46490 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r45621 | george.yoshida | 2006-04-21 18:34:17 +0200 (Fri, 21 Apr 2006) | 2 lines
Correct the grammar
........
r45622 | tim.peters | 2006-04-21 18:34:54 +0200 (Fri, 21 Apr 2006) | 2 lines
Whitespace normalization.
........
r45624 | thomas.heller | 2006-04-21 18:48:56 +0200 (Fri, 21 Apr 2006) | 1 line
Merge in changes from ctypes 0.9.9.6 upstream version.
........
r45625 | thomas.heller | 2006-04-21 18:51:04 +0200 (Fri, 21 Apr 2006) | 1 line
Merge in changes from ctypes 0.9.9.6 upstream version.
........
r45630 | thomas.heller | 2006-04-21 20:29:17 +0200 (Fri, 21 Apr 2006) | 8 lines
Documentation for ctypes.
I think that 'generic operating system services' is the best category.
Note that the Doc/lib/libctypes.latex file is generated from reST sources.
You are welcome to make typo fixes, and I'll try to keep the reST sources
in sync, but markup changes would be lost - they should be fixed in the tool
that creates the latex file.
The conversion script is external/ctypes/docs/manual/mkpydoc.py.
........
r45631 | tim.peters | 2006-04-21 23:18:10 +0200 (Fri, 21 Apr 2006) | 24 lines
SF bug #1473760 TempFile can hang on Windows.
Python 2.4 changed ntpath.abspath to do an import
inside the function. As a result, due to Python's
import lock, anything calling abspath on Windows
(directly, or indirectly like tempfile.TemporaryFile)
hung when it was called from a thread spawned as a
side effect of importing a module.
This is a depressingly frequent problem, and
deserves a more general fix. I'm settling for
a micro-fix here because this specific one accounts
for a report of Zope Corp's ZEO hanging on Windows,
and it was an odd way to change abspath to begin
with (ntpath needs a different implementation
depending on whether we're actually running on
Windows, and the _obvious_ way to arrange for that
is not to bury a possibly-failing import _inside_
the function).
Note that if/when other micro-fixes of this kind
get made, the new Lib/test/threaded_import_hangers.py
is a convenient place to add tests for them.
........
r45634 | phillip.eby | 2006-04-21 23:53:37 +0200 (Fri, 21 Apr 2006) | 2 lines
Guido wrote contextlib, not me, but thanks anyway. ;)
........
r45636 | andrew.kuchling | 2006-04-22 03:51:41 +0200 (Sat, 22 Apr 2006) | 1 line
Typo fixes
........
r45638 | andrew.kuchling | 2006-04-22 03:58:40 +0200 (Sat, 22 Apr 2006) | 1 line
Fix comment typo
........
r45639 | andrew.kuchling | 2006-04-22 04:06:03 +0200 (Sat, 22 Apr 2006) | 8 lines
Make copy of test_mailbox.py. We'll still want to check the backward
compatibility classes in the new mailbox.py that I'll be committing in
a few minutes.
One change has been made: the tests use len(mbox) instead of len(mbox.boxes).
The 'boxes' attribute was never documented and contains some internal state
that seems unlikely to have been useful.
........
r45640 | andrew.kuchling | 2006-04-22 04:32:43 +0200 (Sat, 22 Apr 2006) | 16 lines
Add Gregory K. Johnson's revised version of mailbox.py (funded by
the 2005 Summer of Code).
The revision adds a number of new mailbox classes that support adding
and removing messages; these classes also support mailbox locking and
default to using email.Message instead of rfc822.Message.
The old mailbox classes are largely left alone for backward compatibility.
The exception is the Maildir class, which was present in the old module
and now inherits from the new classes. The Maildir class's interface
is pretty simple, though, so I think it'll be compatible with existing
code.
(The change to the NEWS file also adds a missing word to a different
news item, which unfortunately required rewrapping the line.)
........
r45641 | tim.peters | 2006-04-22 07:52:59 +0200 (Sat, 22 Apr 2006) | 2 lines
Whitespace normalization.
........
r45642 | neal.norwitz | 2006-04-22 08:07:46 +0200 (Sat, 22 Apr 2006) | 1 line
Add libctypes as a dep
........
r45643 | martin.v.loewis | 2006-04-22 13:15:41 +0200 (Sat, 22 Apr 2006) | 1 line
Fix more ssize_t problems.
........
r45644 | martin.v.loewis | 2006-04-22 13:40:03 +0200 (Sat, 22 Apr 2006) | 1 line
Fix more ssize_t issues.
........
r45645 | george.yoshida | 2006-04-22 17:10:49 +0200 (Sat, 22 Apr 2006) | 2 lines
Typo fixes
........
r45647 | martin.v.loewis | 2006-04-22 17:19:54 +0200 (Sat, 22 Apr 2006) | 1 line
Port to Python 2.5. Drop .DEF file. Change output file names to .pyd.
........
r45648 | george.yoshida | 2006-04-22 17:27:14 +0200 (Sat, 22 Apr 2006) | 3 lines
- add versionadded tag
- make arbitrary arguments come last
........
r45649 | hyeshik.chang | 2006-04-22 17:48:15 +0200 (Sat, 22 Apr 2006) | 3 lines
Remove $CJKCodecs$ RCS tags. The CJKCodecs isn't maintained outside
anymore.
........
r45654 | greg.ward | 2006-04-23 05:47:58 +0200 (Sun, 23 Apr 2006) | 2 lines
Update optparse to Optik 1.5.1.
........
r45658 | george.yoshida | 2006-04-23 11:27:10 +0200 (Sun, 23 Apr 2006) | 2 lines
wrap SyntaxError with \exception{}
........
r45660 | ronald.oussoren | 2006-04-23 13:59:25 +0200 (Sun, 23 Apr 2006) | 6 lines
Patch 1471925 - Weak linking support for OSX
This patch causes several symbols in the socket and posix module to be weakly
linked on OSX and disables usage of ftime on OSX. These changes make it possible
to use a binary build on OSX 10.4 on a 10.3 system.
........
r45661 | ronald.oussoren | 2006-04-23 14:36:23 +0200 (Sun, 23 Apr 2006) | 5 lines
Patch 1471761 - test for broken poll at runtime
This patch checks if poll is broken when the select module is loaded instead
of doing so at configure-time. This functionality is only active on Mac OS X.
........
r45662 | nick.coghlan | 2006-04-23 17:13:32 +0200 (Sun, 23 Apr 2006) | 1 line
Add a Context Types section to parallel the Iterator Types section (uses the same terminology as the 2.5a1 implementation)
........
r45663 | nick.coghlan | 2006-04-23 17:14:37 +0200 (Sun, 23 Apr 2006) | 1 line
Update contextlib documentation to use the same terminology as the module implementation
........
r45664 | gerhard.haering | 2006-04-23 17:24:26 +0200 (Sun, 23 Apr 2006) | 2 lines
Updated the sqlite3 module to the external pysqlite 2.2.2 version.
........
r45666 | nick.coghlan | 2006-04-23 17:39:16 +0200 (Sun, 23 Apr 2006) | 1 line
Update with statement documentation to use same terminology as 2.5a1 implementation
........
r45667 | nick.coghlan | 2006-04-23 18:05:04 +0200 (Sun, 23 Apr 2006) | 1 line
Add a (very) brief mention of the with statement to the end of chapter 8
........
r45668 | nick.coghlan | 2006-04-23 18:35:19 +0200 (Sun, 23 Apr 2006) | 1 line
Take 2 on mentioning the with statement, this time without inadvertently killing the Unicode examples
........
r45669 | nick.coghlan | 2006-04-23 19:04:07 +0200 (Sun, 23 Apr 2006) | 1 line
Backdated NEWS entry to record the implementation of PEP 338 for alpha 1
........
r45670 | tim.peters | 2006-04-23 20:13:45 +0200 (Sun, 23 Apr 2006) | 2 lines
Whitespace normalization.
........
r45671 | skip.montanaro | 2006-04-23 21:14:27 +0200 (Sun, 23 Apr 2006) | 1 line
first cut at trace module doc
........
r45672 | skip.montanaro | 2006-04-23 21:26:33 +0200 (Sun, 23 Apr 2006) | 1 line
minor tweak
........
r45673 | skip.montanaro | 2006-04-23 21:30:50 +0200 (Sun, 23 Apr 2006) | 1 line
it's always helpful if the example works...
........
r45674 | skip.montanaro | 2006-04-23 21:32:14 +0200 (Sun, 23 Apr 2006) | 1 line
correct example
........
r45675 | andrew.kuchling | 2006-04-23 23:01:04 +0200 (Sun, 23 Apr 2006) | 1 line
Edits to the PEP 343 section
........
r45676 | andrew.kuchling | 2006-04-23 23:51:10 +0200 (Sun, 23 Apr 2006) | 1 line
Add two items
........
r45677 | tim.peters | 2006-04-24 04:03:16 +0200 (Mon, 24 Apr 2006) | 5 lines
Bug #1337990: clarified that `doctest` does not support examples
requiring both expected output and an exception.
I'll backport to 2.4 next.
........
r45679 | nick.coghlan | 2006-04-24 05:04:43 +0200 (Mon, 24 Apr 2006) | 1 line
Note changes made to PEP 343 related documentation
........
r45681 | nick.coghlan | 2006-04-24 06:17:02 +0200 (Mon, 24 Apr 2006) | 1 line
Change PEP 343 related documentation to use the term context specifier instead of context object
........
r45682 | nick.coghlan | 2006-04-24 06:32:47 +0200 (Mon, 24 Apr 2006) | 1 line
Add unit tests for the -m and -c command line switches
........
r45683 | nick.coghlan | 2006-04-24 06:37:15 +0200 (Mon, 24 Apr 2006) | 1 line
Fix contextlib.nested to cope with exit methods raising and handling exceptions
........
r45685 | nick.coghlan | 2006-04-24 06:59:28 +0200 (Mon, 24 Apr 2006) | 1 line
Fix broken contextlib test from last checkin (I'd've sworn I tested that before checking it in. . .)
........
r45686 | nick.coghlan | 2006-04-24 07:24:26 +0200 (Mon, 24 Apr 2006) | 1 line
Back out new command line tests (broke buildbot)
........
r45687 | nick.coghlan | 2006-04-24 07:52:15 +0200 (Mon, 24 Apr 2006) | 1 line
More reliable version of new command line tests that just checks the exit codes
........
r45688 | thomas.wouters | 2006-04-24 13:37:13 +0200 (Mon, 24 Apr 2006) | 4 lines
Stop test_tcl's testLoadTk from leaking the Tk commands 'loadtk' registers.
........
r45690 | andrew.kuchling | 2006-04-24 16:30:47 +0200 (Mon, 24 Apr 2006) | 2 lines
Edits, using the new term
'context specifier' in a few places
........
r45697 | phillip.eby | 2006-04-24 22:53:13 +0200 (Mon, 24 Apr 2006) | 2 lines
Revert addition of setuptools
........
r45698 | tim.peters | 2006-04-25 00:45:13 +0200 (Tue, 25 Apr 2006) | 2 lines
Whitespace normalization.
........
r45700 | trent.mick | 2006-04-25 02:34:50 +0200 (Tue, 25 Apr 2006) | 4 lines
Put break at correct level so *all* root HKEYs acutally get checked for
an installed VC6. Otherwise only the first such tree gets checked and this
warning doesn't get displayed.
........
r45701 | tim.peters | 2006-04-25 05:31:36 +0200 (Tue, 25 Apr 2006) | 3 lines
Patch #1475231: add a new SKIP doctest option, thanks to
Edward Loper.
........
r45702 | neal.norwitz | 2006-04-25 07:04:35 +0200 (Tue, 25 Apr 2006) | 1 line
versionadded for SKIP
........
r45703 | neal.norwitz | 2006-04-25 07:05:03 +0200 (Tue, 25 Apr 2006) | 1 line
Restore Walters name
........
r45704 | neal.norwitz | 2006-04-25 07:49:42 +0200 (Tue, 25 Apr 2006) | 1 line
Revert previous change, SKIP had a versionadded elsewhere
........
r45706 | nick.coghlan | 2006-04-25 12:56:51 +0200 (Tue, 25 Apr 2006) | 31 lines
Move the PEP 343 documentation and implementation closer to the
terminology in the alpha 1 documentation.
- "context manager" reverts to its alpha 1 definition
- the term "context specifier" goes away entirely
- contextlib.GeneratorContextManager is renamed GeneratorContext
There are still a number of changes relative to alpha 1:
- the expression in the with statement is explicitly called the
"context expression" in the language reference
- the terms 'with statement context', 'context object' or 'with
statement context' are used in several places instead of a bare
'context'. The aim of this is to avoid ambiguity in relation to the
runtime context set up when the block is executed, and the context
objects that already exist in various application domains (such as
decimal.Context)
- contextlib.contextmanager is renamed to contextfactory
This best reflects the nature of the function resulting from the
use of that decorator
- decimal.ContextManager is renamed to WithStatementContext
Simple dropping the 'Manager' part wasn't possible due to the
fact that decimal.Context already exists and means something
different. WithStatementContext is ugly but workable.
A technically unrelated change snuck into this commit:
contextlib.closing now avoids the overhead of creating a
generator, since it's trivial to implement that particular
context manager directly.
........
r45707 | nick.coghlan | 2006-04-25 13:05:56 +0200 (Tue, 25 Apr 2006) | 1 line
Fix latex typo
........
r45708 | thomas.wouters | 2006-04-25 14:28:56 +0200 (Tue, 25 Apr 2006) | 4 lines
Fix markup glitch in unittest docs. Will backport.
........
r45710 | andrew.kuchling | 2006-04-25 14:31:38 +0200 (Tue, 25 Apr 2006) | 1 line
Add two items; easy_install is now off the table, though pkgutil still is
........
r45711 | andrew.kuchling | 2006-04-25 14:47:25 +0200 (Tue, 25 Apr 2006) | 1 line
Rework context terminology
........
r45712 | thomas.wouters | 2006-04-25 15:53:23 +0200 (Tue, 25 Apr 2006) | 9 lines
SF bug/patch #1433877: string parameter to ioctl not null terminated
The new char-array used in ioctl calls wasn't explicitly NUL-terminated;
quite probably the cause for the test_pty failures on Solaris that we
circumvented earlier. (I wasn't able to reproduce it with this patch, but it
has been somewhat elusive to start with.)
........
r45713 | george.yoshida | 2006-04-25 16:09:58 +0200 (Tue, 25 Apr 2006) | 2 lines
minor tweak
........
r45714 | thomas.wouters | 2006-04-25 17:08:10 +0200 (Tue, 25 Apr 2006) | 7 lines
Fix SF bug #1476111: SystemError in socket sendto. The AF_INET6 and
AF_PACKET cases in getsockaddrarg were missing their own checks for
tuple-ness of the address argument, which means a confusing SystemError was
raised by PyArg_ParseTuple instead.
........
r45715 | thomas.wouters | 2006-04-25 17:29:46 +0200 (Tue, 25 Apr 2006) | 10 lines
Define MAXPATHLEN to be at least PATH_MAX, if that's defined. Python uses
MAXPATHLEN-sized buffers for various output-buffers (like to realpath()),
and that's correct on BSD platforms, but not Linux (which uses PATH_MAX, and
does not define MAXPATHLEN.) Cursory googling suggests Linux is following a
newer standard than BSD, but in cases like this, who knows. Using the
greater of PATH_MAX and 1024 as a fallback for MAXPATHLEN seems to be the
most portable solution.
........
r45717 | thomas.heller | 2006-04-25 20:26:08 +0200 (Tue, 25 Apr 2006) | 3 lines
Fix compiler warnings on Darwin.
Patch by Brett Canon, see
https://sourceforge.net/tracker/?func=detail&atid=532156&aid=1475959&group_id=71702
........
r45718 | guido.van.rossum | 2006-04-25 22:12:45 +0200 (Tue, 25 Apr 2006) | 4 lines
Implement MvL's improvement on __context__ in Condition;
this can just call __context__ on the underlying lock.
(The same change for Semaphore does *not* work!)
........
r45721 | tim.peters | 2006-04-26 03:15:53 +0200 (Wed, 26 Apr 2006) | 13 lines
Rev 45706 renamed stuff in contextlib.py, but didn't rename
uses of it in test_with.py. As a result, test_with has been skipped
(due to failing imports) on all buildbot boxes since. Alas, that's
not a test failure -- you have to pay attention to the
1 skip unexpected on PLATFORM:
test_with
kinds of output at the ends of test runs to notice that this got
broken.
It's likely that more renaming in test_with.py would be desirable.
........
r45722 | fred.drake | 2006-04-26 07:15:41 +0200 (Wed, 26 Apr 2006) | 1 line
markup fixes, cleanup
........
r45723 | fred.drake | 2006-04-26 07:19:39 +0200 (Wed, 26 Apr 2006) | 1 line
minor adjustment suggested by Peter Gephardt
........
r45724 | neal.norwitz | 2006-04-26 07:34:03 +0200 (Wed, 26 Apr 2006) | 10 lines
Patch from Aldo Cortesi (OpenBSD buildbot owner).
After the patch (45590) to add extra debug stats to the gc module, Python
was crashing on OpenBSD due to:
Fatal Python error: Interpreter not initialized (version mismatch?)
This seems to occur due to calling collect() when initialized (in pythonrun.c)
is set to 0. Now, the import will occur in the init function which
shouldn't suffer this problem.
........
r45725 | neal.norwitz | 2006-04-26 08:26:12 +0200 (Wed, 26 Apr 2006) | 3 lines
Fix this test on Solaris. There can be embedded \r, so don't just replace
the one at the end.
........
r45727 | nick.coghlan | 2006-04-26 13:50:04 +0200 (Wed, 26 Apr 2006) | 1 line
Fix an error in the last contextlib.closing example
........
r45728 | andrew.kuchling | 2006-04-26 14:21:06 +0200 (Wed, 26 Apr 2006) | 1 line
[Bug #1475080] Fix example
........
r45729 | andrew.kuchling | 2006-04-26 14:23:39 +0200 (Wed, 26 Apr 2006) | 1 line
Add labels to all sections
........
r45730 | thomas.wouters | 2006-04-26 17:53:30 +0200 (Wed, 26 Apr 2006) | 7 lines
The result of SF patch #1471578: big-memory tests for strings, lists and
tuples. Lots to be added, still, but this will give big-memory people
something to play with in 2.5 alpha 2, and hopefully get more people to
write these tests.
........
r45731 | tim.peters | 2006-04-26 19:11:16 +0200 (Wed, 26 Apr 2006) | 2 lines
Whitespace normalization.
........
r45732 | martin.v.loewis | 2006-04-26 19:19:44 +0200 (Wed, 26 Apr 2006) | 1 line
Use GS- and bufferoverlowU.lib where appropriate, for AMD64.
........
r45733 | thomas.wouters | 2006-04-26 20:46:01 +0200 (Wed, 26 Apr 2006) | 5 lines
Add tests for += and *= on strings, and fix the memory-use estimate for the
list.extend tests (they were estimating half the actual use.)
........
r45734 | thomas.wouters | 2006-04-26 21:14:46 +0200 (Wed, 26 Apr 2006) | 5 lines
Some more test-size-estimate fixes: test_append and test_insert trigger a
list resize, which overallocates.
........
r45735 | hyeshik.chang | 2006-04-26 21:20:26 +0200 (Wed, 26 Apr 2006) | 3 lines
Fix build on MIPS for libffi. I haven't tested this yet because I
don't have an access on MIPS machines. Will be tested by buildbot. :)
........
r45737 | fred.drake | 2006-04-27 01:40:32 +0200 (Thu, 27 Apr 2006) | 1 line
one more place to use the current Python version
........
r45738 | fred.drake | 2006-04-27 02:02:24 +0200 (Thu, 27 Apr 2006) | 3 lines
- update version numbers in file names again, until we have a better way
- elaborate instructions for Cygwin support (closes SF #839709)
........
r45739 | fred.drake | 2006-04-27 02:20:14 +0200 (Thu, 27 Apr 2006) | 1 line
add missing word
........
r45740 | anthony.baxter | 2006-04-27 04:11:24 +0200 (Thu, 27 Apr 2006) | 2 lines
2.5a2
........
r45741 | anthony.baxter | 2006-04-27 04:13:13 +0200 (Thu, 27 Apr 2006) | 1 line
2.5a2
........
r45749 | andrew.kuchling | 2006-04-27 14:22:37 +0200 (Thu, 27 Apr 2006) | 1 line
Now that 2.5a2 is out, revert to the current date
........
r45750 | andrew.kuchling | 2006-04-27 14:23:07 +0200 (Thu, 27 Apr 2006) | 1 line
Bump document version
........
r45751 | andrew.kuchling | 2006-04-27 14:34:39 +0200 (Thu, 27 Apr 2006) | 6 lines
[Bug #1477102] Add necessary import to example
This may be a useful style question for the docs -- should examples show
the necessary imports, or should it be assumed that the reader will
figure it out? In the What's New, I'm not consistent but usually opt
for omitting the imports.
........
r45753 | andrew.kuchling | 2006-04-27 14:38:35 +0200 (Thu, 27 Apr 2006) | 1 line
[Bug #1477140] Import Error base class
........
r45754 | andrew.kuchling | 2006-04-27 14:42:54 +0200 (Thu, 27 Apr 2006) | 1 line
Mention the xmlrpclib.Error base class, which is used in one of the examples
........
r45756 | george.yoshida | 2006-04-27 15:41:07 +0200 (Thu, 27 Apr 2006) | 2 lines
markup fix
........
r45757 | thomas.wouters | 2006-04-27 15:46:59 +0200 (Thu, 27 Apr 2006) | 4 lines
Some more size-estimate fixes, for large-list-tests.
........
r45758 | thomas.heller | 2006-04-27 17:50:42 +0200 (Thu, 27 Apr 2006) | 3 lines
Rerun the libffi configuration if any of the files used for that
are newer then fficonfig.py.
........
r45766 | thomas.wouters | 2006-04-28 00:37:50 +0200 (Fri, 28 Apr 2006) | 6 lines
Some style fixes and size-calculation fixes. Also do the small-memory run
using a prime number, rather than a convenient power-of-2-and-multiple-of-5,
so incorrect testing algorithms fail more easily.
........
r45767 | thomas.wouters | 2006-04-28 00:38:32 +0200 (Fri, 28 Apr 2006) | 6 lines
Do the small-memory run of big-meormy tests using a prime number, rather
than a convenient power-of-2-and-multiple-of-5, so incorrect testing
algorithms fail more easily.
........
r45768 | david.goodger | 2006-04-28 00:53:05 +0200 (Fri, 28 Apr 2006) | 1 line
Added SVN access for Steven Bethard and Talin, for PEP updating.
........
r45770 | thomas.wouters | 2006-04-28 01:13:20 +0200 (Fri, 28 Apr 2006) | 16 lines
- Add new Warning class, ImportWarning
- Warn-raise ImportWarning when importing would have picked up a directory
as package, if only it'd had an __init__.py. This swaps two tests (for
case-ness and __init__-ness), but case-test is not really more expensive,
and it's not in a speed-critical section.
- Test for the new warning by importing a common non-package directory on
sys.path: site-packages
- In regrtest.py, silence warnings generated by the build-environment
because Modules/ (which is added to sys.path for Setup-created modules)
has 'zlib' and '_ctypes' directories without __init__.py's.
........
r45771 | thomas.wouters | 2006-04-28 01:41:27 +0200 (Fri, 28 Apr 2006) | 6 lines
Add more ignores of ImportWarnings; these are all just potential triggers
(since they won't trigger if zlib is already sucessfully imported); they
were found by grepping .py files, instead of looking at warning output :)
........
r45773 | neal.norwitz | 2006-04-28 06:32:20 +0200 (Fri, 28 Apr 2006) | 1 line
Add some whitespace to be more consistent.
........
r45774 | neal.norwitz | 2006-04-28 06:34:43 +0200 (Fri, 28 Apr 2006) | 5 lines
Try to really fix the slow buildbots this time.
Printing to stdout, doesn't mean the data was actually written.
It depends on the buffering, so we need to flush. This will hopefully
really fix the buildbots getting killed due to no output on the slow bots.
........
r45775 | neal.norwitz | 2006-04-28 07:28:05 +0200 (Fri, 28 Apr 2006) | 1 line
Fix some warnings on Mac OS X 10.4
........
r45776 | neal.norwitz | 2006-04-28 07:28:30 +0200 (Fri, 28 Apr 2006) | 1 line
Fix a warning on alpha
........
r45777 | neal.norwitz | 2006-04-28 07:28:54 +0200 (Fri, 28 Apr 2006) | 1 line
Fix a warning on ppc (debian)
........
r45778 | george.yoshida | 2006-04-28 18:09:45 +0200 (Fri, 28 Apr 2006) | 2 lines
fix markup glitch
........
r45780 | georg.brandl | 2006-04-28 18:31:17 +0200 (Fri, 28 Apr 2006) | 3 lines
Add SeaMonkey to the list of Mozilla browsers.
........
r45781 | georg.brandl | 2006-04-28 18:36:55 +0200 (Fri, 28 Apr 2006) | 2 lines
Bug #1475009: clarify ntpath.join behavior with absolute components
........
r45783 | george.yoshida | 2006-04-28 18:40:14 +0200 (Fri, 28 Apr 2006) | 2 lines
correct a dead link
........
r45785 | georg.brandl | 2006-04-28 18:54:25 +0200 (Fri, 28 Apr 2006) | 4 lines
Bug #1472949: stringify IOErrors in shutil.copytree when appending
them to the Error errors list.
........
r45786 | georg.brandl | 2006-04-28 18:58:52 +0200 (Fri, 28 Apr 2006) | 3 lines
Bug #1478326: don't allow '/' in distutils.util.get_platform machine names
since this value is used to name the build directory.
........
r45788 | thomas.heller | 2006-04-28 19:02:18 +0200 (Fri, 28 Apr 2006) | 1 line
Remove a duplicated test (the same test is in test_incomplete.py).
........
r45792 | georg.brandl | 2006-04-28 21:09:24 +0200 (Fri, 28 Apr 2006) | 3 lines
Bug #1478429: make datetime.datetime.fromtimestamp accept every float,
possibly "rounding up" to the next whole second.
........
r45796 | george.yoshida | 2006-04-29 04:43:30 +0200 (Sat, 29 Apr 2006) | 2 lines
grammar fix
........
r45800 | ronald.oussoren | 2006-04-29 13:31:35 +0200 (Sat, 29 Apr 2006) | 2 lines
Patch 1471883: --enable-universalsdk on Mac OS X
........
r45801 | andrew.kuchling | 2006-04-29 13:53:15 +0200 (Sat, 29 Apr 2006) | 1 line
Add item
........
r45802 | andrew.kuchling | 2006-04-29 14:10:28 +0200 (Sat, 29 Apr 2006) | 1 line
Make case of 'ZIP' consistent
........
r45803 | andrew.kuchling | 2006-04-29 14:10:43 +0200 (Sat, 29 Apr 2006) | 1 line
Add item
........
r45808 | martin.v.loewis | 2006-04-29 14:37:25 +0200 (Sat, 29 Apr 2006) | 3 lines
Further changes for #1471883: Edit Misc/NEWS, and
add expat_config.h.
........
r45809 | brett.cannon | 2006-04-29 23:29:50 +0200 (Sat, 29 Apr 2006) | 2 lines
Fix docstring for contextfactory; mentioned old contextmanager name.
........
r45810 | gerhard.haering | 2006-04-30 01:12:41 +0200 (Sun, 30 Apr 2006) | 3 lines
This is the start of documentation for the sqlite3 module. Please feel free to
find a better place for the link to it than alongside bsddb & friends.
........
r45811 | andrew.kuchling | 2006-04-30 03:07:09 +0200 (Sun, 30 Apr 2006) | 1 line
Add two items
........
r45814 | george.yoshida | 2006-04-30 05:49:56 +0200 (Sun, 30 Apr 2006) | 2 lines
Use \versionchanged instead of \versionadded for new parameter support.
........
r45815 | georg.brandl | 2006-04-30 09:06:11 +0200 (Sun, 30 Apr 2006) | 2 lines
Patch #1470846: fix urllib2 ProxyBasicAuthHandler.
........
r45817 | georg.brandl | 2006-04-30 10:57:35 +0200 (Sun, 30 Apr 2006) | 3 lines
In stdlib, use hashlib instead of deprecated md5 and sha modules.
........
r45819 | georg.brandl | 2006-04-30 11:23:59 +0200 (Sun, 30 Apr 2006) | 3 lines
Patch #1470976: don't NLST files when retrieving over FTP.
........
r45821 | georg.brandl | 2006-04-30 13:13:56 +0200 (Sun, 30 Apr 2006) | 6 lines
Bug #1473625: stop cPickle making float dumps locale dependent in protocol 0.
On the way, add a decorator to test_support to facilitate running single
test functions in different locales with automatic cleanup.
........
r45822 | phillip.eby | 2006-04-30 17:59:26 +0200 (Sun, 30 Apr 2006) | 2 lines
Fix infinite regress when inspecting <string> or <stdin> frames.
........
r45824 | georg.brandl | 2006-04-30 19:42:26 +0200 (Sun, 30 Apr 2006) | 3 lines
Fix another problem in inspect: if the module for an object cannot be found, don't try to give its __dict__ to linecache.
........
r45825 | georg.brandl | 2006-04-30 20:14:54 +0200 (Sun, 30 Apr 2006) | 3 lines
Patch #1472854: make the rlcompleter.Completer class usable on non-
UNIX platforms.
........
r45826 | georg.brandl | 2006-04-30 21:34:19 +0200 (Sun, 30 Apr 2006) | 3 lines
Patch #1479438: add \keyword markup for "with".
........
r45827 | andrew.kuchling | 2006-04-30 23:19:31 +0200 (Sun, 30 Apr 2006) | 1 line
Add urllib2 HOWTO from Michael Foord
........
r45828 | andrew.kuchling | 2006-04-30 23:19:49 +0200 (Sun, 30 Apr 2006) | 1 line
Add item
........
r45830 | barry.warsaw | 2006-05-01 05:03:02 +0200 (Mon, 01 May 2006) | 11 lines
Port forward from 2.4 branch:
Patch #1464708 from William McVey: fixed handling of nested comments in mail
addresses. E.g.
"Foo ((Foo Bar)) <foo@example.com>"
Fixes for both rfc822.py and email package. This patch needs to be back
ported to Python 2.3 for email 2.5.
........
r45832 | fred.drake | 2006-05-01 08:25:58 +0200 (Mon, 01 May 2006) | 4 lines
- minor clarification in section title
- markup adjustments
(there is clearly much to be done in this section)
........
r45833 | martin.v.loewis | 2006-05-01 08:28:01 +0200 (Mon, 01 May 2006) | 2 lines
Work around deadlock risk. Will backport.
........
r45836 | andrew.kuchling | 2006-05-01 14:45:02 +0200 (Mon, 01 May 2006) | 1 line
Some ElementTree fixes: import from xml, not xmlcore; fix case of module name; mention list() instead of getchildren()
........
r45837 | gerhard.haering | 2006-05-01 17:14:48 +0200 (Mon, 01 May 2006) | 3 lines
Further integration of the documentation for the sqlite3 module. There's still
quite some content to move over from the pysqlite manual, but it's a start now.
........
r45838 | martin.v.loewis | 2006-05-01 17:56:03 +0200 (Mon, 01 May 2006) | 2 lines
Rename uisample to text, drop all non-text tables.
........
r45839 | martin.v.loewis | 2006-05-01 18:12:44 +0200 (Mon, 01 May 2006) | 2 lines
Add msilib documentation.
........
r45840 | martin.v.loewis | 2006-05-01 18:14:16 +0200 (Mon, 01 May 2006) | 4 lines
Rename parameters to match the documentation (which
in turn matches Microsoft's documentation).
Drop unused parameter in CAB.append.
........
r45841 | fred.drake | 2006-05-01 18:28:54 +0200 (Mon, 01 May 2006) | 1 line
add dependency
........
r45842 | andrew.kuchling | 2006-05-01 18:30:25 +0200 (Mon, 01 May 2006) | 1 line
Markup fixes; add some XXX comments noting problems
........
r45843 | andrew.kuchling | 2006-05-01 18:32:49 +0200 (Mon, 01 May 2006) | 1 line
Add item
........
r45844 | andrew.kuchling | 2006-05-01 19:06:54 +0200 (Mon, 01 May 2006) | 1 line
Markup fixes
........
r45850 | neal.norwitz | 2006-05-02 06:43:14 +0200 (Tue, 02 May 2006) | 3 lines
SF #1479181: split open() and file() from being aliases for each other.
........
r45852 | neal.norwitz | 2006-05-02 08:23:22 +0200 (Tue, 02 May 2006) | 1 line
Try to fix breakage caused by patch #1479181, r45850
........
r45853 | fred.drake | 2006-05-02 08:53:59 +0200 (Tue, 02 May 2006) | 3 lines
SF #1479988: add methods to allow access to weakrefs for the
weakref.WeakKeyDictionary and weakref.WeakValueDictionary
........
r45854 | neal.norwitz | 2006-05-02 09:27:47 +0200 (Tue, 02 May 2006) | 5 lines
Fix breakage from patch 1471883 (r45800 & r45808) on OSF/1.
The problem was that pyconfig.h was being included before some system headers
which caused redefinitions and other breakage. This moves system headers
after expat_config.h which includes pyconfig.h.
........
r45855 | vinay.sajip | 2006-05-02 10:35:36 +0200 (Tue, 02 May 2006) | 1 line
Replaced my dumb way of calculating seconds to midnight with Tim Peters' much more sensible suggestion. What was I thinking ?!?
........
r45856 | andrew.kuchling | 2006-05-02 13:30:03 +0200 (Tue, 02 May 2006) | 1 line
Provide encoding as keyword argument; soften warning paragraph about encodings
........
r45858 | guido.van.rossum | 2006-05-02 19:36:09 +0200 (Tue, 02 May 2006) | 2 lines
Fix the formatting of KeyboardInterrupt -- a bad issubclass() call.
........
r45862 | guido.van.rossum | 2006-05-02 21:47:52 +0200 (Tue, 02 May 2006) | 7 lines
Get rid of __context__, per the latest changes to PEP 343 and python-dev
discussion.
There are two places of documentation that still mention __context__:
Doc/lib/libstdtypes.tex -- I wasn't quite sure how to rewrite that without
spending a whole lot of time thinking about it; and whatsnew, which Andrew
usually likes to change himself.
........
r45863 | armin.rigo | 2006-05-02 21:52:32 +0200 (Tue, 02 May 2006) | 4 lines
Documentation bug: PySet_Pop() returns a new reference (because the
caller becomes the owner of that reference).
........
r45864 | guido.van.rossum | 2006-05-02 22:47:36 +0200 (Tue, 02 May 2006) | 4 lines
Hopefully this will fix the spurious failures of test_mailbox.py that I'm
experiencing. (This code and mailbox.py itself are full of calls to file()
that should be calls to open() -- but I'm not fixing those.)
........
r45865 | andrew.kuchling | 2006-05-02 23:44:33 +0200 (Tue, 02 May 2006) | 1 line
Use open() instead of file()
........
r45866 | andrew.kuchling | 2006-05-03 00:47:49 +0200 (Wed, 03 May 2006) | 1 line
Update context manager section for removal of __context__
........
r45867 | fred.drake | 2006-05-03 03:46:52 +0200 (Wed, 03 May 2006) | 1 line
remove unnecessary assignment
........
r45868 | fred.drake | 2006-05-03 03:48:24 +0200 (Wed, 03 May 2006) | 4 lines
tell LaTeX2HTML to:
- use UTF-8 output
- not mess with the >>> prompt!
........
r45869 | fred.drake | 2006-05-03 04:04:40 +0200 (Wed, 03 May 2006) | 3 lines
avoid ugly markup based on the unfortunate conversions of ">>" and "<<" to
guillemets; no need for magic here
........
r45870 | fred.drake | 2006-05-03 04:12:47 +0200 (Wed, 03 May 2006) | 1 line
at least comment on why curly-quotes are not enabled
........
r45871 | fred.drake | 2006-05-03 04:27:40 +0200 (Wed, 03 May 2006) | 1 line
one more place to avoid extra markup
........
r45872 | fred.drake | 2006-05-03 04:29:09 +0200 (Wed, 03 May 2006) | 1 line
one more place to avoid extra markup (how many will there be?)
........
r45873 | fred.drake | 2006-05-03 04:29:39 +0200 (Wed, 03 May 2006) | 1 line
fix up whitespace in prompt strings
........
r45876 | tim.peters | 2006-05-03 06:46:14 +0200 (Wed, 03 May 2006) | 2 lines
Whitespace normalization.
........
r45877 | martin.v.loewis | 2006-05-03 06:52:04 +0200 (Wed, 03 May 2006) | 2 lines
Correct some formulations, fix XXX comments.
........
r45879 | georg.brandl | 2006-05-03 07:05:02 +0200 (Wed, 03 May 2006) | 2 lines
Patch #1480067: don't redirect HTTP digest auth in urllib2
........
r45881 | georg.brandl | 2006-05-03 07:15:10 +0200 (Wed, 03 May 2006) | 3 lines
Move network tests from test_urllib2 to test_urllib2net.
........
r45887 | nick.coghlan | 2006-05-03 15:02:47 +0200 (Wed, 03 May 2006) | 1 line
Finish bringing SVN into line with latest version of PEP 343 by getting rid of all remaining references to context objects that I could find. Without a __context__() method context objects no longer exist. Also get test_with working again, and adopt a suggestion from Neal for decimal.Context.get_manager()
........
r45888 | nick.coghlan | 2006-05-03 15:17:49 +0200 (Wed, 03 May 2006) | 1 line
Get rid of a couple more context object references, fix some markup and clarify what happens when a generator context function swallows an exception.
........
r45889 | georg.brandl | 2006-05-03 19:46:13 +0200 (Wed, 03 May 2006) | 3 lines
Add seamonkey to list of Windows browsers too.
........
r45890 | georg.brandl | 2006-05-03 20:03:22 +0200 (Wed, 03 May 2006) | 3 lines
RFE #1472176: In httplib, don't encode the netloc and hostname with "idna" if not necessary.
........
r45891 | georg.brandl | 2006-05-03 20:12:33 +0200 (Wed, 03 May 2006) | 2 lines
Bug #1472191: convert breakpoint indices to ints before comparing them to ints
........
r45893 | georg.brandl | 2006-05-03 20:18:32 +0200 (Wed, 03 May 2006) | 3 lines
Bug #1385040: don't allow "def foo(a=1, b): pass" in the compiler package.
........
r45894 | thomas.heller | 2006-05-03 20:35:39 +0200 (Wed, 03 May 2006) | 1 line
Don't fail the tests when libglut.so or libgle.so cannot be loaded.
........
r45895 | georg.brandl | 2006-05-04 07:08:10 +0200 (Thu, 04 May 2006) | 2 lines
Bug #1481530: allow "from os.path import ..." with imputil
........
r45897 | martin.v.loewis | 2006-05-04 07:51:03 +0200 (Thu, 04 May 2006) | 2 lines
Patch #1475845: Raise IndentationError for unexpected indent.
........
r45898 | martin.v.loewis | 2006-05-04 12:08:42 +0200 (Thu, 04 May 2006) | 1 line
Implement os.{chdir,rename,rmdir,remove} using Win32 directly.
........
r45899 | martin.v.loewis | 2006-05-04 14:04:27 +0200 (Thu, 04 May 2006) | 2 lines
Drop now-unnecessary arguments to posix_2str.
........
r45900 | martin.v.loewis | 2006-05-04 16:27:52 +0200 (Thu, 04 May 2006) | 1 line
Update checks to consider Windows error numbers.
........
r45913 | thomas.heller | 2006-05-05 20:42:14 +0200 (Fri, 05 May 2006) | 2 lines
Export the 'free' standard C function for use in the test suite.
........
r45914 | thomas.heller | 2006-05-05 20:43:24 +0200 (Fri, 05 May 2006) | 3 lines
Fix memory leaks in the ctypes test suite, reported by valgrind, by
free()ing the memory we allocate.
........
r45915 | thomas.heller | 2006-05-05 20:46:27 +0200 (Fri, 05 May 2006) | 1 line
oops - the function is exported as 'my_free', not 'free'.
........
r45916 | thomas.heller | 2006-05-05 21:14:24 +0200 (Fri, 05 May 2006) | 2 lines
Clean up.
........
r45920 | george.yoshida | 2006-05-06 15:09:45 +0200 (Sat, 06 May 2006) | 2 lines
describe optional arguments for DocFileSuite
........
r45924 | george.yoshida | 2006-05-06 16:16:51 +0200 (Sat, 06 May 2006) | 2 lines
Use \versionchanged for the feature change
........
r45925 | martin.v.loewis | 2006-05-06 18:32:54 +0200 (Sat, 06 May 2006) | 1 line
Port access, chmod, parts of getcwdu, mkdir, and utime to direct Win32 API.
........
r45926 | martin.v.loewis | 2006-05-06 22:04:08 +0200 (Sat, 06 May 2006) | 2 lines
Handle ERROR_ALREADY_EXISTS.
........
r45931 | andrew.kuchling | 2006-05-07 19:12:12 +0200 (Sun, 07 May 2006) | 1 line
[Patch #1479977] Revised version of urllib2 HOWTO, edited by John J. Lee
........
r45932 | andrew.kuchling | 2006-05-07 19:14:53 +0200 (Sun, 07 May 2006) | 1 line
Minor language edit
........
r45934 | georg.brandl | 2006-05-07 22:44:34 +0200 (Sun, 07 May 2006) | 3 lines
Patch #1483395: add new TLDs to cookielib
........
r45936 | martin.v.loewis | 2006-05-08 07:25:56 +0200 (Mon, 08 May 2006) | 2 lines
Add missing PyMem_Free.
........
r45938 | georg.brandl | 2006-05-08 19:28:47 +0200 (Mon, 08 May 2006) | 3 lines
Add test for rev. 45934.
........
r45939 | georg.brandl | 2006-05-08 19:36:08 +0200 (Mon, 08 May 2006) | 3 lines
Patch #1479302: Make urllib2 digest auth and basic auth play together.
........
r45940 | georg.brandl | 2006-05-08 19:48:01 +0200 (Mon, 08 May 2006) | 3 lines
Patch #1478993: take advantage of BaseException/Exception split in cookielib
........
r45941 | neal.norwitz | 2006-05-09 07:38:56 +0200 (Tue, 09 May 2006) | 5 lines
Micro optimization. In the first case, we know that frame->f_exc_type
is NULL, so there's no reason to do anything with it. In the second case,
we know frame->f_exc_type is not NULL, so we can just do an INCREF.
........
r45943 | thomas.heller | 2006-05-09 22:20:15 +0200 (Tue, 09 May 2006) | 2 lines
Disable a test that is unreliable.
........
r45944 | tim.peters | 2006-05-10 04:43:01 +0200 (Wed, 10 May 2006) | 4 lines
Variant of patch #1478292. doctest.register_optionflag(name)
shouldn't create a new flag when `name` is already the name of
an option flag.
........
r45947 | neal.norwitz | 2006-05-10 08:57:58 +0200 (Wed, 10 May 2006) | 14 lines
Fix problems found by Coverity.
longobject.c: also fix an ssize_t problem
<a> could have been NULL, so hoist the size calc to not use <a>.
_ssl.c: under fail: self is DECREF'd, but it would have been NULL.
_elementtree.c: delete self if there was an error.
_csv.c: I'm not sure if lineterminator could have been anything other than
a string. However, other string method calls are checked, so check this
one too.
........
r45948 | thomas.wouters | 2006-05-10 17:04:11 +0200 (Wed, 10 May 2006) | 4 lines
Ignore reflog.txt, too.
........
r45949 | georg.brandl | 2006-05-10 17:59:06 +0200 (Wed, 10 May 2006) | 3 lines
Bug #1482988: indicate more prominently that the Stats class is in the pstats module.
........
r45950 | georg.brandl | 2006-05-10 18:09:03 +0200 (Wed, 10 May 2006) | 2 lines
Bug #1485447: subprocess: document that the "cwd" parameter isn't used to find the executable. Misc. other markup fixes.
........
r45952 | georg.brandl | 2006-05-10 18:11:44 +0200 (Wed, 10 May 2006) | 2 lines
Bug #1484978: curses.panel: clarify that Panel objects are destroyed on garbage collection.
........
r45954 | georg.brandl | 2006-05-10 18:26:03 +0200 (Wed, 10 May 2006) | 4 lines
Patch #1484695: Update the tarfile module to version 0.8. This fixes
a couple of issues, notably handling of long file names using the
GNU LONGNAME extension.
........
r45955 | georg.brandl | 2006-05-10 19:13:20 +0200 (Wed, 10 May 2006) | 4 lines
Patch #721464: pdb.Pdb instances can now be given explicit stdin and
stdout arguments, making it possible to redirect input and output
for remote debugging.
........
r45956 | andrew.kuchling | 2006-05-10 19:19:04 +0200 (Wed, 10 May 2006) | 1 line
Clarify description of exception handling
........
r45957 | georg.brandl | 2006-05-10 22:09:23 +0200 (Wed, 10 May 2006) | 2 lines
Fix two small errors in argument lists.
........
r45960 | brett.cannon | 2006-05-11 07:11:33 +0200 (Thu, 11 May 2006) | 5 lines
Detect if %zd is supported by printf() during configure and sets
PY_FORMAT_SIZE_T appropriately. Removes warnings on
OS X under gcc 4.0.1 when PY_FORMAT_SIZE_T is set to "" instead of "z" as is
needed.
........
r45963 | neal.norwitz | 2006-05-11 09:51:59 +0200 (Thu, 11 May 2006) | 1 line
Don't mask a no memory error with a less meaningful one as discussed on python-checkins
........
r45964 | martin.v.loewis | 2006-05-11 15:28:43 +0200 (Thu, 11 May 2006) | 3 lines
Change WindowsError to carry the Win32 error code in winerror,
and the DOS error code in errno. Revert changes where
WindowsError catch blocks unnecessarily special-case OSError.
........
r45965 | george.yoshida | 2006-05-11 17:53:27 +0200 (Thu, 11 May 2006) | 2 lines
Grammar fix
........
r45967 | andrew.kuchling | 2006-05-11 18:32:24 +0200 (Thu, 11 May 2006) | 1 line
typo fix
........
r45968 | tim.peters | 2006-05-11 18:37:42 +0200 (Thu, 11 May 2006) | 5 lines
BaseThreadedTestCase.setup(): stop special-casing WindowsError.
Rev 45964 fiddled with WindowsError, and broke test_bsddb3 on all
the Windows buildbot slaves as a result. This should repair it.
........
r45969 | georg.brandl | 2006-05-11 21:57:09 +0200 (Thu, 11 May 2006) | 2 lines
Typo fix.
........
r45970 | tim.peters | 2006-05-12 03:57:59 +0200 (Fri, 12 May 2006) | 5 lines
SF patch #1473132: Improve docs for tp_clear and tp_traverse,
by Collin Winter.
Bugfix candidate (but I'm not going to bother).
........
r45974 | martin.v.loewis | 2006-05-12 14:27:28 +0200 (Fri, 12 May 2006) | 4 lines
Dynamically allocate path name buffer for Unicode
path name in listdir. Fixes #1431582.
Stop overallocating MAX_PATH characters for ANSI
path names. Stop assigning to errno.
........
r45975 | martin.v.loewis | 2006-05-12 15:57:36 +0200 (Fri, 12 May 2006) | 1 line
Move icon files into DLLs dir. Fixes #1477968.
........
r45976 | george.yoshida | 2006-05-12 18:40:11 +0200 (Fri, 12 May 2006) | 2 lines
At first there were 6 steps, but one was removed after that.
........
r45977 | martin.v.loewis | 2006-05-12 19:22:04 +0200 (Fri, 12 May 2006) | 1 line
Fix alignment error on Itanium.
........
r45978 | george.yoshida | 2006-05-12 19:25:26 +0200 (Fri, 12 May 2006) | 3 lines
Duplicated description about the illegal continue usage can be found in nearly the same place.
They are same, so keep the original one and remove the later-added one.
........
r45980 | thomas.heller | 2006-05-12 20:16:03 +0200 (Fri, 12 May 2006) | 2 lines
Add missing svn properties.
........
r45981 | thomas.heller | 2006-05-12 20:47:35 +0200 (Fri, 12 May 2006) | 1 line
set svn properties
........
r45982 | thomas.heller | 2006-05-12 21:31:46 +0200 (Fri, 12 May 2006) | 1 line
add svn:eol-style native svn:keywords Id
........
r45987 | gerhard.haering | 2006-05-13 01:49:49 +0200 (Sat, 13 May 2006) | 3 lines
Integrated the rest of the pysqlite reference manual into the Python
documentation. Ready to be reviewed and improved upon.
........
r45988 | george.yoshida | 2006-05-13 08:53:31 +0200 (Sat, 13 May 2006) | 2 lines
Add \exception markup
........
r45990 | martin.v.loewis | 2006-05-13 15:34:04 +0200 (Sat, 13 May 2006) | 2 lines
Revert 43315: Printing of %zd must be signed.
........
r45992 | tim.peters | 2006-05-14 01:28:20 +0200 (Sun, 14 May 2006) | 11 lines
Teach PyString_FromFormat, PyErr_Format, and PyString_FromFormatV
about "%u", "%lu" and "%zu" formats.
Since PyString_FromFormat and PyErr_Format have exactly the same rules
(both inherited from PyString_FromFormatV), it would be good if someone
with more LaTeX Fu changed one of them to just point to the other.
Their docs were way out of synch before this patch, and I just did a
mass copy+paste to repair that.
Not a backport candidate (this is a new feature).
........
r45993 | tim.peters | 2006-05-14 01:31:05 +0200 (Sun, 14 May 2006) | 2 lines
Typo repair.
........
r45994 | tim.peters | 2006-05-14 01:33:19 +0200 (Sun, 14 May 2006) | 2 lines
Remove lie in new comment.
........
r45995 | ronald.oussoren | 2006-05-14 21:56:34 +0200 (Sun, 14 May 2006) | 11 lines
Rework the build system for osx applications:
* Don't use xcodebuild for building PythonLauncher, but use a normal unix
makefile. This makes it a lot easier to use the same build flags as for the
rest of python (e.g. make a universal version of python launcher)
* Convert the mac makefile-s to makefile.in-s and use configure to set makefile
variables instead of forwarding them as command-line arguments
* Add a C version of pythonw, that we you can use '#!/usr/local/bin/pythonw'
* Build IDLE.app using bundlebuilder instead of BuildApplet, that will allow
easier modification of the bundle contents later on.
........
r45996 | ronald.oussoren | 2006-05-14 22:35:41 +0200 (Sun, 14 May 2006) | 6 lines
A first cut at replacing the icons on MacOS X. This replaces all icons by icons
based on the new python.org logo. These are also the first icons that are
"proper" OSX icons.
These icons were created by Jacob Rus.
........
r45997 | ronald.oussoren | 2006-05-14 23:07:41 +0200 (Sun, 14 May 2006) | 3 lines
I missed one small detail in my rewrite of the osx build files: the path
to the Python.app template.
........
r45998 | martin.v.loewis | 2006-05-15 07:51:36 +0200 (Mon, 15 May 2006) | 2 lines
Fix memory leak.
........
r45999 | neal.norwitz | 2006-05-15 08:48:14 +0200 (Mon, 15 May 2006) | 1 line
Move items implemented after a2 into the new a3 section
........
r46000 | neal.norwitz | 2006-05-15 09:04:36 +0200 (Mon, 15 May 2006) | 5 lines
- Bug #1487966: Fix SystemError with conditional expression in assignment
Most of the test_syntax changes are just updating the numbers.
........
r46001 | neal.norwitz | 2006-05-15 09:17:23 +0200 (Mon, 15 May 2006) | 1 line
Patch #1488312, Fix memory alignment problem on SPARC in unicode. Will backport
........
r46003 | martin.v.loewis | 2006-05-15 11:22:27 +0200 (Mon, 15 May 2006) | 3 lines
Remove bogus DECREF of self.
Change __str__() functions to METH_O.
Change WindowsError__str__ to use PyTuple_Pack.
........
r46005 | georg.brandl | 2006-05-15 21:30:35 +0200 (Mon, 15 May 2006) | 3 lines
[ 1488881 ] tarfile.py: support for file-objects and bz2 (cp. #1488634)
........
r46007 | tim.peters | 2006-05-15 22:44:10 +0200 (Mon, 15 May 2006) | 9 lines
ReadDetectFileobjTest: repair Windows disasters by opening
the file object in binary mode.
The Windows buildbot slaves shouldn't swap themselves to death
anymore. However, test_tarfile may still fail because of a
temp directory left behind from a previous failing run.
Windows buildbot owners may need to remove that directory
by hand.
........
r46009 | tim.peters | 2006-05-15 23:32:25 +0200 (Mon, 15 May 2006) | 3 lines
test_directory(): Remove the leftover temp directory that's making
the Windows buildbots fail test_tarfile.
........
r46010 | martin.v.loewis | 2006-05-16 09:05:37 +0200 (Tue, 16 May 2006) | 4 lines
- Test for sys/statvfs.h before including it, as statvfs is present
on some OSX installation, but its header file is not.
Will backport to 2.4
........
r46012 | georg.brandl | 2006-05-16 09:38:27 +0200 (Tue, 16 May 2006) | 3 lines
Patch #1435422: zlib's compress and decompress objects now have a
copy() method.
........
r46015 | andrew.kuchling | 2006-05-16 18:11:54 +0200 (Tue, 16 May 2006) | 1 line
Add item
........
r46016 | andrew.kuchling | 2006-05-16 18:27:31 +0200 (Tue, 16 May 2006) | 3 lines
PEP 243 has been withdrawn, so don't refer to it any more.
The PyPI upload material has been moved into the section on PEP314.
........
r46017 | george.yoshida | 2006-05-16 19:42:16 +0200 (Tue, 16 May 2006) | 2 lines
Update for 'ImportWarning'
........
r46018 | george.yoshida | 2006-05-16 20:07:00 +0200 (Tue, 16 May 2006) | 4 lines
Mention that Exception is now a subclass of BaseException.
Remove a sentence that says that BaseException inherits from BaseException.
(I guess this is just a copy & paste mistake.)
........
r46019 | george.yoshida | 2006-05-16 20:26:10 +0200 (Tue, 16 May 2006) | 2 lines
Document ImportWarning
........
r46020 | tim.peters | 2006-05-17 01:22:20 +0200 (Wed, 17 May 2006) | 2 lines
Whitespace normalization.
........
r46021 | tim.peters | 2006-05-17 01:24:08 +0200 (Wed, 17 May 2006) | 2 lines
Text files missing the SVN eol-style property.
........
r46022 | tim.peters | 2006-05-17 03:30:11 +0200 (Wed, 17 May 2006) | 2 lines
PyZlib_copy(), PyZlib_uncopy(): Repair leaks on the normal-case path.
........
r46023 | georg.brandl | 2006-05-17 16:06:07 +0200 (Wed, 17 May 2006) | 3 lines
Remove misleading comment about type-class unification.
........
r46024 | georg.brandl | 2006-05-17 16:11:36 +0200 (Wed, 17 May 2006) | 3 lines
Apply patch #1489784 from Michael Foord.
........
r46025 | georg.brandl | 2006-05-17 16:18:20 +0200 (Wed, 17 May 2006) | 3 lines
Fix typo in os.utime docstring (patch #1490189)
........
r46026 | georg.brandl | 2006-05-17 16:26:50 +0200 (Wed, 17 May 2006) | 3 lines
Patch #1490224: set time.altzone correctly on Cygwin.
........
r46027 | georg.brandl | 2006-05-17 16:45:06 +0200 (Wed, 17 May 2006) | 4 lines
Add global debug flag to cookielib to avoid heavy dependency on the logging module.
Resolves #1484758.
........
r46028 | georg.brandl | 2006-05-17 16:56:04 +0200 (Wed, 17 May 2006) | 3 lines
Patch #1486962: Several bugs in the turtle Tk demo module were fixed
and several features added, such as speed and geometry control.
........
r46029 | georg.brandl | 2006-05-17 17:17:00 +0200 (Wed, 17 May 2006) | 4 lines
Delay-import some large modules to speed up urllib2 import.
(fixes #1484793).
........
r46030 | georg.brandl | 2006-05-17 17:51:16 +0200 (Wed, 17 May 2006) | 3 lines
Patch #1180296: improve locale string formatting functions
........
r46032 | tim.peters | 2006-05-18 04:06:40 +0200 (Thu, 18 May 2006) | 2 lines
Whitespace normalization.
........
r46033 | georg.brandl | 2006-05-18 08:11:19 +0200 (Thu, 18 May 2006) | 3 lines
Amendments to patch #1484695.
........
r46034 | georg.brandl | 2006-05-18 08:18:06 +0200 (Thu, 18 May 2006) | 3 lines
Remove unused import.
........
r46035 | georg.brandl | 2006-05-18 08:33:27 +0200 (Thu, 18 May 2006) | 3 lines
Fix test_locale for platforms without a default thousands separator.
........
r46036 | neal.norwitz | 2006-05-18 08:51:46 +0200 (Thu, 18 May 2006) | 1 line
Little cleanup
........
r46037 | georg.brandl | 2006-05-18 09:01:27 +0200 (Thu, 18 May 2006) | 4 lines
Bug #1462152: file() now checks more thoroughly for invalid mode
strings and removes a possible "U" before passing the mode to the
C library function.
........
r46038 | georg.brandl | 2006-05-18 09:20:05 +0200 (Thu, 18 May 2006) | 3 lines
Bug #1490688: properly document %e, %f, %g format subtleties.
........
r46039 | vinay.sajip | 2006-05-18 09:28:58 +0200 (Thu, 18 May 2006) | 1 line
Changed status from "beta" to "production"; since logging has been part of the stdlib since 2.3, it should be safe to make this assertion ;-)
........
r46040 | ronald.oussoren | 2006-05-18 11:04:15 +0200 (Thu, 18 May 2006) | 2 lines
Fix some minor issues with the generated application bundles on MacOSX
........
r46041 | andrew.kuchling | 2006-05-19 02:03:55 +0200 (Fri, 19 May 2006) | 1 line
Typo fix; add clarifying word
........
r46044 | neal.norwitz | 2006-05-19 08:31:23 +0200 (Fri, 19 May 2006) | 3 lines
Fix #132 from Coverity, retval could have been derefed
if a continue inside a try failed.
........
r46045 | neal.norwitz | 2006-05-19 08:43:50 +0200 (Fri, 19 May 2006) | 2 lines
Fix #1474677, non-keyword argument following keyword.
........
r46046 | neal.norwitz | 2006-05-19 09:00:58 +0200 (Fri, 19 May 2006) | 4 lines
Bug/Patch #1481770: Use .so extension for shared libraries on HP-UX for ia64.
I suppose this could be backported if anyone cares.
........
r46047 | neal.norwitz | 2006-05-19 09:05:01 +0200 (Fri, 19 May 2006) | 7 lines
Oops, I forgot to include this file in the last commit (46046):
Bug/Patch #1481770: Use .so extension for shared libraries on HP-UX for ia64.
I suppose this could be backported if anyone cares.
........
r46050 | ronald.oussoren | 2006-05-19 20:17:31 +0200 (Fri, 19 May 2006) | 6 lines
* Change working directory to the users home
directory, that makes the file open/save
dialogs more useable.
* Don't use argv emulator, its not needed
for idle.
........
r46052 | tim.peters | 2006-05-19 21:16:34 +0200 (Fri, 19 May 2006) | 2 lines
Whitespace normalization.
........
r46054 | ronald.oussoren | 2006-05-20 08:17:01 +0200 (Sat, 20 May 2006) | 9 lines
Fix bug #1000914 (again).
This patches a file that is generated by bgen, however the code is now the
same as a current copy of bgen would generate. Without this patch most types
in the Carbon.CF module are unusable.
I haven't managed to coax bgen into generating a complete copy of _CFmodule.c
yet :-(, hence the manual patching.
........
r46055 | george.yoshida | 2006-05-20 17:36:19 +0200 (Sat, 20 May 2006) | 3 lines
- markup fix
- add clarifying words
........
r46057 | george.yoshida | 2006-05-20 18:29:14 +0200 (Sat, 20 May 2006) | 3 lines
- Add 'as' and 'with' as new keywords in 2.5.
- Regenerate keyword lists with reswords.py.
........
r46058 | george.yoshida | 2006-05-20 20:07:26 +0200 (Sat, 20 May 2006) | 2 lines
Apply patch #1492147 from Mike Foord.
........
r46059 | andrew.kuchling | 2006-05-20 21:25:16 +0200 (Sat, 20 May 2006) | 1 line
Minor edits
........
r46061 | george.yoshida | 2006-05-21 06:22:59 +0200 (Sun, 21 May 2006) | 2 lines
Fix the TeX compile error.
........
r46062 | george.yoshida | 2006-05-21 06:40:32 +0200 (Sun, 21 May 2006) | 2 lines
Apply patch #1492255 from Mike Foord.
........
r46063 | martin.v.loewis | 2006-05-22 10:48:14 +0200 (Mon, 22 May 2006) | 1 line
Patch 1490384: New Icons for the PC build.
........
r46064 | martin.v.loewis | 2006-05-22 11:15:18 +0200 (Mon, 22 May 2006) | 1 line
Patch #1492356: Port to Windows CE (patch set 1).
........
r46065 | tim.peters | 2006-05-22 13:29:41 +0200 (Mon, 22 May 2006) | 4 lines
Define SIZEOF_{DOUBLE,FLOAT} on Windows. Else
Michael Hudson's nice gimmicks for IEEE special
values (infinities, NaNs) don't work.
........
r46070 | bob.ippolito | 2006-05-22 16:31:24 +0200 (Mon, 22 May 2006) | 2 lines
GzipFile.readline performance improvement (~30-40%), patch #1281707
........
r46071 | bob.ippolito | 2006-05-22 17:22:46 +0200 (Mon, 22 May 2006) | 1 line
Revert gzip readline performance patch #1281707 until a more generic performance improvement can be found
........
r46073 | fredrik.lundh | 2006-05-22 17:35:12 +0200 (Mon, 22 May 2006) | 4 lines
docstring tweaks: count counts non-overlapping substrings, not
total number of occurences
........
r46075 | bob.ippolito | 2006-05-22 17:59:12 +0200 (Mon, 22 May 2006) | 1 line
Apply revised patch for GzipFile.readline performance #1281707
........
r46076 | fredrik.lundh | 2006-05-22 18:29:30 +0200 (Mon, 22 May 2006) | 3 lines
needforspeed: speed up unicode repeat, unicode string copy
........
r46079 | fredrik.lundh | 2006-05-22 19:12:58 +0200 (Mon, 22 May 2006) | 4 lines
needforspeed: use memcpy for "long" strings; use a better algorithm
for long repeats.
........
r46084 | tim.peters | 2006-05-22 21:17:04 +0200 (Mon, 22 May 2006) | 7 lines
PyUnicode_Join(): Recent code changes introduced new
compiler warnings on Windows (signed vs unsigned mismatch
in comparisons). Cleaned that up by switching more locals
to Py_ssize_t. Simplified overflow checking (it can _be_
simpler because while these things are declared as
Py_ssize_t, then should in fact never be negative).
........
r46085 | tim.peters | 2006-05-23 07:47:16 +0200 (Tue, 23 May 2006) | 3 lines
unicode_repeat(): Change type of local to Py_ssize_t,
since that's what it should be.
........
r46094 | fredrik.lundh | 2006-05-23 12:10:57 +0200 (Tue, 23 May 2006) | 3 lines
needforspeed: check first *and* last character before doing a full memcmp
........
r46095 | fredrik.lundh | 2006-05-23 12:12:21 +0200 (Tue, 23 May 2006) | 4 lines
needforspeed: fixed unicode "in" operator to use same implementation
approach as find/index
........
r46096 | richard.jones | 2006-05-23 12:37:38 +0200 (Tue, 23 May 2006) | 7 lines
Merge from rjones-funccall branch.
Applied patch zombie-frames-2.diff from sf patch 876206 with updates for
Python 2.5 and also modified to retain the free_list to avoid the 67%
slow-down in pybench recursion test. 5% speed up in function call pybench.
........
r46098 | ronald.oussoren | 2006-05-23 13:04:24 +0200 (Tue, 23 May 2006) | 2 lines
Avoid creating a mess when installing a framework for the second time.
........
r46101 | georg.brandl | 2006-05-23 13:17:21 +0200 (Tue, 23 May 2006) | 3 lines
PyErr_NewException now accepts a tuple of base classes as its
"base" parameter.
........
r46103 | ronald.oussoren | 2006-05-23 13:47:16 +0200 (Tue, 23 May 2006) | 3 lines
Disable linking extensions with -lpython2.5 for darwin. This should fix bug
#1487105.
........
r46104 | ronald.oussoren | 2006-05-23 14:01:11 +0200 (Tue, 23 May 2006) | 6 lines
Patch #1488098.
This patchs makes it possible to create a universal build on OSX 10.4 and use
the result to build extensions on 10.3. It also makes it possible to override
the '-arch' and '-isysroot' compiler arguments for specific extensions.
........
r46108 | andrew.kuchling | 2006-05-23 14:44:36 +0200 (Tue, 23 May 2006) | 1 line
Add some items; mention the sprint
........
r46109 | andrew.kuchling | 2006-05-23 14:47:01 +0200 (Tue, 23 May 2006) | 1 line
Mention string improvements
........
r46110 | andrew.kuchling | 2006-05-23 14:49:35 +0200 (Tue, 23 May 2006) | 4 lines
Use 'speed' instead of 'performance', because I agree with the argument
at http://zestyping.livejournal.com/193260.html that 'erformance' really means
something more general.
........
r46113 | ronald.oussoren | 2006-05-23 17:09:57 +0200 (Tue, 23 May 2006) | 2 lines
An improved script for building the binary distribution on MacOSX.
........
r46128 | richard.jones | 2006-05-23 20:28:17 +0200 (Tue, 23 May 2006) | 3 lines
Applied patch 1337051 by Neal Norwitz, saving 4 ints on frame objects.
........
r46129 | richard.jones | 2006-05-23 20:32:11 +0200 (Tue, 23 May 2006) | 1 line
fix broken merge
........
r46130 | bob.ippolito | 2006-05-23 20:41:17 +0200 (Tue, 23 May 2006) | 1 line
Update Misc/NEWS for gzip patch #1281707
........
r46131 | bob.ippolito | 2006-05-23 20:43:47 +0200 (Tue, 23 May 2006) | 1 line
Update Misc/NEWS for gzip patch #1281707
........
r46132 | fredrik.lundh | 2006-05-23 20:44:25 +0200 (Tue, 23 May 2006) | 7 lines
needforspeed: use append+reverse for rsplit, use "bloom filters" to
speed up splitlines and strip with charsets; etc. rsplit is now as
fast as split in all our tests (reverse takes no time at all), and
splitlines() is nearly as fast as a plain split("\n") in our tests.
and we're not done yet... ;-)
........
r46133 | tim.peters | 2006-05-23 20:45:30 +0200 (Tue, 23 May 2006) | 38 lines
Bug #1334662 / patch #1335972: int(string, base) wrong answers.
In rare cases of strings specifying true values near sys.maxint,
and oddball bases (not decimal or a power of 2), int(string, base)
could deliver insane answers. This repairs all such problems, and
also speeds string->int significantly. On my box, here are %
speedups for decimal strings of various lengths:
length speedup
------ -------
1 12.4%
2 15.7%
3 20.6%
4 28.1%
5 33.2%
6 37.5%
7 41.9%
8 46.3%
9 51.2%
10 19.5%
11 19.9%
12 23.9%
13 23.7%
14 23.3%
15 24.9%
16 25.3%
17 28.3%
18 27.9%
19 35.7%
Note that the difference between 9 and 10 is the difference between
short and long Python ints on a 32-bit box. The patch doesn't
actually do anything to speed conversion to long: the speedup is
due to detecting "unsigned long" overflow more quickly.
This is a bugfix candidate, but it's a non-trivial patch and it
would be painful to separate the "bug fix" from the "speed up" parts.
........
r46134 | bob.ippolito | 2006-05-23 20:46:41 +0200 (Tue, 23 May 2006) | 1 line
Patch #1493701: performance enhancements for struct module.
........
r46136 | andrew.kuchling | 2006-05-23 21:00:45 +0200 (Tue, 23 May 2006) | 1 line
Remove duplicate item
........
r46141 | bob.ippolito | 2006-05-23 21:09:51 +0200 (Tue, 23 May 2006) | 1 line
revert #1493701
........
r46142 | bob.ippolito | 2006-05-23 21:11:34 +0200 (Tue, 23 May 2006) | 1 line
patch #1493701: performance enhancements for struct module
........
r46144 | bob.ippolito | 2006-05-23 21:12:41 +0200 (Tue, 23 May 2006) | 1 line
patch #1493701: performance enhancements for struct module
........
r46148 | bob.ippolito | 2006-05-23 21:25:52 +0200 (Tue, 23 May 2006) | 1 line
fix linking issue, warnings, in struct
........
r46149 | andrew.kuchling | 2006-05-23 21:29:38 +0200 (Tue, 23 May 2006) | 1 line
Add two items
........
r46150 | bob.ippolito | 2006-05-23 21:31:23 +0200 (Tue, 23 May 2006) | 1 line
forward declaration for PyStructType
........
r46151 | bob.ippolito | 2006-05-23 21:32:25 +0200 (Tue, 23 May 2006) | 1 line
fix typo in _struct
........
r46152 | andrew.kuchling | 2006-05-23 21:32:35 +0200 (Tue, 23 May 2006) | 1 line
Add item
........
r46153 | tim.peters | 2006-05-23 21:34:37 +0200 (Tue, 23 May 2006) | 3 lines
Get the Windows build working again (recover from
`struct` module changes).
........
r46155 | fredrik.lundh | 2006-05-23 21:47:35 +0200 (Tue, 23 May 2006) | 3 lines
return 0 on misses, not -1.
........
r46156 | tim.peters | 2006-05-23 23:51:35 +0200 (Tue, 23 May 2006) | 4 lines
test_struct grew weird behavior under regrtest.py -R,
due to a module-level cache. Clearing the cache should
make it stop showing up in refleak reports.
........
r46157 | tim.peters | 2006-05-23 23:54:23 +0200 (Tue, 23 May 2006) | 2 lines
Whitespace normalization.
........
r46158 | tim.peters | 2006-05-23 23:55:53 +0200 (Tue, 23 May 2006) | 2 lines
Add missing svn:eol-style property to text files.
........
r46161 | fredrik.lundh | 2006-05-24 12:20:36 +0200 (Wed, 24 May 2006) | 3 lines
use Py_ssize_t for string indexes (thanks, neal!)
........
r46173 | fredrik.lundh | 2006-05-24 16:28:11 +0200 (Wed, 24 May 2006) | 14 lines
needforspeed: use "fastsearch" for count and findstring helpers. this
results in a 2.5x speedup on the stringbench count tests, and a 20x (!)
speedup on the stringbench search/find/contains test, compared to 2.5a2.
for more on the algorithm, see:
http://effbot.org/zone/stringlib.htm
if you get weird results, you can disable the new algoritm by undefining
USE_FAST in Objects/unicodeobject.c.
enjoy /F
........
r46182 | fredrik.lundh | 2006-05-24 17:11:01 +0200 (Wed, 24 May 2006) | 3 lines
needforspeedindeed: use fastsearch also for __contains__
........
r46184 | bob.ippolito | 2006-05-24 17:32:06 +0200 (Wed, 24 May 2006) | 1 line
refactor unpack, add unpack_from
........
r46189 | fredrik.lundh | 2006-05-24 18:35:18 +0200 (Wed, 24 May 2006) | 4 lines
needforspeed: refactored the replace code slightly; special-case
constant-length changes; use fastsearch to locate the first match.
........
r46198 | andrew.dalke | 2006-05-24 20:55:37 +0200 (Wed, 24 May 2006) | 10 lines
Added a slew of test for string replace, based various corner cases from
the Need For Speed sprint coding. Includes commented out overflow tests
which will be uncommented once the code is fixed.
This test will break the 8-bit string tests because
"".replace("", "A") == "" when it should == "A"
We have a fix for it, which should be added tomorrow.
........
r46200 | tim.peters | 2006-05-24 22:27:18 +0200 (Wed, 24 May 2006) | 2 lines
We can't leave the checked-in tests broken.
........
r46201 | tim.peters | 2006-05-24 22:29:44 +0200 (Wed, 24 May 2006) | 2 lines
Whitespace normalization.
........
r46202 | tim.peters | 2006-05-24 23:00:45 +0200 (Wed, 24 May 2006) | 4 lines
Disable the damn empty-string replace test -- it can't
be make to pass now for unicode if it passes for str, or
vice versa.
........
r46203 | tim.peters | 2006-05-24 23:10:40 +0200 (Wed, 24 May 2006) | 58 lines
Heavily fiddled variant of patch #1442927: PyLong_FromString optimization.
``long(str, base)`` is now up to 6x faster for non-power-of-2 bases. The
largest speedup is for inputs with about 1000 decimal digits. Conversion
from non-power-of-2 bases remains quadratic-time in the number of input
digits (it was and remains linear-time for bases 2, 4, 8, 16 and 32).
Speedups at various lengths for decimal inputs, comparing 2.4.3 with
current trunk. Note that it's actually a bit slower for 1-digit strings:
len speedup
---- -------
1 -4.5%
2 4.6%
3 8.3%
4 12.7%
5 16.9%
6 28.6%
7 35.5%
8 44.3%
9 46.6%
10 55.3%
11 65.7%
12 77.7%
13 73.4%
14 75.3%
15 85.2%
16 103.0%
17 95.1%
18 112.8%
19 117.9%
20 128.3%
30 174.5%
40 209.3%
50 236.3%
60 254.3%
70 262.9%
80 295.8%
90 297.3%
100 324.5%
200 374.6%
300 403.1%
400 391.1%
500 388.7%
600 440.6%
700 468.7%
800 498.0%
900 507.2%
1000 501.2%
2000 450.2%
3000 463.2%
4000 452.5%
5000 440.6%
6000 439.6%
7000 424.8%
8000 418.1%
9000 417.7%
........
r46204 | andrew.kuchling | 2006-05-25 02:23:03 +0200 (Thu, 25 May 2006) | 1 line
Minor edits; add an item
........
r46205 | fred.drake | 2006-05-25 04:42:25 +0200 (Thu, 25 May 2006) | 3 lines
fix broken links in PDF
(SF patch #1281291, contributed by Rory Yorke)
........
r46208 | walter.doerwald | 2006-05-25 10:53:28 +0200 (Thu, 25 May 2006) | 2 lines
Replace tab inside comment with space.
........
r46209 | thomas.wouters | 2006-05-25 13:25:51 +0200 (Thu, 25 May 2006) | 4 lines
Fix #1488915, Multiple dots in relative import statement raise SyntaxError.
........
r46210 | thomas.wouters | 2006-05-25 13:26:25 +0200 (Thu, 25 May 2006) | 5 lines
Update graminit.c for the fix for #1488915, Multiple dots in relative import
statement raise SyntaxError, and add testcase.
........
r46211 | andrew.kuchling | 2006-05-25 14:27:59 +0200 (Thu, 25 May 2006) | 1 line
Add entry; and fix a typo
........
r46214 | fredrik.lundh | 2006-05-25 17:22:03 +0200 (Thu, 25 May 2006) | 7 lines
needforspeed: speed up upper and lower for 8-bit string objects.
(the unicode versions of these are still 2x faster on windows,
though...)
based on work by Andrew Dalke, with tweaks by yours truly.
........
r46216 | fredrik.lundh | 2006-05-25 17:49:45 +0200 (Thu, 25 May 2006) | 5 lines
needforspeed: make new upper/lower work properly for single-character
strings too... (thanks to georg brandl for spotting the exact problem
faster than anyone else)
........
r46217 | kristjan.jonsson | 2006-05-25 17:53:30 +0200 (Thu, 25 May 2006) | 1 line
Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and it is more efficient than to use !Py_IS_INFINITE(X) && !Py_IS_NAN(X). No change on other platforms
........
r46219 | fredrik.lundh | 2006-05-25 18:10:12 +0200 (Thu, 25 May 2006) | 4 lines
needforspeed: _toupper/_tolower is a SUSv2 thing; fall back on ISO C
versions if they're not defined.
........
r46220 | andrew.kuchling | 2006-05-25 18:23:15 +0200 (Thu, 25 May 2006) | 1 line
Fix comment typos
........
r46221 | andrew.dalke | 2006-05-25 18:30:52 +0200 (Thu, 25 May 2006) | 2 lines
Added tests for implementation error we came up with in the need for speed sprint.
........
r46222 | andrew.kuchling | 2006-05-25 18:34:54 +0200 (Thu, 25 May 2006) | 1 line
Fix another typo
........
r46223 | kristjan.jonsson | 2006-05-25 18:39:27 +0200 (Thu, 25 May 2006) | 1 line
Fix incorrect documentation for the Py_IS_FINITE(X) macro.
........
r46224 | fredrik.lundh | 2006-05-25 18:46:54 +0200 (Thu, 25 May 2006) | 3 lines
needforspeed: check for overflow in replace (from Andrew Dalke)
........
r46226 | fredrik.lundh | 2006-05-25 19:08:14 +0200 (Thu, 25 May 2006) | 5 lines
needforspeed: new replace implementation by Andrew Dalke. replace is
now about 3x faster on my machine, for the replace tests from string-
bench.
........
r46227 | tim.peters | 2006-05-25 19:34:03 +0200 (Thu, 25 May 2006) | 5 lines
A new table to help string->integer conversion was added yesterday to
both mystrtoul.c and longobject.c. Share the table instead. Also
cut its size by 64 entries (they had been used for an inscrutable
trick originally, but the code no longer tries to use that trick).
........
r46229 | andrew.dalke | 2006-05-25 19:53:00 +0200 (Thu, 25 May 2006) | 11 lines
Fixed problem identified by Georg. The special-case in-place code for replace
made a copy of the string using PyString_FromStringAndSize(s, n) and modify
the copied string in-place. However, 1 (and 0) character strings are shared
from a cache. This cause "A".replace("A", "a") to change the cached version
of "A" -- used by everyone.
Now may the copy with NULL as the string and do the memcpy manually. I've
added regression tests to check if this happens in the future. Perhaps
there should be a PyString_Copy for this case?
........
r46230 | fredrik.lundh | 2006-05-25 19:55:31 +0200 (Thu, 25 May 2006) | 4 lines
needforspeed: use "fastsearch" for count. this results in a 3x speedup
for the related stringbench tests.
........
r46231 | andrew.dalke | 2006-05-25 20:03:25 +0200 (Thu, 25 May 2006) | 4 lines
Code had returned an ssize_t, upcast to long, then converted with PyInt_FromLong.
Now using PyInt_FromSsize_t.
........
r46233 | andrew.kuchling | 2006-05-25 20:11:16 +0200 (Thu, 25 May 2006) | 1 line
Comment typo
........
r46234 | andrew.dalke | 2006-05-25 20:18:39 +0200 (Thu, 25 May 2006) | 4 lines
Added overflow test for adding two (very) large strings where the
new string is over max Py_ssize_t. I have no way to test it on my
box or any box I have access to. At least it doesn't break anything.
........
r46235 | bob.ippolito | 2006-05-25 20:20:23 +0200 (Thu, 25 May 2006) | 1 line
Faster path for PyLong_FromLongLong, using PyLong_FromLong algorithm
........
r46238 | georg.brandl | 2006-05-25 20:44:09 +0200 (Thu, 25 May 2006) | 3 lines
Guard the _active.remove() call to avoid errors when there is no _active list.
........
r46239 | fredrik.lundh | 2006-05-25 20:44:29 +0200 (Thu, 25 May 2006) | 4 lines
needforspeed: use fastsearch also for find/index and contains. the
related tests are now about 10x faster.
........
r46240 | bob.ippolito | 2006-05-25 20:44:50 +0200 (Thu, 25 May 2006) | 1 line
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
........
r46241 | jack.diederich | 2006-05-25 20:47:15 +0200 (Thu, 25 May 2006) | 1 line
* eliminate warning by reverting tmp_s type to 'const char*'
........
r46242 | bob.ippolito | 2006-05-25 21:03:19 +0200 (Thu, 25 May 2006) | 1 line
Fix Cygwin compiler issue
........
r46243 | bob.ippolito | 2006-05-25 21:15:27 +0200 (Thu, 25 May 2006) | 1 line
fix a struct regression where long would be returned for short unsigned integers
........
r46244 | georg.brandl | 2006-05-25 21:15:31 +0200 (Thu, 25 May 2006) | 4 lines
Replace PyObject_CallFunction calls with only object args
with PyObject_CallFunctionObjArgs, which is 30% faster.
........
r46245 | fredrik.lundh | 2006-05-25 21:19:05 +0200 (Thu, 25 May 2006) | 3 lines
needforspeed: use insert+reverse instead of append
........
r46246 | bob.ippolito | 2006-05-25 21:33:38 +0200 (Thu, 25 May 2006) | 1 line
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
........
r46248 | bob.ippolito | 2006-05-25 21:56:56 +0200 (Thu, 25 May 2006) | 1 line
Use faster struct pack/unpack functions for the endian table that matches the host's
........
r46249 | bob.ippolito | 2006-05-25 21:59:56 +0200 (Thu, 25 May 2006) | 1 line
enable darwin/x86 support for libffi and hence ctypes (doesn't yet support --enable-universalsdk)
........
r46252 | georg.brandl | 2006-05-25 22:28:10 +0200 (Thu, 25 May 2006) | 4 lines
Someone seems to just have copy-pasted the docs of
tp_compare to tp_richcompare ;)
........
r46253 | brett.cannon | 2006-05-25 22:44:08 +0200 (Thu, 25 May 2006) | 2 lines
Swap out bare malloc()/free() use for PyMem_MALLOC()/PyMem_FREE() .
........
r46254 | bob.ippolito | 2006-05-25 22:52:38 +0200 (Thu, 25 May 2006) | 1 line
squelch gcc4 darwin/x86 compiler warnings
........
r46255 | bob.ippolito | 2006-05-25 23:09:45 +0200 (Thu, 25 May 2006) | 1 line
fix test_float regression and 64-bit size mismatch issue
........
r46256 | georg.brandl | 2006-05-25 23:11:56 +0200 (Thu, 25 May 2006) | 3 lines
Add a x-ref to newer calling APIs.
........
r46257 | ronald.oussoren | 2006-05-25 23:30:54 +0200 (Thu, 25 May 2006) | 2 lines
Fix minor typo in prep_cif.c
........
r46259 | brett.cannon | 2006-05-25 23:33:11 +0200 (Thu, 25 May 2006) | 4 lines
Change test_values so that it compares the lowercasing of group names since getgrall() can return all lowercase names while getgrgid() returns proper casing.
Discovered on Ubuntu 5.04 (custom).
........
r46261 | tim.peters | 2006-05-25 23:50:17 +0200 (Thu, 25 May 2006) | 7 lines
Some Win64 pre-release in 2000 didn't support
QueryPerformanceCounter(), but we believe Win64 does
support it now. So use in time.clock().
It would be peachy if someone with a Win64 box tried
this ;-)
........
r46262 | tim.peters | 2006-05-25 23:52:19 +0200 (Thu, 25 May 2006) | 2 lines
Whitespace normalization.
........
r46263 | bob.ippolito | 2006-05-25 23:58:05 +0200 (Thu, 25 May 2006) | 1 line
Add missing files from x86 darwin ctypes patch
........
r46264 | brett.cannon | 2006-05-26 00:00:14 +0200 (Fri, 26 May 2006) | 2 lines
Move over to use of METH_O and METH_NOARGS.
........
r46265 | tim.peters | 2006-05-26 00:25:25 +0200 (Fri, 26 May 2006) | 3 lines
Repair idiot typo, and complete the job of trying to
use the Windows time.clock() implementation on Win64.
........
r46266 | tim.peters | 2006-05-26 00:28:46 +0200 (Fri, 26 May 2006) | 9 lines
Patch #1494387: SVN longobject.c compiler warnings
The SIGCHECK macro defined here has always been bizarre, but
it apparently causes compiler warnings on "Sun Studio 11".
I believe the warnings are bogus, but it doesn't hurt to make
the macro definition saner.
Bugfix candidate (but I'm not going to bother).
........
r46268 | fredrik.lundh | 2006-05-26 01:27:53 +0200 (Fri, 26 May 2006) | 8 lines
needforspeed: partition for 8-bit strings. for some simple tests,
this is on par with a corresponding find, and nearly twice as fast
as split(sep, 1)
full tests, a unicode version, and documentation will follow to-
morrow.
........
r46271 | andrew.kuchling | 2006-05-26 03:46:22 +0200 (Fri, 26 May 2006) | 1 line
Add Soc student
........
r46272 | ronald.oussoren | 2006-05-26 10:41:25 +0200 (Fri, 26 May 2006) | 3 lines
Without this patch OSX users couldn't add new help sources because the code
tried to update one item in a tuple.
........
r46273 | fredrik.lundh | 2006-05-26 10:54:28 +0200 (Fri, 26 May 2006) | 5 lines
needforspeed: partition implementation, part two.
feel free to improve the documentation and the docstrings.
........
r46274 | georg.brandl | 2006-05-26 11:05:54 +0200 (Fri, 26 May 2006) | 3 lines
Clarify docs for str.partition().
........
r46278 | fredrik.lundh | 2006-05-26 11:46:59 +0200 (Fri, 26 May 2006) | 5 lines
needforspeed: use METH_O for argument handling, which made partition some
~15% faster for the current tests (which is noticable faster than a corre-
sponding find call). thanks to neal-who-never-sleeps for the tip.
........
r46280 | fredrik.lundh | 2006-05-26 12:27:17 +0200 (Fri, 26 May 2006) | 5 lines
needforspeed: use Py_ssize_t for the fastsearch counter and skip
length (thanks, neal!). and yes, I've verified that this doesn't
slow things down ;-)
........
r46285 | andrew.dalke | 2006-05-26 13:11:38 +0200 (Fri, 26 May 2006) | 2 lines
Added a few more test cases for whitespace split. These strings have leading whitespace.
........
r46286 | jack.diederich | 2006-05-26 13:15:17 +0200 (Fri, 26 May 2006) | 1 line
use Py_ssize_t in places that may need it
........
r46287 | andrew.dalke | 2006-05-26 13:15:22 +0200 (Fri, 26 May 2006) | 2 lines
Added split whitespace checks for characters other than space.
........
r46288 | ronald.oussoren | 2006-05-26 13:17:55 +0200 (Fri, 26 May 2006) | 2 lines
Fix buglet in postinstall script, it would generate an invalid .cshrc file.
........
r46290 | georg.brandl | 2006-05-26 13:26:11 +0200 (Fri, 26 May 2006) | 3 lines
Add "partition" to UserString.
........
r46291 | fredrik.lundh | 2006-05-26 13:29:39 +0200 (Fri, 26 May 2006) | 5 lines
needforspeed: added Py_LOCAL macro, based on the LOCAL macro used
for SRE and others. applied Py_LOCAL to relevant portion of ceval,
which gives a 1-2% speedup on my machine. ymmv.
........
r46292 | jack.diederich | 2006-05-26 13:37:20 +0200 (Fri, 26 May 2006) | 1 line
when generating python code prefer to generate valid python code
........
r46293 | fredrik.lundh | 2006-05-26 13:38:15 +0200 (Fri, 26 May 2006) | 3 lines
use Py_LOCAL also for string and unicode objects
........
r46294 | ronald.oussoren | 2006-05-26 13:38:39 +0200 (Fri, 26 May 2006) | 12 lines
- Search the sqlite specific search directories
after the normal include directories when looking
for the version of sqlite to use.
- On OSX:
* Extract additional include and link directories
from the CFLAGS and LDFLAGS, if the user has
bothered to specify them we might as wel use them.
* Add '-Wl,-search_paths_first' to the extra_link_args
for readline and sqlite. This makes it possible to
use a static library to override the system provided
dynamic library.
........
r46295 | ronald.oussoren | 2006-05-26 13:43:26 +0200 (Fri, 26 May 2006) | 6 lines
Integrate installing a framework in the 'make install'
target. Until now users had to use 'make frameworkinstall'
to install python when it is configured with '--enable-framework'.
This tends to confuse users that don't hunt for readme files
hidden in platform specific directories :-)
........
r46297 | fredrik.lundh | 2006-05-26 13:54:04 +0200 (Fri, 26 May 2006) | 4 lines
needforspeed: added PY_LOCAL_AGGRESSIVE macro to enable "aggressive"
LOCAL inlining; also added some missing whitespace
........
r46298 | andrew.kuchling | 2006-05-26 14:01:44 +0200 (Fri, 26 May 2006) | 1 line
Typo fixes
........
r46299 | fredrik.lundh | 2006-05-26 14:01:49 +0200 (Fri, 26 May 2006) | 4 lines
Py_LOCAL shouldn't be used for data; it works for some .NET 2003 compilers,
but Trent's copy thinks that it's an anachronism...
........
r46300 | martin.blais | 2006-05-26 14:03:27 +0200 (Fri, 26 May 2006) | 12 lines
Support for buffer protocol for socket and struct.
* Added socket.recv_buf() and socket.recvfrom_buf() methods, that use the buffer
protocol (send and sendto already did).
* Added struct.pack_to(), that is the corresponding buffer compatible method to
unpack_from().
* Fixed minor typos in arraymodule.
........
r46302 | ronald.oussoren | 2006-05-26 14:23:20 +0200 (Fri, 26 May 2006) | 6 lines
- Remove previous version of the binary distribution script for OSX
- Some small bugfixes for the IDLE.app wrapper
- Tweaks to build-installer to ensure that python gets build in the right way,
including sqlite3.
- Updated readme files
........
r46305 | tim.peters | 2006-05-26 14:26:21 +0200 (Fri, 26 May 2006) | 2 lines
Whitespace normalization.
........
r46307 | andrew.dalke | 2006-05-26 14:28:15 +0200 (Fri, 26 May 2006) | 7 lines
I like tests.
The new split functions use a preallocated list. Added tests which exceed
the preallocation size, to exercise list appends/resizes.
Also added more edge case tests.
........
r46308 | andrew.dalke | 2006-05-26 14:31:00 +0200 (Fri, 26 May 2006) | 2 lines
Test cases for off-by-one errors in string split with multicharacter pattern.
........
r46309 | tim.peters | 2006-05-26 14:31:20 +0200 (Fri, 26 May 2006) | 2 lines
Whitespace normalization.
........
r46313 | andrew.kuchling | 2006-05-26 14:39:48 +0200 (Fri, 26 May 2006) | 1 line
Add str.partition()
........
r46314 | bob.ippolito | 2006-05-26 14:52:53 +0200 (Fri, 26 May 2006) | 1 line
quick hack to fix busted binhex test
........
r46316 | andrew.dalke | 2006-05-26 15:05:55 +0200 (Fri, 26 May 2006) | 2 lines
Added more rstrip tests, including for prealloc'ed arrays
........
r46320 | bob.ippolito | 2006-05-26 15:15:44 +0200 (Fri, 26 May 2006) | 1 line
fix #1229380 No struct.pack exception for some out of range integers
........
r46325 | tim.peters | 2006-05-26 15:39:17 +0200 (Fri, 26 May 2006) | 2 lines
Use open() to open files (was using file()).
........
r46327 | andrew.dalke | 2006-05-26 16:00:45 +0200 (Fri, 26 May 2006) | 37 lines
Changes to string.split/rsplit on whitespace to preallocate space in the
results list.
Originally it allocated 0 items and used the list growth during append. Now
it preallocates 12 items so the first few appends don't need list reallocs.
("Here are some words ."*2).split(None, 1) is 7% faster
("Here are some words ."*2).split() is is 15% faster
(Your milage may vary, see dealership for details.)
File parsing like this
for line in f:
count += len(line.split())
is also about 15% faster. There is a slowdown of about 3% for large
strings because of the additional overhead of checking if the append is
to a preallocated region of the list or not. This will be the rare case.
It could be improved with special case code but we decided it was not
useful enough.
There is a cost of 12*sizeof(PyObject *) bytes per list. For the normal
case of file parsing this is not a problem because of the lists have
a short lifetime. We have not come up with cases where this is a problem
in real life.
I chose 12 because human text averages about 11 words per line in books,
one of my data sets averages 6.2 words with a final peak at 11 words per
line, and I work with a tab delimited data set with 8 tabs per line (or
9 words per line). 12 encompasses all of these.
Also changed the last rstrip code to append then reverse, rather than
doing insert(0). The strip() and rstrip() times are now comparable.
........
r46328 | tim.peters | 2006-05-26 16:02:05 +0200 (Fri, 26 May 2006) | 5 lines
Explicitly close files. I'm trying to stop the frequent spurious test_tarfile
failures on Windows buildbots, but it's hard to know how since the regrtest
failure output is useless here, and it never fails when a buildbot slave runs
test_tarfile the second time in verbose mode.
........
r46329 | andrew.kuchling | 2006-05-26 16:03:41 +0200 (Fri, 26 May 2006) | 1 line
Add buffer support for struct, socket
........
r46330 | andrew.kuchling | 2006-05-26 16:04:19 +0200 (Fri, 26 May 2006) | 1 line
Typo fix
........
r46331 | bob.ippolito | 2006-05-26 16:07:23 +0200 (Fri, 26 May 2006) | 1 line
Fix distutils so that libffi will cross-compile between darwin/x86 and darwin/ppc
........
r46333 | bob.ippolito | 2006-05-26 16:23:21 +0200 (Fri, 26 May 2006) | 1 line
Fix _struct typo that broke some 64-bit platforms
........
r46335 | bob.ippolito | 2006-05-26 16:29:35 +0200 (Fri, 26 May 2006) | 1 line
Enable PY_USE_INT_WHEN_POSSIBLE in struct
........
r46343 | andrew.dalke | 2006-05-26 17:21:01 +0200 (Fri, 26 May 2006) | 2 lines
Eeked out another 3% or so performance in split whitespace by cleaning up the algorithm.
........
r46352 | andrew.dalke | 2006-05-26 18:22:52 +0200 (Fri, 26 May 2006) | 3 lines
Test for more edge strip cases; leading and trailing separator gets removed
even with strip(..., 0)
........
r46354 | bob.ippolito | 2006-05-26 18:23:28 +0200 (Fri, 26 May 2006) | 1 line
fix signed/unsigned mismatch in struct
........
r46355 | steve.holden | 2006-05-26 18:27:59 +0200 (Fri, 26 May 2006) | 5 lines
Add -t option to allow easy test selection.
Action verbose option correctly.
Tweak operation counts. Add empty and new instances tests.
Enable comparisons across different warp factors. Change version.
........
r46356 | fredrik.lundh | 2006-05-26 18:32:42 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: use Py_LOCAL on a few more locals in stringobject.c
........
r46357 | thomas.heller | 2006-05-26 18:42:44 +0200 (Fri, 26 May 2006) | 4 lines
For now, I gave up with automatic conversion of reST to Python-latex,
so I'm writing this in latex now.
Skeleton for the ctypes reference.
........
r46358 | tim.peters | 2006-05-26 18:49:28 +0200 (Fri, 26 May 2006) | 3 lines
Repair Windows compiler warnings about mixing
signed and unsigned integral types in comparisons.
........
r46359 | tim.peters | 2006-05-26 18:52:04 +0200 (Fri, 26 May 2006) | 2 lines
Whitespace normalization.
........
r46360 | tim.peters | 2006-05-26 18:53:04 +0200 (Fri, 26 May 2006) | 2 lines
Add missing svn:eol-style property to text files.
........
r46362 | fredrik.lundh | 2006-05-26 19:04:58 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: stringlib refactoring (in progress)
........
r46363 | thomas.heller | 2006-05-26 19:18:33 +0200 (Fri, 26 May 2006) | 1 line
Write some docs.
........
r46364 | fredrik.lundh | 2006-05-26 19:22:38 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: stringlib refactoring (in progress)
........
r46366 | fredrik.lundh | 2006-05-26 19:26:39 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: cleanup
........
r46367 | fredrik.lundh | 2006-05-26 19:31:41 +0200 (Fri, 26 May 2006) | 4 lines
needforspeed: remove remaining USE_FAST macros; if fastsearch was
broken, someone would have noticed by now ;-)
........
r46368 | steve.holden | 2006-05-26 19:41:32 +0200 (Fri, 26 May 2006) | 5 lines
Use minimum calibration time rather than avergae to avoid
the illusion of negative run times. Halt with an error if
run times go below 10 ms, indicating that results will be
unreliable.
........
r46370 | thomas.heller | 2006-05-26 19:47:40 +0200 (Fri, 26 May 2006) | 2 lines
Reordered, and wrote more docs.
........
r46372 | georg.brandl | 2006-05-26 20:03:31 +0200 (Fri, 26 May 2006) | 9 lines
Need for speed: Patch #921466 : sys.path_importer_cache is now used to cache valid and
invalid file paths for the built-in import machinery which leads to
fewer open calls on startup.
Also fix issue with PEP 302 style import hooks which lead to more open()
calls than necessary.
........
r46373 | fredrik.lundh | 2006-05-26 20:05:34 +0200 (Fri, 26 May 2006) | 3 lines
removed unnecessary include
........
r46377 | fredrik.lundh | 2006-05-26 20:15:38 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: added rpartition implementation
........
r46380 | fredrik.lundh | 2006-05-26 20:24:15 +0200 (Fri, 26 May 2006) | 5 lines
needspeed: rpartition documentation, tests, and a bug fixes.
feel free to add more tests and improve the documentation.
........
r46381 | steve.holden | 2006-05-26 20:26:21 +0200 (Fri, 26 May 2006) | 4 lines
Revert tests to MAL's original round sizes to retiain comparability
from long ago and far away. Stop calling this pybench 1.4 because it
isn't. Remove the empty test, which was a bad idea.
........
r46387 | andrew.kuchling | 2006-05-26 20:41:18 +0200 (Fri, 26 May 2006) | 1 line
Add rpartition() and path caching
........
r46388 | andrew.dalke | 2006-05-26 21:02:09 +0200 (Fri, 26 May 2006) | 10 lines
substring split now uses /F's fast string matching algorithm.
(If compiled without FAST search support, changed the pre-memcmp test
to check the last character as well as the first. This gave a 25%
speedup for my test case.)
Rewrote the split algorithms so they stop when maxsplit gets to 0.
Previously they did a string match first then checked if the maxsplit
was reached. The new way prevents a needless string search.
........
r46391 | brett.cannon | 2006-05-26 21:04:47 +0200 (Fri, 26 May 2006) | 2 lines
Change C spacing to 4 spaces by default to match PEP 7 for new C files.
........
r46392 | georg.brandl | 2006-05-26 21:04:47 +0200 (Fri, 26 May 2006) | 3 lines
Exception isn't the root of all exception classes anymore.
........
r46397 | fredrik.lundh | 2006-05-26 21:23:21 +0200 (Fri, 26 May 2006) | 3 lines
added rpartition method to UserString class
........
r46398 | fredrik.lundh | 2006-05-26 21:24:53 +0200 (Fri, 26 May 2006) | 4 lines
needforspeed: stringlib refactoring, continued. added count and
find helpers; updated unicodeobject to use stringlib_count
........
r46400 | fredrik.lundh | 2006-05-26 21:29:05 +0200 (Fri, 26 May 2006) | 4 lines
needforspeed: stringlib refactoring: use stringlib/find for unicode
find
........
r46403 | fredrik.lundh | 2006-05-26 21:33:03 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: use a macro to fix slice indexes
........
r46404 | thomas.heller | 2006-05-26 21:43:45 +0200 (Fri, 26 May 2006) | 1 line
Write more docs.
........
r46406 | fredrik.lundh | 2006-05-26 21:48:07 +0200 (Fri, 26 May 2006) | 3 lines
needforspeed: stringlib refactoring: use stringlib/find for string find
........
r46407 | andrew.kuchling | 2006-05-26 21:51:10 +0200 (Fri, 26 May 2006) | 1 line
Comment typo
........
r46409 | georg.brandl | 2006-05-26 22:04:44 +0200 (Fri, 26 May 2006) | 3 lines
Replace Py_BuildValue("OO") by PyTuple_Pack.
........
r46411 | georg.brandl | 2006-05-26 22:14:47 +0200 (Fri, 26 May 2006) | 2 lines
Patch #1492218: document None being a constant.
........
r46415 | georg.brandl | 2006-05-26 22:22:50 +0200 (Fri, 26 May 2006) | 3 lines
Simplify calling.
........
r46416 | andrew.dalke | 2006-05-26 22:25:22 +0200 (Fri, 26 May 2006) | 4 lines
Added limits to the replace code so it does not count all of the matching
patterns in a string, only the number needed by the max limit.
........
r46417 | bob.ippolito | 2006-05-26 22:25:23 +0200 (Fri, 26 May 2006) | 1 line
enable all of the struct tests, use ssize_t, fix some whitespace
........
r46418 | tim.peters | 2006-05-26 22:56:56 +0200 (Fri, 26 May 2006) | 2 lines
Record Iceland sprint attendees.
........
r46421 | tim.peters | 2006-05-26 23:51:13 +0200 (Fri, 26 May 2006) | 2 lines
Whitespace normalization.
........
r46422 | steve.holden | 2006-05-27 00:17:54 +0200 (Sat, 27 May 2006) | 2 lines
Add Richard Tew to developers
........
r46423 | steve.holden | 2006-05-27 00:33:20 +0200 (Sat, 27 May 2006) | 2 lines
Update help text and documentaition.
........
r46424 | steve.holden | 2006-05-27 00:39:27 +0200 (Sat, 27 May 2006) | 2 lines
Blasted typos ...
........
r46425 | andrew.dalke | 2006-05-27 00:49:03 +0200 (Sat, 27 May 2006) | 2 lines
Added description of why splitlines doesn't use the prealloc strategy
........
r46426 | tim.peters | 2006-05-27 01:14:37 +0200 (Sat, 27 May 2006) | 19 lines
Patch 1145039.
set_exc_info(), reset_exc_info(): By exploiting the
likely (who knows?) invariant that when an exception's
`type` is NULL, its `value` and `traceback` are also NULL,
save some cycles in heavily-executed code.
This is a "a kronar saved is a kronar earned" patch: the
speedup isn't reliably measurable, but it obviously does
reduce the operation count in the normal (no exception
raised) path through PyEval_EvalFrameEx().
The tim-exc_sanity branch tries to push this harder, but
is still blowing up (at least in part due to pre-existing
subtle bugs that appear to have no other visible
consequences!).
Not a bugfix candidate.
........
r46429 | steve.holden | 2006-05-27 02:51:52 +0200 (Sat, 27 May 2006) | 2 lines
Reinstate new-style object tests.
........
r46430 | neal.norwitz | 2006-05-27 07:18:57 +0200 (Sat, 27 May 2006) | 1 line
Fix compiler warning (and whitespace) on Mac OS 10.4. (A lot of this code looked duplicated, I wonder if a utility function could help reduce the duplication here.)
........
r46431 | neal.norwitz | 2006-05-27 07:21:30 +0200 (Sat, 27 May 2006) | 4 lines
Fix Coverity warnings.
- Check the correct variable (str_obj, not str) for NULL
- sep_len was already verified it wasn't 0
........
r46432 | martin.v.loewis | 2006-05-27 10:36:52 +0200 (Sat, 27 May 2006) | 2 lines
Patch 1494554: Update numeric properties to Unicode 4.1.
........
r46433 | martin.v.loewis | 2006-05-27 10:54:29 +0200 (Sat, 27 May 2006) | 2 lines
Explain why 'consumed' is initialized.
........
r46436 | fredrik.lundh | 2006-05-27 12:05:10 +0200 (Sat, 27 May 2006) | 3 lines
needforspeed: more stringlib refactoring
........
r46438 | fredrik.lundh | 2006-05-27 12:39:48 +0200 (Sat, 27 May 2006) | 5 lines
needforspeed: backed out the Py_LOCAL-isation of ceval; the massive in-
lining killed performance on certain Intel boxes, and the "aggressive"
macro itself gives most of the benefits on others.
........
r46439 | andrew.dalke | 2006-05-27 13:04:36 +0200 (Sat, 27 May 2006) | 2 lines
fixed typo
........
r46440 | martin.v.loewis | 2006-05-27 13:07:49 +0200 (Sat, 27 May 2006) | 2 lines
Revert bogus change committed in 46432 to this file.
........
r46444 | andrew.kuchling | 2006-05-27 13:26:33 +0200 (Sat, 27 May 2006) | 1 line
Add Py_LOCAL macros
........
r46450 | bob.ippolito | 2006-05-27 13:47:12 +0200 (Sat, 27 May 2006) | 1 line
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
........
r46454 | bob.ippolito | 2006-05-27 14:11:36 +0200 (Sat, 27 May 2006) | 1 line
Fix up struct docstrings, add struct.pack_to function for symmetry
........
r46456 | richard.jones | 2006-05-27 14:29:24 +0200 (Sat, 27 May 2006) | 2 lines
Conversion of exceptions over from faked-up classes to new-style C types.
........
r46457 | georg.brandl | 2006-05-27 14:30:25 +0200 (Sat, 27 May 2006) | 3 lines
Add news item for new-style exception class branch merge.
........
r46458 | tim.peters | 2006-05-27 14:36:53 +0200 (Sat, 27 May 2006) | 3 lines
More random thrashing trying to understand spurious
Windows failures. Who's keeping a bz2 file open?
........
r46460 | andrew.kuchling | 2006-05-27 15:44:37 +0200 (Sat, 27 May 2006) | 1 line
Mention new-style exceptions
........
r46461 | richard.jones | 2006-05-27 15:50:42 +0200 (Sat, 27 May 2006) | 1 line
credit where credit is due
........
r46462 | georg.brandl | 2006-05-27 16:02:03 +0200 (Sat, 27 May 2006) | 3 lines
Always close BZ2Proxy object. Remove unnecessary struct usage.
........
r46463 | tim.peters | 2006-05-27 16:13:13 +0200 (Sat, 27 May 2006) | 2 lines
The cheery optimism of old age.
........
r46464 | andrew.dalke | 2006-05-27 16:16:40 +0200 (Sat, 27 May 2006) | 2 lines
cleanup - removed trailing whitespace
........
r46465 | georg.brandl | 2006-05-27 16:41:55 +0200 (Sat, 27 May 2006) | 3 lines
Remove spurious semicolons after macro invocations.
........
r46468 | fredrik.lundh | 2006-05-27 16:58:20 +0200 (Sat, 27 May 2006) | 4 lines
needforspeed: replace improvements, changed to Py_LOCAL_INLINE
where appropriate
........
r46469 | fredrik.lundh | 2006-05-27 17:20:22 +0200 (Sat, 27 May 2006) | 4 lines
needforspeed: stringlib refactoring: changed find_obj to find_slice,
to enable use from stringobject
........
r46470 | fredrik.lundh | 2006-05-27 17:26:19 +0200 (Sat, 27 May 2006) | 3 lines
needforspeed: stringlib refactoring: use find_slice for stringobject
........
r46472 | kristjan.jonsson | 2006-05-27 17:41:31 +0200 (Sat, 27 May 2006) | 1 line
Add a PCBuild8 build directory for building with Visual Studio .NET 2005. Contains a special project to perform profile guided optimizations on the pythoncore.dll, by instrumenting and running pybench.py
........
r46473 | jack.diederich | 2006-05-27 17:44:34 +0200 (Sat, 27 May 2006) | 3 lines
needforspeed: use PyObject_MALLOC instead of system malloc for small
allocations. Use PyMem_MALLOC for larger (1k+) chunks. 1%-2% speedup.
........
r46474 | bob.ippolito | 2006-05-27 17:53:49 +0200 (Sat, 27 May 2006) | 1 line
fix struct regression on 64-bit platforms
........
r46475 | richard.jones | 2006-05-27 18:07:28 +0200 (Sat, 27 May 2006) | 1 line
doc string additions and tweaks
........
r46477 | richard.jones | 2006-05-27 18:15:11 +0200 (Sat, 27 May 2006) | 1 line
move semicolons
........
r46478 | george.yoshida | 2006-05-27 18:32:44 +0200 (Sat, 27 May 2006) | 2 lines
minor markup nits
........
r46488 | george.yoshida | 2006-05-27 18:51:43 +0200 (Sat, 27 May 2006) | 3 lines
End of Ch.3 is now about "with statement".
Avoid obsolescence by directly referring to the section.
........
r46489 | george.yoshida | 2006-05-27 19:09:17 +0200 (Sat, 27 May 2006) | 2 lines
fix typo
........
| author | Thomas Wouters <thomas@python.org> |
|---|---|
| date | Sat, 27 May 2006 19:21:47 +0000 |
| parents | f731859e9b3b |
| children | a19c20c5e5c7 |
| rev | line source |
|---|---|
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2 * This file compiles an abstract syntax tree (AST) into Python bytecode. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3 * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4 * The primary entry point is PyAST_Compile(), which returns a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
5 * PyCodeObject. The compiler makes several passes to build the code |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
6 * object: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
7 * 1. Checks for future statements. See future.c |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
8 * 2. Builds a symbol table. See symtable.c. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
9 * 3. Generate code for basic blocks. See compiler_mod() in this file. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
10 * 4. Assemble the basic blocks into final code. See assemble() in |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
11 * this file. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
12 * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
13 * Note that compiler_mod() suggests module, but the module ast type |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
14 * (mod_ty) has cases for expressions and interactive statements. |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
15 * |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
16 * CAUTION: The VISIT_* macros abort the current function when they |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
17 * encounter a problem. So don't invoke them when there is memory |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
18 * which needs to be released. Code blocks are OK, as the compiler |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
19 * structure takes care of releasing those. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
20 */ |
| 69 | 21 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
22 #include "Python.h" |
| 86 | 23 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
24 #include "Python-ast.h" |
| 69 | 25 #include "node.h" |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
26 #include "pyarena.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
27 #include "ast.h" |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
28 #include "code.h" |
| 69 | 29 #include "compile.h" |
|
16421
aa844711463a
Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16408
diff
changeset
|
30 #include "symtable.h" |
| 69 | 31 #include "opcode.h" |
|
5438
e926c331ebbf
Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents:
5373
diff
changeset
|
32 |
|
5164
8c277f29b535
Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents:
5119
diff
changeset
|
33 int Py_OptimizeFlag = 0; |
|
8c277f29b535
Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents:
5119
diff
changeset
|
34 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
35 /* |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
36 ISSUES: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
37 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
38 opcode_stack_effect() function should be reviewed since stack depth bugs |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
39 could be really hard to find later. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
40 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
41 Dead code is being generated (i.e. after unconditional jumps). |
|
36797
7285c37d7633
Update known issues to reflect reality
Neal Norwitz <nnorwitz@gmail.com>
parents:
36786
diff
changeset
|
42 XXX(nnorwitz): not sure this is still true |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
43 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
44 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
45 #define DEFAULT_BLOCK_SIZE 16 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
46 #define DEFAULT_BLOCKS 8 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
47 #define DEFAULT_CODE_SIZE 128 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
48 #define DEFAULT_LNOTAB_SIZE 16 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
49 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
50 struct instr { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
51 unsigned i_jabs : 1; |
|
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
52 unsigned i_jrel : 1; |
|
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
53 unsigned i_hasarg : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
54 unsigned char i_opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
55 int i_oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
56 struct basicblock_ *i_target; /* target block (if jump instruction) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
57 int i_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
58 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
59 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
60 typedef struct basicblock_ { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
61 /* Each basicblock in a compilation unit is linked via b_list in the |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
62 reverse order that the block are allocated. b_list points to the next |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
63 block, not to be confused with b_next, which is next by control flow. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
64 struct basicblock_ *b_list; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
65 /* number of instructions used */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
66 int b_iused; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
67 /* length of instruction array (b_instr) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
68 int b_ialloc; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
69 /* pointer to an array of instructions, initially NULL */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
70 struct instr *b_instr; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
71 /* If b_next is non-NULL, it is a pointer to the next |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
72 block reached by normal control flow. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
73 struct basicblock_ *b_next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
74 /* b_seen is used to perform a DFS of basicblocks. */ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
75 unsigned b_seen : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
76 /* b_return is true if a RETURN_VALUE opcode is inserted. */ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
77 unsigned b_return : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
78 /* depth of stack upon entry of block, computed by stackdepth() */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
79 int b_startdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
80 /* instruction offset for block, computed by assemble_jump_offsets() */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
81 int b_offset; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
82 } basicblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
83 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
84 /* fblockinfo tracks the current frame block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
85 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
86 A frame block is used to handle loops, try/except, and try/finally. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
87 It's called a frame block to distinguish it from a basic block in the |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
88 compiler IR. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
89 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
90 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
91 enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
92 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
93 struct fblockinfo { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
94 enum fblocktype fb_type; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
95 basicblock *fb_block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
96 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
97 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
98 /* The following items change on entry and exit of code blocks. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
99 They must be saved and restored when returning to a block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
100 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
101 struct compiler_unit { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
102 PySTEntryObject *u_ste; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
103 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
104 PyObject *u_name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
105 /* The following fields are dicts that map objects to |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
106 the index of them in co_XXX. The index is used as |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
107 the argument for opcodes that refer to those collections. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
108 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
109 PyObject *u_consts; /* all constants */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
110 PyObject *u_names; /* all names */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
111 PyObject *u_varnames; /* local variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
112 PyObject *u_cellvars; /* cell variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
113 PyObject *u_freevars; /* free variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
114 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
115 PyObject *u_private; /* for private name mangling */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
116 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
117 int u_argcount; /* number of arguments for block */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
118 /* Pointer to the most recently allocated block. By following b_list |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
119 members, you can reach all early allocated blocks. */ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
120 basicblock *u_blocks; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
121 basicblock *u_curblock; /* pointer to current block */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
122 int u_tmpname; /* temporary variables for list comps */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
123 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
124 int u_nfblocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
125 struct fblockinfo u_fblock[CO_MAXBLOCKS]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
126 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
127 int u_firstlineno; /* the first lineno of the block */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
128 int u_lineno; /* the lineno for the current stmt */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
129 bool u_lineno_set; /* boolean to indicate whether instr |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
130 has been generated with current lineno */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
131 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
132 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
133 /* This struct captures the global state of a compilation. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
134 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
135 The u pointer points to the current compilation unit, while units |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
136 for enclosing blocks are stored in c_stack. The u and c_stack are |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
137 managed by compiler_enter_scope() and compiler_exit_scope(). |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
138 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
139 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
140 struct compiler { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
141 const char *c_filename; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
142 struct symtable *c_st; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
143 PyFutureFeatures *c_future; /* pointer to module's __future__ */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
144 PyCompilerFlags *c_flags; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
145 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
146 int c_interactive; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
147 int c_nestlevel; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
148 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
149 struct compiler_unit *u; /* compiler state for current block */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
150 PyObject *c_stack; /* Python list holding compiler_unit ptrs */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
151 char *c_encoding; /* source encoding (a borrowed reference) */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
152 PyArena *c_arena; /* pointer to memory allocation arena */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
153 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
154 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
155 struct assembler { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
156 PyObject *a_bytecode; /* string containing bytecode */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
157 int a_offset; /* offset into bytecode */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
158 int a_nblocks; /* number of reachable blocks */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
159 basicblock **a_postorder; /* list of blocks in dfs postorder */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
160 PyObject *a_lnotab; /* string containing lnotab */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
161 int a_lnotab_off; /* offset into lnotab */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
162 int a_lineno; /* last lineno of emitted instruction */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
163 int a_lineno_off; /* bytecode offset of last lineno */ |
| 86 | 164 }; |
| 165 | |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
166 static int compiler_enter_scope(struct compiler *, identifier, void *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
167 static void compiler_free(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
168 static basicblock *compiler_new_block(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
169 static int compiler_next_instr(struct compiler *, basicblock *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
170 static int compiler_addop(struct compiler *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
171 static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
172 static int compiler_addop_i(struct compiler *, int, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
173 static int compiler_addop_j(struct compiler *, int, basicblock *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
174 static basicblock *compiler_use_new_block(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
175 static int compiler_error(struct compiler *, const char *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
176 static int compiler_nameop(struct compiler *, identifier, expr_context_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
177 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
178 static PyCodeObject *compiler_mod(struct compiler *, mod_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
179 static int compiler_visit_stmt(struct compiler *, stmt_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
180 static int compiler_visit_keyword(struct compiler *, keyword_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
181 static int compiler_visit_expr(struct compiler *, expr_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
182 static int compiler_augassign(struct compiler *, stmt_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
183 static int compiler_visit_slice(struct compiler *, slice_ty, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
184 expr_context_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
185 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
186 static int compiler_push_fblock(struct compiler *, enum fblocktype, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
187 basicblock *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
188 static void compiler_pop_fblock(struct compiler *, enum fblocktype, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
189 basicblock *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
190 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
191 static int inplace_binop(struct compiler *, operator_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
192 static int expr_constant(expr_ty e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
193 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
194 static int compiler_with(struct compiler *, stmt_ty); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
195 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
196 static PyCodeObject *assemble(struct compiler *, int addNone); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
197 static PyObject *__doc__; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
198 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
199 PyObject * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
200 _Py_Mangle(PyObject *privateobj, PyObject *ident) |
| 33100 | 201 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
202 /* Name mangling: __private becomes _classname__private. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
203 This is independent from how the name is used. */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
204 const char *p, *name = PyString_AsString(ident); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
205 char *buffer; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
206 size_t nlen, plen; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
207 if (privateobj == NULL || name == NULL || name[0] != '_' || |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
208 name[1] != '_') { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
209 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
210 return ident; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
211 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
212 p = PyString_AsString(privateobj); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
213 nlen = strlen(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
214 if (name[nlen-1] == '_' && name[nlen-2] == '_') { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
215 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
216 return ident; /* Don't mangle __whatever__ */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
217 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
218 /* Strip leading underscores from class name */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
219 while (*p == '_') |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
220 p++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
221 if (*p == '\0') { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
222 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
223 return ident; /* Don't mangle if class is just underscores */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
224 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
225 plen = strlen(p); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
226 ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
227 if (!ident) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
228 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
229 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
230 buffer = PyString_AS_STRING(ident); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
231 buffer[0] = '_'; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
232 strncpy(buffer+1, p, plen); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
233 strcpy(buffer+1+plen, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
234 return ident; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
235 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
236 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
237 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
238 compiler_init(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
239 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
240 memset(c, 0, sizeof(struct compiler)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
241 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
242 c->c_stack = PyList_New(0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
243 if (!c->c_stack) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
244 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
245 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
246 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
247 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
248 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
249 PyCodeObject * |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
250 PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
251 PyArena *arena) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
252 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
253 struct compiler c; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
254 PyCodeObject *co = NULL; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
255 PyCompilerFlags local_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
256 int merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
257 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
258 if (!__doc__) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
259 __doc__ = PyString_InternFromString("__doc__"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
260 if (!__doc__) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
261 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
262 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
263 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
264 if (!compiler_init(&c)) |
| 36696 | 265 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
266 c.c_filename = filename; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
267 c.c_arena = arena; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
268 c.c_future = PyFuture_FromAST(mod, filename); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
269 if (c.c_future == NULL) |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
270 goto finally; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
271 if (!flags) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
272 local_flags.cf_flags = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
273 flags = &local_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
274 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
275 merged = c.c_future->ff_features | flags->cf_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
276 c.c_future->ff_features = merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
277 flags->cf_flags = merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
278 c.c_flags = flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
279 c.c_nestlevel = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
280 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
281 c.c_st = PySymtable_Build(mod, filename, c.c_future); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
282 if (c.c_st == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
283 if (!PyErr_Occurred()) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
284 PyErr_SetString(PyExc_SystemError, "no symtable"); |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
285 goto finally; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
286 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
287 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
288 /* XXX initialize to NULL for now, need to handle */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
289 c.c_encoding = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
290 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
291 co = compiler_mod(&c, mod); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
292 |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
293 finally: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
294 compiler_free(&c); |
| 36696 | 295 assert(co || PyErr_Occurred()); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
296 return co; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
297 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
298 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
299 PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
300 PyNode_Compile(struct _node *n, const char *filename) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
301 { |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
302 PyCodeObject *co = NULL; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
303 PyArena *arena = PyArena_New(); |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
304 mod_ty mod = PyAST_FromNode(n, NULL, filename, arena); |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
305 if (mod) |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
306 co = PyAST_Compile(mod, filename, NULL, arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
307 PyArena_Free(arena); |
|
30428
c2c10f1eb8e2
Fix leak discovered in test_new by Michael Hudson.
Raymond Hettinger <python@rcn.com>
parents:
30226
diff
changeset
|
308 return co; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23589
diff
changeset
|
309 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23589
diff
changeset
|
310 |
| 69 | 311 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
312 compiler_free(struct compiler *c) |
| 69 | 313 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
314 if (c->c_st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
315 PySymtable_Free(c->c_st); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
316 if (c->c_future) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
317 PyObject_Free(c->c_future); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
318 Py_DECREF(c->c_stack); |
| 69 | 319 } |
| 320 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
321 static PyObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
322 list2dict(PyObject *list) |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
323 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
324 Py_ssize_t i, n; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
325 PyObject *v, *k; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
326 PyObject *dict = PyDict_New(); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
327 if (!dict) return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
328 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
329 n = PyList_Size(list); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
330 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
331 v = PyInt_FromLong(i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
332 if (!v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
333 Py_DECREF(dict); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
334 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
335 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
336 k = PyList_GET_ITEM(list, i); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
337 k = PyTuple_Pack(2, k, k->ob_type); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
338 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
339 Py_XDECREF(k); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
340 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
341 Py_DECREF(dict); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
342 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
343 } |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
344 Py_DECREF(k); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
345 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
346 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
347 return dict; |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
348 } |
|
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
349 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
350 /* Return new dict containing names from src that match scope(s). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
351 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
352 src is a symbol table dictionary. If the scope of a name matches |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
353 either scope_type or flag is set, insert it into the new dict. The |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
354 values are integers, starting at offset and increasing by one for |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
355 each key. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
356 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
357 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
358 static PyObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
359 dictbytype(PyObject *src, int scope_type, int flag, int offset) |
|
16006
51811d78a9da
SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents:
15438
diff
changeset
|
360 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
361 Py_ssize_t pos = 0, i = offset, scope; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
362 PyObject *k, *v, *dest = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
363 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
364 assert(offset >= 0); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
365 if (dest == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
366 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
367 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
368 while (PyDict_Next(src, &pos, &k, &v)) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
369 /* XXX this should probably be a macro in symtable.h */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
370 assert(PyInt_Check(v)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
371 scope = (PyInt_AS_LONG(v) >> SCOPE_OFF) & SCOPE_MASK; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
372 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
373 if (scope == scope_type || PyInt_AS_LONG(v) & flag) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
374 PyObject *tuple, *item = PyInt_FromLong(i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
375 if (item == NULL) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
376 Py_DECREF(dest); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
377 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
378 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
379 i++; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
380 tuple = PyTuple_Pack(2, k, k->ob_type); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
381 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
382 Py_DECREF(item); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
383 Py_DECREF(dest); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
384 Py_XDECREF(tuple); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
385 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
386 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
387 Py_DECREF(item); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
388 Py_DECREF(tuple); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
389 } |
|
16523
9d625303f914
Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents:
16428
diff
changeset
|
390 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
391 return dest; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
392 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
393 |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
394 /* Begin: Peephole optimizations ----------------------------------------- */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
395 |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
396 #define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1])) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
397 #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) |
|
28417
1a2fd109f6b6
Factored out test for absolute jumps.
Raymond Hettinger <python@rcn.com>
parents:
28406
diff
changeset
|
398 #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP) |
|
1a2fd109f6b6
Factored out test for absolute jumps.
Raymond Hettinger <python@rcn.com>
parents:
28406
diff
changeset
|
399 #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3)) |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
400 #define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255 |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
401 #define CODESIZE(op) (HAS_ARG(op) ? 3 : 1) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
402 #define ISBASICBLOCK(blocks, start, bytes) \ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
403 (blocks[start]==blocks[start+bytes-1]) |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
404 |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
405 /* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
406 with LOAD_CONST (c1, c2, ... cn). |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
407 The consts table must still be in list form so that the |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
408 new constant (c1, c2, ... cn) can be appended. |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
409 Called with codestr pointing to the first LOAD_CONST. |
|
34553
cd04f2d18a6f
Adopt Skip's idea to optimize lists of constants in the context
Raymond Hettinger <python@rcn.com>
parents:
34547
diff
changeset
|
410 Bails out with no change if one or more of the LOAD_CONSTs is missing. |
|
cd04f2d18a6f
Adopt Skip's idea to optimize lists of constants in the context
Raymond Hettinger <python@rcn.com>
parents:
34547
diff
changeset
|
411 Also works for BUILD_LIST when followed by an "in" or "not in" test. |
|
cd04f2d18a6f
Adopt Skip's idea to optimize lists of constants in the context
Raymond Hettinger <python@rcn.com>
parents:
34547
diff
changeset
|
412 */ |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
413 static int |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
414 tuple_of_constants(unsigned char *codestr, int n, PyObject *consts) |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
415 { |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
416 PyObject *newconst, *constant; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
417 Py_ssize_t i, arg, len_consts; |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
418 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
419 /* Pre-conditions */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
420 assert(PyList_CheckExact(consts)); |
|
34553
cd04f2d18a6f
Adopt Skip's idea to optimize lists of constants in the context
Raymond Hettinger <python@rcn.com>
parents:
34547
diff
changeset
|
421 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST); |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
422 assert(GETARG(codestr, (n*3)) == n); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
423 for (i=0 ; i<n ; i++) |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
424 assert(codestr[i*3] == LOAD_CONST); |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
425 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
426 /* Buildup new tuple of constants */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
427 newconst = PyTuple_New(n); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
428 if (newconst == NULL) |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
429 return 0; |
|
33838
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
430 len_consts = PyList_GET_SIZE(consts); |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
431 for (i=0 ; i<n ; i++) { |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
432 arg = GETARG(codestr, (i*3)); |
|
33838
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
433 assert(arg < len_consts); |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
434 constant = PyList_GET_ITEM(consts, arg); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
435 Py_INCREF(constant); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
436 PyTuple_SET_ITEM(newconst, i, constant); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
437 } |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
438 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
439 /* Append folded constant onto consts */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
440 if (PyList_Append(consts, newconst)) { |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
441 Py_DECREF(newconst); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
442 return 0; |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
443 } |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
444 Py_DECREF(newconst); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
445 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
446 /* Write NOPs over old LOAD_CONSTS and |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
447 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
448 memset(codestr, NOP, n*3); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
449 codestr[n*3] = LOAD_CONST; |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
450 SETARG(codestr, (n*3), len_consts); |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
451 return 1; |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
452 } |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
453 |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
454 /* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
455 with LOAD_CONST binop(c1,c2) |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
456 The consts table must still be in list form so that the |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
457 new constant can be appended. |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
458 Called with codestr pointing to the first LOAD_CONST. |
|
34506
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
459 Abandons the transformation if the folding fails (i.e. 1+'a'). |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
460 If the new constant is a sequence, only folds when the size |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
461 is below a threshold value. That keeps pyc files from |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
462 becoming large in the presence of code like: (None,)*1000. |
|
34506
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
463 */ |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
464 static int |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
465 fold_binops_on_constants(unsigned char *codestr, PyObject *consts) |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
466 { |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
467 PyObject *newconst, *v, *w; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
468 Py_ssize_t len_consts, size; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
469 int opcode; |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
470 |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
471 /* Pre-conditions */ |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
472 assert(PyList_CheckExact(consts)); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
473 assert(codestr[0] == LOAD_CONST); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
474 assert(codestr[3] == LOAD_CONST); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
475 |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
476 /* Create new constant */ |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
477 v = PyList_GET_ITEM(consts, GETARG(codestr, 0)); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
478 w = PyList_GET_ITEM(consts, GETARG(codestr, 3)); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
479 opcode = codestr[6]; |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
480 switch (opcode) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
481 case BINARY_POWER: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
482 newconst = PyNumber_Power(v, w, Py_None); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
483 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
484 case BINARY_MULTIPLY: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
485 newconst = PyNumber_Multiply(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
486 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
487 case BINARY_TRUE_DIVIDE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
488 newconst = PyNumber_TrueDivide(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
489 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
490 case BINARY_FLOOR_DIVIDE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
491 newconst = PyNumber_FloorDivide(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
492 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
493 case BINARY_MODULO: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
494 newconst = PyNumber_Remainder(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
495 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
496 case BINARY_ADD: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
497 newconst = PyNumber_Add(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
498 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
499 case BINARY_SUBTRACT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
500 newconst = PyNumber_Subtract(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
501 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
502 case BINARY_SUBSCR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
503 newconst = PyObject_GetItem(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
504 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
505 case BINARY_LSHIFT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
506 newconst = PyNumber_Lshift(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
507 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
508 case BINARY_RSHIFT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
509 newconst = PyNumber_Rshift(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
510 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
511 case BINARY_AND: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
512 newconst = PyNumber_And(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
513 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
514 case BINARY_XOR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
515 newconst = PyNumber_Xor(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
516 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
517 case BINARY_OR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
518 newconst = PyNumber_Or(v, w); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
519 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
520 default: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
521 /* Called with an unknown opcode */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
522 PyErr_Format(PyExc_SystemError, |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
523 "unexpected binary operation %d on a constant", |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
524 opcode); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
525 return 0; |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
526 } |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
527 if (newconst == NULL) { |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
528 PyErr_Clear(); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
529 return 0; |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
530 } |
|
34506
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
531 size = PyObject_Size(newconst); |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
532 if (size == -1) |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
533 PyErr_Clear(); |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
534 else if (size > 20) { |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
535 Py_DECREF(newconst); |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
536 return 0; |
|
bda933873758
Do not fold a constant if a large sequence will result.
Raymond Hettinger <python@rcn.com>
parents:
34359
diff
changeset
|
537 } |
|
34305
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
538 |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
539 /* Append folded constant into consts table */ |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
540 len_consts = PyList_GET_SIZE(consts); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
541 if (PyList_Append(consts, newconst)) { |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
542 Py_DECREF(newconst); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
543 return 0; |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
544 } |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
545 Py_DECREF(newconst); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
546 |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
547 /* Write NOP NOP NOP NOP LOAD_CONST newconst */ |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
548 memset(codestr, NOP, 4); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
549 codestr[4] = LOAD_CONST; |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
550 SETARG(codestr, 4, len_consts); |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
551 return 1; |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
552 } |
|
0c326327e722
Teach the peephole optimizer to fold simple constant expressions.
Raymond Hettinger <python@rcn.com>
parents:
33925
diff
changeset
|
553 |
|
34622
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
554 static int |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
555 fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts) |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
556 { |
|
34630
660419bdb4ae
Preserve sign of -0.0 when result is run through marshal.
Raymond Hettinger <python@rcn.com>
parents:
34626
diff
changeset
|
557 PyObject *newconst=NULL, *v; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
558 Py_ssize_t len_consts; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
559 int opcode; |
|
34622
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
560 |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
561 /* Pre-conditions */ |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
562 assert(PyList_CheckExact(consts)); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
563 assert(codestr[0] == LOAD_CONST); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
564 |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
565 /* Create new constant */ |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
566 v = PyList_GET_ITEM(consts, GETARG(codestr, 0)); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
567 opcode = codestr[3]; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
568 switch (opcode) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
569 case UNARY_NEGATIVE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
570 /* Preserve the sign of -0.0 */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
571 if (PyObject_IsTrue(v) == 1) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
572 newconst = PyNumber_Negative(v); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
573 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
574 case UNARY_CONVERT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
575 newconst = PyObject_Repr(v); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
576 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
577 case UNARY_INVERT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
578 newconst = PyNumber_Invert(v); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
579 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
580 default: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
581 /* Called with an unknown opcode */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
582 PyErr_Format(PyExc_SystemError, |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
583 "unexpected unary operation %d on a constant", |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
584 opcode); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
585 return 0; |
|
34622
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
586 } |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
587 if (newconst == NULL) { |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
588 PyErr_Clear(); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
589 return 0; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
590 } |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
591 |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
592 /* Append folded constant into consts table */ |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
593 len_consts = PyList_GET_SIZE(consts); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
594 if (PyList_Append(consts, newconst)) { |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
595 Py_DECREF(newconst); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
596 return 0; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
597 } |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
598 Py_DECREF(newconst); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
599 |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
600 /* Write NOP LOAD_CONST newconst */ |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
601 codestr[0] = NOP; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
602 codestr[1] = LOAD_CONST; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
603 SETARG(codestr, 1, len_consts); |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
604 return 1; |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
605 } |
|
516bb8fd75b4
Teach the peepholer to fold unary operations on constants.
Raymond Hettinger <python@rcn.com>
parents:
34574
diff
changeset
|
606 |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
607 static unsigned int * |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
608 markblocks(unsigned char *code, int len) |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
609 { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
610 unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int)); |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
611 int i,j, opcode, blockcnt = 0; |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
612 |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
613 if (blocks == NULL) |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
614 return NULL; |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
615 memset(blocks, 0, len*sizeof(int)); |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
616 |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
617 /* Mark labels in the first pass */ |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
618 for (i=0 ; i<len ; i+=CODESIZE(opcode)) { |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
619 opcode = code[i]; |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
620 switch (opcode) { |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
621 case FOR_ITER: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
622 case JUMP_FORWARD: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
623 case JUMP_IF_FALSE: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
624 case JUMP_IF_TRUE: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
625 case JUMP_ABSOLUTE: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
626 case CONTINUE_LOOP: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
627 case SETUP_LOOP: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
628 case SETUP_EXCEPT: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
629 case SETUP_FINALLY: |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
630 j = GETJUMPTGT(code, i); |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
631 blocks[j] = 1; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
632 break; |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
633 } |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
634 } |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
635 /* Build block numbers in the second pass */ |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
636 for (i=0 ; i<len ; i++) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
637 blockcnt += blocks[i]; /* increment blockcnt over labels */ |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
638 blocks[i] = blockcnt; |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
639 } |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
640 return blocks; |
|
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
641 } |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
642 |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
643 /* Perform basic peephole optimizations to components of a code object. |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
644 The consts object should still be in list form to allow new constants |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
645 to be appended. |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
646 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
647 To keep the optimizer simple, it bails out (does nothing) for code |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
648 containing extended arguments or that has a length over 32,700. That |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
649 allows us to avoid overflow and sign issues. Likewise, it bails when |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
650 the lineno table has complex encoding for gaps >= 255. |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
651 |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
652 Optimizations are restricted to simple transformations occuring within a |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
653 single basic block. All transformations keep the code size the same or |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
654 smaller. For those that reduce size, the gaps are initially filled with |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
655 NOPs. Later those NOPs are removed and the jump addresses retargeted in |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
656 a single pass. Line numbering is adjusted accordingly. */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
657 |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
658 static PyObject * |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
659 optimize_code(PyObject *code, PyObject* consts, PyObject *names, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
660 PyObject *lineno_obj) |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
661 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
662 Py_ssize_t i, j, codelen; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
663 int nops, h, adj; |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
664 int tgt, tgttgt, opcode; |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
665 unsigned char *codestr = NULL; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
666 unsigned char *lineno; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
667 int *addrmap = NULL; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
668 int new_line, cum_orig_line, last_line, tabsiz; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
669 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */ |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
670 unsigned int *blocks = NULL; |
|
32711
c7c9b68ddda2
Treat None as a constant.
Raymond Hettinger <python@rcn.com>
parents:
32531
diff
changeset
|
671 char *name; |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
672 |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
673 /* Bail out if an exception is set */ |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
674 if (PyErr_Occurred()) |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
675 goto exitUnchanged; |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
676 |
|
33272
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
677 /* Bypass optimization when the lineno table is too complex */ |
|
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
678 assert(PyString_Check(lineno_obj)); |
|
35126
70681267a74a
Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents:
34696
diff
changeset
|
679 lineno = (unsigned char*)PyString_AS_STRING(lineno_obj); |
|
33272
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
680 tabsiz = PyString_GET_SIZE(lineno_obj); |
|
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
681 if (memchr(lineno, 255, tabsiz) != NULL) |
|
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
682 goto exitUnchanged; |
|
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
683 |
|
33249
c654334dc961
Incorporate review comments courtesy of Neal Norwitz:
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
684 /* Avoid situations where jump retargeting could overflow */ |
|
33620
27aa0e119330
Replaced a test with an assertion.
Raymond Hettinger <python@rcn.com>
parents:
33539
diff
changeset
|
685 assert(PyString_Check(code)); |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
686 codelen = PyString_Size(code); |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
687 if (codelen > 32700) |
|
33249
c654334dc961
Incorporate review comments courtesy of Neal Norwitz:
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
688 goto exitUnchanged; |
|
c654334dc961
Incorporate review comments courtesy of Neal Norwitz:
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
689 |
|
c654334dc961
Incorporate review comments courtesy of Neal Norwitz:
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
690 /* Make a modifiable copy of the code string */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
691 codestr = (unsigned char *)PyMem_Malloc(codelen); |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
692 if (codestr == NULL) |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
693 goto exitUnchanged; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
694 codestr = (unsigned char *)memcpy(codestr, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
695 PyString_AS_STRING(code), codelen); |
|
32977
40c3a51cb71c
SF bug #1004088: big code objects (>64K) may be optimized incorrectly
Raymond Hettinger <python@rcn.com>
parents:
32956
diff
changeset
|
696 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
697 /* Verify that RETURN_VALUE terminates the codestring. This allows |
|
34626
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
698 the various transformation patterns to look ahead several |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
699 instructions without additional checks to make sure they are not |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
700 looking beyond the end of the code string. |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
701 */ |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
702 if (codestr[codelen-1] != RETURN_VALUE) |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
703 goto exitUnchanged; |
|
fcacf9d4b8f0
Document how the pattern recognizer keeps all of its references in bounds.
Raymond Hettinger <python@rcn.com>
parents:
34622
diff
changeset
|
704 |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
705 /* Mapping to new jump targets after NOPs are removed */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
706 addrmap = (int *)PyMem_Malloc(codelen * sizeof(int)); |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
707 if (addrmap == NULL) |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
708 goto exitUnchanged; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
709 |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
710 blocks = markblocks(codestr, codelen); |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
711 if (blocks == NULL) |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
712 goto exitUnchanged; |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
713 assert(PyList_Check(consts)); |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
714 |
|
33875
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
715 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) { |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
716 opcode = codestr[i]; |
|
33838
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
717 |
|
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
718 lastlc = cumlc; |
|
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
719 cumlc = 0; |
|
fdce3d39bec1
SF bug #1053819: Segfault in tuple_of_constants
Raymond Hettinger <python@rcn.com>
parents:
33822
diff
changeset
|
720 |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
721 switch (opcode) { |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
722 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
723 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
724 with JUMP_IF_TRUE POP_TOP */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
725 case UNARY_NOT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
726 if (codestr[i+1] != JUMP_IF_FALSE || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
727 codestr[i+4] != POP_TOP || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
728 !ISBASICBLOCK(blocks,i,5)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
729 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
730 tgt = GETJUMPTGT(codestr, (i+1)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
731 if (codestr[tgt] != POP_TOP) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
732 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
733 j = GETARG(codestr, i+1) + 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
734 codestr[i] = JUMP_IF_TRUE; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
735 SETARG(codestr, i, j); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
736 codestr[i+3] = POP_TOP; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
737 codestr[i+4] = NOP; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
738 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
739 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
740 /* not a is b --> a is not b |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
741 not a in b --> a not in b |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
742 not a is not b --> a is b |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
743 not a not in b --> a in b |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
744 */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
745 case COMPARE_OP: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
746 j = GETARG(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
747 if (j < 6 || j > 9 || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
748 codestr[i+3] != UNARY_NOT || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
749 !ISBASICBLOCK(blocks,i,4)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
750 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
751 SETARG(codestr, i, (j^1)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
752 codestr[i+3] = NOP; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
753 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
754 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
755 /* Replace LOAD_GLOBAL/LOAD_NAME None |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
756 with LOAD_CONST None */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
757 case LOAD_NAME: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
758 case LOAD_GLOBAL: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
759 j = GETARG(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
760 name = PyString_AsString(PyTuple_GET_ITEM(names, j)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
761 if (name == NULL || strcmp(name, "None") != 0) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
762 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
763 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
764 if (PyList_GET_ITEM(consts, j) == Py_None) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
765 codestr[i] = LOAD_CONST; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
766 SETARG(codestr, i, j); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
767 cumlc = lastlc + 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
768 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
769 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
770 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
771 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
772 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
773 /* Skip over LOAD_CONST trueconst |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
774 JUMP_IF_FALSE xx POP_TOP */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
775 case LOAD_CONST: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
776 cumlc = lastlc + 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
777 j = GETARG(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
778 if (codestr[i+3] != JUMP_IF_FALSE || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
779 codestr[i+6] != POP_TOP || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
780 !ISBASICBLOCK(blocks,i,7) || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
781 !PyObject_IsTrue(PyList_GET_ITEM(consts, j))) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
782 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
783 memset(codestr+i, NOP, 7); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
784 cumlc = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
785 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
786 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
787 /* Try to fold tuples of constants (includes a case for lists |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
788 which are only used for "in" and "not in" tests). |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
789 Skip over BUILD_SEQN 1 UNPACK_SEQN 1. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
790 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
791 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
792 case BUILD_TUPLE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
793 case BUILD_LIST: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
794 j = GETARG(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
795 h = i - 3 * j; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
796 if (h >= 0 && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
797 j <= lastlc && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
798 ((opcode == BUILD_TUPLE && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
799 ISBASICBLOCK(blocks, h, 3*(j+1))) || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
800 (opcode == BUILD_LIST && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
801 codestr[i+3]==COMPARE_OP && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
802 ISBASICBLOCK(blocks, h, 3*(j+2)) && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
803 (GETARG(codestr,i+3)==6 || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
804 GETARG(codestr,i+3)==7))) && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
805 tuple_of_constants(&codestr[h], j, consts)) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
806 assert(codestr[i] == LOAD_CONST); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
807 cumlc = 1; |
|
32711
c7c9b68ddda2
Treat None as a constant.
Raymond Hettinger <python@rcn.com>
parents:
32531
diff
changeset
|
808 break; |
|
c7c9b68ddda2
Treat None as a constant.
Raymond Hettinger <python@rcn.com>
parents:
32531
diff
changeset
|
809 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
810 if (codestr[i+3] != UNPACK_SEQUENCE || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
811 !ISBASICBLOCK(blocks,i,6) || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
812 j != GETARG(codestr, i+3)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
813 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
814 if (j == 1) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
815 memset(codestr+i, NOP, 6); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
816 } else if (j == 2) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
817 codestr[i] = ROT_TWO; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
818 memset(codestr+i+1, NOP, 5); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
819 } else if (j == 3) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
820 codestr[i] = ROT_THREE; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
821 codestr[i+1] = ROT_TWO; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
822 memset(codestr+i+2, NOP, 4); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
823 } |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
824 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
825 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
826 /* Fold binary ops on constants. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
827 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
828 case BINARY_POWER: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
829 case BINARY_MULTIPLY: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
830 case BINARY_TRUE_DIVIDE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
831 case BINARY_FLOOR_DIVIDE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
832 case BINARY_MODULO: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
833 case BINARY_ADD: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
834 case BINARY_SUBTRACT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
835 case BINARY_SUBSCR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
836 case BINARY_LSHIFT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
837 case BINARY_RSHIFT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
838 case BINARY_AND: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
839 case BINARY_XOR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
840 case BINARY_OR: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
841 if (lastlc >= 2 && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
842 ISBASICBLOCK(blocks, i-6, 7) && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
843 fold_binops_on_constants(&codestr[i-6], consts)) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
844 i -= 2; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
845 assert(codestr[i] == LOAD_CONST); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
846 cumlc = 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
847 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
848 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
849 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
850 /* Fold unary ops on constants. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
851 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
852 case UNARY_NEGATIVE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
853 case UNARY_CONVERT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
854 case UNARY_INVERT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
855 if (lastlc >= 1 && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
856 ISBASICBLOCK(blocks, i-3, 4) && |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
857 fold_unaryops_on_constants(&codestr[i-3], consts)) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
858 i -= 2; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
859 assert(codestr[i] == LOAD_CONST); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
860 cumlc = 1; |
|
33259
b63b30821ef4
Simplify chains of conditional jumps.
Raymond Hettinger <python@rcn.com>
parents:
33249
diff
changeset
|
861 } |
|
b63b30821ef4
Simplify chains of conditional jumps.
Raymond Hettinger <python@rcn.com>
parents:
33249
diff
changeset
|
862 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
863 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
864 /* Simplify conditional jump to conditional jump where the |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
865 result of the first test implies the success of a similar |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
866 test or the failure of the opposite test. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
867 Arises in code like: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
868 "if a and b:" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
869 "if a or b:" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
870 "a and b or c" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
871 "(a and b) and c" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
872 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
873 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
874 where y+3 is the instruction following the second test. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
875 */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
876 case JUMP_IF_FALSE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
877 case JUMP_IF_TRUE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
878 tgt = GETJUMPTGT(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
879 j = codestr[tgt]; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
880 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
881 if (j == opcode) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
882 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
883 SETARG(codestr, i, tgttgt); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
884 } else { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
885 tgt -= i; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
886 SETARG(codestr, i, tgt); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
887 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
888 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
889 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
890 /* Intentional fallthrough */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
891 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
892 /* Replace jumps to unconditional jumps */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
893 case FOR_ITER: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
894 case JUMP_FORWARD: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
895 case JUMP_ABSOLUTE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
896 case CONTINUE_LOOP: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
897 case SETUP_LOOP: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
898 case SETUP_EXCEPT: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
899 case SETUP_FINALLY: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
900 tgt = GETJUMPTGT(codestr, i); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
901 if (!UNCONDITIONAL_JUMP(codestr[tgt])) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
902 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
903 tgttgt = GETJUMPTGT(codestr, tgt); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
904 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
905 opcode = JUMP_ABSOLUTE; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
906 if (!ABSOLUTE_JUMP(opcode)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
907 tgttgt -= i + 3; /* Calc relative jump addr */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
908 if (tgttgt < 0) /* No backward relative jumps */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
909 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
910 codestr[i] = opcode; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
911 SETARG(codestr, i, tgttgt); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
912 break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
913 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
914 case EXTENDED_ARG: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
915 goto exitUnchanged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
916 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
917 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
918 case RETURN_VALUE: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
919 if (i+4 >= codelen || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
920 codestr[i+4] != RETURN_VALUE || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
921 !ISBASICBLOCK(blocks,i,5)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
922 continue; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
923 memset(codestr+i+1, NOP, 4); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
924 break; |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
925 } |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
926 } |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
927 |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
928 /* Fixup linenotab */ |
|
33875
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
929 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) { |
|
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
930 addrmap[i] = i - nops; |
|
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
931 if (codestr[i] == NOP) |
|
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
932 nops++; |
|
24fc3eaa19e0
Simplify and future proof NOP counting in the peepholer.
Raymond Hettinger <python@rcn.com>
parents:
33861
diff
changeset
|
933 } |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
934 cum_orig_line = 0; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
935 last_line = 0; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
936 for (i=0 ; i < tabsiz ; i+=2) { |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
937 cum_orig_line += lineno[i]; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
938 new_line = addrmap[cum_orig_line]; |
|
33272
bac997b79b19
Bypass peepholing of code with lineno tables having intervals >= 255.
Raymond Hettinger <python@rcn.com>
parents:
33271
diff
changeset
|
939 assert (new_line - last_line < 255); |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
940 lineno[i] =((unsigned char)(new_line - last_line)); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
941 last_line = new_line; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
942 } |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
943 |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
944 /* Remove NOPs and fixup jump targets */ |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
945 for (i=0, h=0 ; i<codelen ; ) { |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
946 opcode = codestr[i]; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
947 switch (opcode) { |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
948 case NOP: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
949 i++; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
950 continue; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
951 |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
952 case JUMP_ABSOLUTE: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
953 case CONTINUE_LOOP: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
954 j = addrmap[GETARG(codestr, i)]; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
955 SETARG(codestr, i, j); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
956 break; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
957 |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
958 case FOR_ITER: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
959 case JUMP_FORWARD: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
960 case JUMP_IF_FALSE: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
961 case JUMP_IF_TRUE: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
962 case SETUP_LOOP: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
963 case SETUP_EXCEPT: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
964 case SETUP_FINALLY: |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
965 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
966 SETARG(codestr, i, j); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
967 break; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
968 } |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
969 adj = CODESIZE(opcode); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
970 while (adj--) |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
971 codestr[h++] = codestr[i++]; |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
972 } |
|
33249
c654334dc961
Incorporate review comments courtesy of Neal Norwitz:
Raymond Hettinger <python@rcn.com>
parents:
33248
diff
changeset
|
973 assert(h + nops == codelen); |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
974 |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
975 code = PyString_FromStringAndSize((char *)codestr, h); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
976 PyMem_Free(addrmap); |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
977 PyMem_Free(codestr); |
|
31728
6509354e7876
Improve byte coding for multiple assignments.
Raymond Hettinger <python@rcn.com>
parents:
31618
diff
changeset
|
978 PyMem_Free(blocks); |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
979 return code; |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
980 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
981 exitUnchanged: |
|
33860
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
982 if (blocks != NULL) |
|
3467288089a1
Adopt some peepholer suggestions from Armin Rigo:
Raymond Hettinger <python@rcn.com>
parents:
33838
diff
changeset
|
983 PyMem_Free(blocks); |
|
33248
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
984 if (addrmap != NULL) |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
985 PyMem_Free(addrmap); |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
986 if (codestr != NULL) |
|
1f9b9c226b43
SF Patch #1013667: Cleanup Peepholer Output
Raymond Hettinger <python@rcn.com>
parents:
33169
diff
changeset
|
987 PyMem_Free(codestr); |
|
28406
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
988 Py_INCREF(code); |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
989 return code; |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
990 } |
|
733729261c41
SF patch #707257: Improve code generation
Raymond Hettinger <python@rcn.com>
parents:
28402
diff
changeset
|
991 |
|
33539
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
992 /* End: Peephole optimizations ----------------------------------------- */ |
|
2b49b4a85d9e
SF patch #1031667: Fold tuples of constants into a single constant
Raymond Hettinger <python@rcn.com>
parents:
33353
diff
changeset
|
993 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
994 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
995 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
996 Leave this debugging code for just a little longer. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
997 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
998 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
999 compiler_display_symbols(PyObject *name, PyObject *symbols) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1000 { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1001 PyObject *key, *value; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1002 int flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1003 Py_ssize_t pos = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1004 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1005 fprintf(stderr, "block %s\n", PyString_AS_STRING(name)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1006 while (PyDict_Next(symbols, &pos, &key, &value)) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1007 flags = PyInt_AsLong(value); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1008 fprintf(stderr, "var %s:", PyString_AS_STRING(key)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1009 if (flags & DEF_GLOBAL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1010 fprintf(stderr, " declared_global"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1011 if (flags & DEF_LOCAL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1012 fprintf(stderr, " local"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1013 if (flags & DEF_PARAM) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1014 fprintf(stderr, " param"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1015 if (flags & DEF_STAR) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1016 fprintf(stderr, " stararg"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1017 if (flags & DEF_DOUBLESTAR) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1018 fprintf(stderr, " starstar"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1019 if (flags & DEF_INTUPLE) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1020 fprintf(stderr, " tuple"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1021 if (flags & DEF_FREE) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1022 fprintf(stderr, " free"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1023 if (flags & DEF_FREE_GLOBAL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1024 fprintf(stderr, " global"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1025 if (flags & DEF_FREE_CLASS) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1026 fprintf(stderr, " free/class"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1027 if (flags & DEF_IMPORT) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1028 fprintf(stderr, " import"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1029 fprintf(stderr, "\n"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1030 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1031 fprintf(stderr, "\n"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1032 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1033 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1034 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1035 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1036 compiler_unit_check(struct compiler_unit *u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1037 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1038 basicblock *block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1039 for (block = u->u_blocks; block != NULL; block = block->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1040 assert(block != (void *)0xcbcbcbcb); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1041 assert(block != (void *)0xfbfbfbfb); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1042 assert(block != (void *)0xdbdbdbdb); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1043 if (block->b_instr != NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1044 assert(block->b_ialloc > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1045 assert(block->b_iused > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1046 assert(block->b_ialloc >= block->b_iused); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1047 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1048 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1049 assert (block->b_iused == 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1050 assert (block->b_ialloc == 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1051 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1052 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1053 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1054 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1055 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1056 compiler_unit_free(struct compiler_unit *u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1057 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1058 basicblock *b, *next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1059 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1060 compiler_unit_check(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1061 b = u->u_blocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1062 while (b != NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1063 if (b->b_instr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1064 PyObject_Free((void *)b->b_instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1065 next = b->b_list; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1066 PyObject_Free((void *)b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1067 b = next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1068 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1069 Py_XDECREF(u->u_ste); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1070 Py_XDECREF(u->u_name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1071 Py_XDECREF(u->u_consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1072 Py_XDECREF(u->u_names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1073 Py_XDECREF(u->u_varnames); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1074 Py_XDECREF(u->u_freevars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1075 Py_XDECREF(u->u_cellvars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1076 Py_XDECREF(u->u_private); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1077 PyObject_Free(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1078 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1079 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1080 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1081 compiler_enter_scope(struct compiler *c, identifier name, void *key, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1082 int lineno) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1083 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1084 struct compiler_unit *u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1085 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1086 u = (struct compiler_unit *)PyObject_Malloc(sizeof( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1087 struct compiler_unit)); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
1088 if (!u) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1089 PyErr_NoMemory(); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1090 return 0; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
1091 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1092 memset(u, 0, sizeof(struct compiler_unit)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1093 u->u_argcount = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1094 u->u_ste = PySymtable_Lookup(c->c_st, key); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1095 if (!u->u_ste) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1096 compiler_unit_free(u); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1097 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1098 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1099 Py_INCREF(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1100 u->u_name = name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1101 u->u_varnames = list2dict(u->u_ste->ste_varnames); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1102 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1103 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1104 PyDict_Size(u->u_cellvars)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1105 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1106 u->u_blocks = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1107 u->u_tmpname = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1108 u->u_nfblocks = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1109 u->u_firstlineno = lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1110 u->u_lineno = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1111 u->u_lineno_set = false; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1112 u->u_consts = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1113 if (!u->u_consts) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1114 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1115 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1116 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1117 u->u_names = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1118 if (!u->u_names) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1119 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1120 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1121 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1122 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1123 u->u_private = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1124 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1125 /* Push the old compiler_unit on the stack. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1126 if (c->u) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1127 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1128 if (PyList_Append(c->c_stack, wrapper) < 0) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1129 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1130 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1131 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1132 Py_DECREF(wrapper); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1133 u->u_private = c->u->u_private; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1134 Py_XINCREF(u->u_private); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1135 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1136 c->u = u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1137 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1138 c->c_nestlevel++; |
|
36173
ade46371f04b
Adjust usage of compiler_use_new_block to its return type.
Martin v. Löwis <martin@v.loewis.de>
parents:
36084
diff
changeset
|
1139 if (compiler_use_new_block(c) == NULL) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1140 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1141 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1142 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1143 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1144 |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1145 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1146 compiler_exit_scope(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1147 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1148 int n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1149 PyObject *wrapper; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1150 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1151 c->c_nestlevel--; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1152 compiler_unit_free(c->u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1153 /* Restore c->u to the parent unit. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1154 n = PyList_GET_SIZE(c->c_stack) - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1155 if (n >= 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1156 wrapper = PyList_GET_ITEM(c->c_stack, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1157 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1158 /* we are deleting from a list so this really shouldn't fail */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1159 if (PySequence_DelItem(c->c_stack, n) < 0) |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1160 Py_FatalError("compiler_exit_scope()"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1161 compiler_unit_check(c->u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1162 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1163 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1164 c->u = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1165 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1166 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1167 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1168 /* Allocate a new "anonymous" local variable. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1169 Used by list comprehensions and with statements. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1170 */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1171 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1172 static PyObject * |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1173 compiler_new_tmpname(struct compiler *c) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1174 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1175 char tmpname[256]; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1176 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1177 return PyString_FromString(tmpname); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1178 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1179 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1180 /* Allocate a new block and return a pointer to it. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1181 Returns NULL on error. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1182 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1183 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1184 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1185 compiler_new_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1186 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1187 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1188 struct compiler_unit *u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1189 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1190 u = c->u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1191 b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
1192 if (b == NULL) { |
|
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
1193 PyErr_NoMemory(); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1194 return NULL; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
1195 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1196 memset((void *)b, 0, sizeof(basicblock)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1197 /* Extend the singly linked list of blocks with new block. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1198 b->b_list = u->u_blocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1199 u->u_blocks = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1200 return b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1201 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1202 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1203 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1204 compiler_use_new_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1205 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1206 basicblock *block = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1207 if (block == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1208 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1209 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1210 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1211 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1212 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1213 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1214 compiler_next_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1215 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1216 basicblock *block = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1217 if (block == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1218 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1219 c->u->u_curblock->b_next = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1220 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1221 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1222 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1223 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1224 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1225 compiler_use_next_block(struct compiler *c, basicblock *block) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1226 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1227 assert(block != NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1228 c->u->u_curblock->b_next = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1229 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1230 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1231 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1232 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1233 /* Returns the offset of the next instruction in the current block's |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1234 b_instr array. Resizes the b_instr as necessary. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1235 Returns -1 on failure. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1236 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1237 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1238 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1239 compiler_next_instr(struct compiler *c, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1240 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1241 assert(b != NULL); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1242 if (b->b_instr == NULL) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1243 b->b_instr = (struct instr *)PyObject_Malloc( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1244 sizeof(struct instr) * DEFAULT_BLOCK_SIZE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1245 if (b->b_instr == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1246 PyErr_NoMemory(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1247 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1248 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1249 b->b_ialloc = DEFAULT_BLOCK_SIZE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1250 memset((char *)b->b_instr, 0, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1251 sizeof(struct instr) * DEFAULT_BLOCK_SIZE); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1252 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1253 else if (b->b_iused == b->b_ialloc) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1254 size_t oldsize, newsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1255 oldsize = b->b_ialloc * sizeof(struct instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1256 newsize = oldsize << 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1257 if (newsize == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1258 PyErr_NoMemory(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1259 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1260 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1261 b->b_ialloc <<= 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1262 b->b_instr = (struct instr *)PyObject_Realloc( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1263 (void *)b->b_instr, newsize); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1264 if (b->b_instr == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1265 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1266 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1267 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1268 return b->b_iused++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1269 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1270 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1271 /* Set the i_lineno member of the instruction at offse off if the |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1272 line number for the current expression/statement (?) has not |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1273 already been set. If it has been set, the call has no effect. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1274 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1275 Every time a new node is b |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1276 */ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1277 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1278 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1279 compiler_set_lineno(struct compiler *c, int off) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1280 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1281 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1282 if (c->u->u_lineno_set) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1283 return; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1284 c->u->u_lineno_set = true; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1285 b = c->u->u_curblock; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1286 b->b_instr[off].i_lineno = c->u->u_lineno; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1287 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1288 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1289 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1290 opcode_stack_effect(int opcode, int oparg) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1291 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1292 switch (opcode) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1293 case POP_TOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1294 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1295 case ROT_TWO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1296 case ROT_THREE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1297 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1298 case DUP_TOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1299 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1300 case ROT_FOUR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1301 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1302 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1303 case UNARY_POSITIVE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1304 case UNARY_NEGATIVE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1305 case UNARY_NOT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1306 case UNARY_CONVERT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1307 case UNARY_INVERT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1308 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1309 |
|
36824
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
1310 case LIST_APPEND: |
|
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
1311 return -2; |
|
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
1312 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1313 case BINARY_POWER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1314 case BINARY_MULTIPLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1315 case BINARY_MODULO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1316 case BINARY_ADD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1317 case BINARY_SUBTRACT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1318 case BINARY_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1319 case BINARY_FLOOR_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1320 case BINARY_TRUE_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1321 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1322 case INPLACE_FLOOR_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1323 case INPLACE_TRUE_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1324 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1325 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1326 case SLICE+0: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1327 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1328 case SLICE+1: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1329 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1330 case SLICE+2: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1331 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1332 case SLICE+3: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1333 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1334 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1335 case STORE_SLICE+0: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1336 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1337 case STORE_SLICE+1: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1338 return -3; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1339 case STORE_SLICE+2: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1340 return -3; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1341 case STORE_SLICE+3: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1342 return -4; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1343 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1344 case DELETE_SLICE+0: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1345 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1346 case DELETE_SLICE+1: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1347 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1348 case DELETE_SLICE+2: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1349 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1350 case DELETE_SLICE+3: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1351 return -3; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1352 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1353 case INPLACE_ADD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1354 case INPLACE_SUBTRACT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1355 case INPLACE_MULTIPLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1356 case INPLACE_MODULO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1357 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1358 case STORE_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1359 return -3; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1360 case DELETE_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1361 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1362 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1363 case BINARY_LSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1364 case BINARY_RSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1365 case BINARY_AND: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1366 case BINARY_XOR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1367 case BINARY_OR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1368 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1369 case INPLACE_POWER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1370 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1371 case GET_ITER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1372 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1373 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1374 case PRINT_EXPR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1375 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1376 case PRINT_ITEM: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1377 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1378 case PRINT_NEWLINE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1379 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1380 case PRINT_ITEM_TO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1381 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1382 case PRINT_NEWLINE_TO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1383 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1384 case INPLACE_LSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1385 case INPLACE_RSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1386 case INPLACE_AND: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1387 case INPLACE_XOR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1388 case INPLACE_OR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1389 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1390 case BREAK_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1391 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
1392 case WITH_CLEANUP: |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36824
diff
changeset
|
1393 return -1; /* XXX Sometimes more */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1394 case LOAD_LOCALS: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1395 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1396 case RETURN_VALUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1397 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1398 case IMPORT_STAR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1399 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1400 case EXEC_STMT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1401 return -3; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1402 case YIELD_VALUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1403 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1404 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1405 case POP_BLOCK: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1406 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1407 case END_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1408 return -1; /* or -2 or -3 if exception occurred */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1409 case BUILD_CLASS: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1410 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1411 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1412 case STORE_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1413 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1414 case DELETE_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1415 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1416 case UNPACK_SEQUENCE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1417 return oparg-1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1418 case FOR_ITER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1419 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1420 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1421 case STORE_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1422 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1423 case DELETE_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1424 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1425 case STORE_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1426 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1427 case DELETE_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1428 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1429 case DUP_TOPX: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1430 return oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1431 case LOAD_CONST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1432 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1433 case LOAD_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1434 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1435 case BUILD_TUPLE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1436 case BUILD_LIST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1437 return 1-oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1438 case BUILD_MAP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1439 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1440 case LOAD_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1441 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1442 case COMPARE_OP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1443 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1444 case IMPORT_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1445 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1446 case IMPORT_FROM: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1447 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1448 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1449 case JUMP_FORWARD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1450 case JUMP_IF_FALSE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1451 case JUMP_IF_TRUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1452 case JUMP_ABSOLUTE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1453 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1454 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1455 case LOAD_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1456 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1457 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1458 case CONTINUE_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1459 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1460 case SETUP_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1461 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1462 case SETUP_EXCEPT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1463 case SETUP_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1464 return 3; /* actually pushed by an exception */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1465 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1466 case LOAD_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1467 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1468 case STORE_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1469 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1470 case DELETE_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1471 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1472 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1473 case RAISE_VARARGS: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1474 return -oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1475 #define NARGS(o) (((o) % 256) + 2*((o) / 256)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1476 case CALL_FUNCTION: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1477 return -NARGS(oparg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1478 case CALL_FUNCTION_VAR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1479 case CALL_FUNCTION_KW: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1480 return -NARGS(oparg)-1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1481 case CALL_FUNCTION_VAR_KW: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1482 return -NARGS(oparg)-2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1483 #undef NARGS |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1484 case MAKE_FUNCTION: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1485 return -oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1486 case BUILD_SLICE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1487 if (oparg == 3) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1488 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1489 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1490 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1491 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1492 case MAKE_CLOSURE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1493 return -oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1494 case LOAD_CLOSURE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1495 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1496 case LOAD_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1497 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1498 case STORE_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1499 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1500 default: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1501 fprintf(stderr, "opcode = %d\n", opcode); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1502 Py_FatalError("opcode_stack_effect()"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1503 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1504 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1505 return 0; /* not reachable */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1506 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1507 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1508 /* Add an opcode with no argument. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1509 Returns 0 on failure, 1 on success. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1510 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1511 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1512 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1513 compiler_addop(struct compiler *c, int opcode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1514 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1515 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1516 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1517 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1518 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1519 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1520 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1521 b = c->u->u_curblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1522 i = &b->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1523 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1524 i->i_hasarg = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1525 if (opcode == RETURN_VALUE) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1526 b->b_return = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1527 compiler_set_lineno(c, off); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1528 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1529 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1530 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1531 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1532 compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1533 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1534 PyObject *t, *v; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
1535 Py_ssize_t arg; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1536 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1537 /* necessary to make sure types aren't coerced (e.g., int and long) */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1538 t = PyTuple_Pack(2, o, o->ob_type); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1539 if (t == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1540 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1541 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1542 v = PyDict_GetItem(dict, t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1543 if (!v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1544 arg = PyDict_Size(dict); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1545 v = PyInt_FromLong(arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1546 if (!v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1547 Py_DECREF(t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1548 return -1; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1549 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1550 if (PyDict_SetItem(dict, t, v) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1551 Py_DECREF(t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1552 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1553 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1554 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1555 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1556 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1557 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1558 arg = PyInt_AsLong(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1559 Py_DECREF(t); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1560 return arg; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1561 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1562 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1563 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1564 compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1565 PyObject *o) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1566 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1567 int arg = compiler_add_o(c, dict, o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1568 if (arg < 0) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1569 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1570 return compiler_addop_i(c, opcode, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1571 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1572 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1573 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1574 compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1575 PyObject *o) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1576 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1577 int arg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1578 PyObject *mangled = _Py_Mangle(c->u->u_private, o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1579 if (!mangled) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1580 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1581 arg = compiler_add_o(c, dict, mangled); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1582 Py_DECREF(mangled); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1583 if (arg < 0) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1584 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1585 return compiler_addop_i(c, opcode, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1586 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1587 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1588 /* Add an opcode with an integer argument. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1589 Returns 0 on failure, 1 on success. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1590 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1591 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1592 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1593 compiler_addop_i(struct compiler *c, int opcode, int oparg) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1594 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1595 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1596 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1597 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1598 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1599 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1600 i = &c->u->u_curblock->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1601 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1602 i->i_oparg = oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1603 i->i_hasarg = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1604 compiler_set_lineno(c, off); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1605 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1606 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1607 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1608 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1609 compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1610 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1611 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1612 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1613 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1614 assert(b != NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1615 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1616 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1617 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1618 i = &c->u->u_curblock->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1619 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1620 i->i_target = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1621 i->i_hasarg = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1622 if (absolute) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1623 i->i_jabs = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1624 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1625 i->i_jrel = 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1626 compiler_set_lineno(c, off); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1627 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1628 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1629 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1630 /* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1631 like to find better names.) NEW_BLOCK() creates a new block and sets |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1632 it as the current block. NEXT_BLOCK() also creates an implicit jump |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1633 from the current block to the new block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1634 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1635 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1636 /* XXX The returns inside these macros make it impossible to decref |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1637 objects created in the local function. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1638 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1639 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1640 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1641 #define NEW_BLOCK(C) { \ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1642 if (compiler_use_new_block((C)) == NULL) \ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1643 return 0; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1644 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1645 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1646 #define NEXT_BLOCK(C) { \ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1647 if (compiler_next_block((C)) == NULL) \ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1648 return 0; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1649 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1650 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1651 #define ADDOP(C, OP) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1652 if (!compiler_addop((C), (OP))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1653 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1654 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1655 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1656 #define ADDOP_IN_SCOPE(C, OP) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1657 if (!compiler_addop((C), (OP))) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1658 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1659 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1660 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1661 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1662 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1663 #define ADDOP_O(C, OP, O, TYPE) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1664 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1665 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1666 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1667 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1668 #define ADDOP_NAME(C, OP, O, TYPE) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1669 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1670 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1671 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1672 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1673 #define ADDOP_I(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1674 if (!compiler_addop_i((C), (OP), (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1675 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1676 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1677 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1678 #define ADDOP_JABS(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1679 if (!compiler_addop_j((C), (OP), (O), 1)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1680 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1681 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1682 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1683 #define ADDOP_JREL(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1684 if (!compiler_addop_j((C), (OP), (O), 0)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1685 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1686 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1687 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1688 /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1689 the ASDL name to synthesize the name of the C type and the visit function. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1690 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1691 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1692 #define VISIT(C, TYPE, V) {\ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1693 if (!compiler_visit_ ## TYPE((C), (V))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1694 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1695 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1696 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1697 #define VISIT_IN_SCOPE(C, TYPE, V) {\ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1698 if (!compiler_visit_ ## TYPE((C), (V))) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1699 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1700 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1701 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1702 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1703 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1704 #define VISIT_SLICE(C, V, CTX) {\ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1705 if (!compiler_visit_slice((C), (V), (CTX))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1706 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1707 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1708 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1709 #define VISIT_SEQ(C, TYPE, SEQ) { \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1710 int _i; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1711 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1712 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1713 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1714 if (!compiler_visit_ ## TYPE((C), elt)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1715 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1716 } \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1717 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1718 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1719 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1720 int _i; \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1721 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1722 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1723 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1724 if (!compiler_visit_ ## TYPE((C), elt)) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1725 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1726 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1727 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1728 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1729 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1730 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1731 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1732 compiler_isdocstring(stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1733 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1734 if (s->kind != Expr_kind) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1735 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1736 return s->v.Expr.value->kind == Str_kind; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1737 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1738 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1739 /* Compile a sequence of statements, checking for a docstring. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1740 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1741 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1742 compiler_body(struct compiler *c, asdl_seq *stmts) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1743 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1744 int i = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1745 stmt_ty st; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1746 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1747 if (!asdl_seq_LEN(stmts)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1748 return 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1749 st = (stmt_ty)asdl_seq_GET(stmts, 0); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1750 if (compiler_isdocstring(st)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1751 i = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1752 VISIT(c, expr, st->v.Expr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1753 if (!compiler_nameop(c, __doc__, Store)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1754 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1755 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1756 for (; i < asdl_seq_LEN(stmts); i++) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1757 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1758 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1759 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1760 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1761 static PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1762 compiler_mod(struct compiler *c, mod_ty mod) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1763 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1764 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1765 int addNone = 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1766 static PyObject *module; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1767 if (!module) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1768 module = PyString_FromString("<module>"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1769 if (!module) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1770 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1771 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1772 if (!compiler_enter_scope(c, module, mod, 1)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1773 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1774 switch (mod->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1775 case Module_kind: |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1776 if (!compiler_body(c, mod->v.Module.body)) { |
|
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1777 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1778 return 0; |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1779 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1780 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1781 case Interactive_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1782 c->c_interactive = 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1783 VISIT_SEQ_IN_SCOPE(c, stmt, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1784 mod->v.Interactive.body); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1785 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1786 case Expression_kind: |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1787 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1788 addNone = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1789 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1790 case Suite_kind: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1791 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1792 "suite should not be possible"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1793 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1794 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1795 PyErr_Format(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1796 "module kind %d should not be possible", |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1797 mod->kind); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1798 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1799 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1800 co = assemble(c, addNone); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1801 compiler_exit_scope(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1802 return co; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1803 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1804 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1805 /* The test for LOCAL must come before the test for FREE in order to |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1806 handle classes where name is both local and free. The local var is |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1807 a method and the free var is a free var referenced within a method. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1808 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1809 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1810 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1811 get_ref_type(struct compiler *c, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1812 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1813 int scope = PyST_GetScope(c->u->u_ste, name); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1814 if (scope == 0) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1815 char buf[350]; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1816 PyOS_snprintf(buf, sizeof(buf), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1817 "unknown scope for %.100s in %.100s(%s) in %s\n" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1818 "symbols: %s\nlocals: %s\nglobals: %s\n", |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1819 PyString_AS_STRING(name), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1820 PyString_AS_STRING(c->u->u_name), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1821 PyObject_REPR(c->u->u_ste->ste_id), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1822 c->c_filename, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1823 PyObject_REPR(c->u->u_ste->ste_symbols), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1824 PyObject_REPR(c->u->u_varnames), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1825 PyObject_REPR(c->u->u_names) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1826 ); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1827 Py_FatalError(buf); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1828 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1829 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1830 return scope; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1831 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1832 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1833 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1834 compiler_lookup_arg(PyObject *dict, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1835 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1836 PyObject *k, *v; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1837 k = PyTuple_Pack(2, name, name->ob_type); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1838 if (k == NULL) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1839 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1840 v = PyDict_GetItem(dict, k); |
|
35939
79374eb6db51
Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents:
35895
diff
changeset
|
1841 Py_DECREF(k); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1842 if (v == NULL) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1843 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1844 return PyInt_AS_LONG(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1845 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1846 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1847 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1848 compiler_make_closure(struct compiler *c, PyCodeObject *co, int args) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1849 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1850 int i, free = PyCode_GetNumFree(co); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1851 if (free == 0) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1852 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1853 ADDOP_I(c, MAKE_FUNCTION, args); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1854 return 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1855 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1856 for (i = 0; i < free; ++i) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1857 /* Bypass com_addop_varname because it will generate |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1858 LOAD_DEREF but LOAD_CLOSURE is needed. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1859 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1860 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1861 int arg, reftype; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1862 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1863 /* Special case: If a class contains a method with a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1864 free variable that has the same name as a method, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1865 the name will be considered free *and* local in the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1866 class. It should be handled by the closure, as |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1867 well as by the normal name loookup logic. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1868 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1869 reftype = get_ref_type(c, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1870 if (reftype == CELL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1871 arg = compiler_lookup_arg(c->u->u_cellvars, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1872 else /* (reftype == FREE) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1873 arg = compiler_lookup_arg(c->u->u_freevars, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1874 if (arg == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1875 printf("lookup %s in %s %d %d\n" |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1876 "freevars of %s: %s\n", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1877 PyObject_REPR(name), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1878 PyString_AS_STRING(c->u->u_name), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1879 reftype, arg, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1880 PyString_AS_STRING(co->co_name), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1881 PyObject_REPR(co->co_freevars)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1882 Py_FatalError("compiler_make_closure()"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1883 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1884 ADDOP_I(c, LOAD_CLOSURE, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1885 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1886 ADDOP_I(c, BUILD_TUPLE, free); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1887 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1888 ADDOP_I(c, MAKE_CLOSURE, args); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1889 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1890 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1891 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1892 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1893 compiler_decorators(struct compiler *c, asdl_seq* decos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1894 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1895 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1896 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1897 if (!decos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1898 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1899 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1900 for (i = 0; i < asdl_seq_LEN(decos); i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1901 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1902 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1903 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1904 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1905 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1906 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1907 compiler_arguments(struct compiler *c, arguments_ty args) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1908 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1909 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1910 int n = asdl_seq_LEN(args->args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1911 /* Correctly handle nested argument lists */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1912 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1913 expr_ty arg = (expr_ty)asdl_seq_GET(args->args, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1914 if (arg->kind == Tuple_kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1915 PyObject *id = PyString_FromFormat(".%d", i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1916 if (id == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1917 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1918 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1919 if (!compiler_nameop(c, id, Load)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1920 Py_DECREF(id); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1921 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1922 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1923 Py_DECREF(id); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1924 VISIT(c, expr, arg); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1925 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1926 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1927 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1928 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1929 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1930 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1931 compiler_function(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1932 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1933 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1934 PyObject *first_const = Py_None; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1935 arguments_ty args = s->v.FunctionDef.args; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1936 asdl_seq* decos = s->v.FunctionDef.decorators; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1937 stmt_ty st; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1938 int i, n, docstring; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1939 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1940 assert(s->kind == FunctionDef_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1941 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1942 if (!compiler_decorators(c, decos)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1943 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1944 if (args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1945 VISIT_SEQ(c, expr, args->defaults); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1946 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1947 s->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1948 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1949 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1950 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1951 docstring = compiler_isdocstring(st); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1952 if (docstring) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1953 first_const = st->v.Expr.value->v.Str.s; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1954 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1955 compiler_exit_scope(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1956 return 0; |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1957 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1958 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1959 /* unpack nested arguments */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1960 compiler_arguments(c, args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1961 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1962 c->u->u_argcount = asdl_seq_LEN(args->args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1963 n = asdl_seq_LEN(s->v.FunctionDef.body); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1964 /* if there was a docstring, we need to skip the first statement */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1965 for (i = docstring; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1966 stmt_ty s2 = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1967 if (i == 0 && s2->kind == Expr_kind && |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1968 s2->v.Expr.value->kind == Str_kind) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1969 continue; |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1970 VISIT_IN_SCOPE(c, stmt, s2); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1971 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1972 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1973 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1974 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1975 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1976 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1977 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1978 Py_DECREF(co); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1979 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1980 for (i = 0; i < asdl_seq_LEN(decos); i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1981 ADDOP_I(c, CALL_FUNCTION, 1); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1982 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1983 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1984 return compiler_nameop(c, s->v.FunctionDef.name, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1985 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1986 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1987 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1988 compiler_class(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1989 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1990 int n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1991 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1992 PyObject *str; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1993 /* push class name on stack, needed by BUILD_CLASS */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1994 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1995 /* push the tuple of base classes on the stack */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1996 n = asdl_seq_LEN(s->v.ClassDef.bases); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1997 if (n > 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1998 VISIT_SEQ(c, expr, s->v.ClassDef.bases); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1999 ADDOP_I(c, BUILD_TUPLE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2000 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2001 s->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2002 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2003 c->u->u_private = s->v.ClassDef.name; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2004 Py_INCREF(c->u->u_private); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2005 str = PyString_InternFromString("__name__"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2006 if (!str || !compiler_nameop(c, str, Load)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2007 Py_XDECREF(str); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2008 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2009 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2010 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2011 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2012 Py_DECREF(str); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2013 str = PyString_InternFromString("__module__"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2014 if (!str || !compiler_nameop(c, str, Store)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2015 Py_XDECREF(str); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2016 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2017 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2018 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2019 Py_DECREF(str); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2020 |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2021 if (!compiler_body(c, s->v.ClassDef.body)) { |
|
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2022 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2023 return 0; |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2024 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2025 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
2026 ADDOP_IN_SCOPE(c, LOAD_LOCALS); |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
2027 ADDOP_IN_SCOPE(c, RETURN_VALUE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2028 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2029 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2030 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2031 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2032 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2033 compiler_make_closure(c, co, 0); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2034 Py_DECREF(co); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2035 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2036 ADDOP_I(c, CALL_FUNCTION, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2037 ADDOP(c, BUILD_CLASS); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2038 if (!compiler_nameop(c, s->v.ClassDef.name, Store)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2039 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2040 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2041 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2042 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2043 static int |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2044 compiler_ifexp(struct compiler *c, expr_ty e) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2045 { |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2046 basicblock *end, *next; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2047 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2048 assert(e->kind == IfExp_kind); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2049 end = compiler_new_block(c); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2050 if (end == NULL) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2051 return 0; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2052 next = compiler_new_block(c); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2053 if (next == NULL) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2054 return 0; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2055 VISIT(c, expr, e->v.IfExp.test); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2056 ADDOP_JREL(c, JUMP_IF_FALSE, next); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2057 ADDOP(c, POP_TOP); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2058 VISIT(c, expr, e->v.IfExp.body); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2059 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2060 compiler_use_next_block(c, next); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2061 ADDOP(c, POP_TOP); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2062 VISIT(c, expr, e->v.IfExp.orelse); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2063 compiler_use_next_block(c, end); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2064 return 1; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2065 } |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2066 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
2067 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2068 compiler_lambda(struct compiler *c, expr_ty e) |
| 69 | 2069 { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
2070 PyCodeObject *co; |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2071 static identifier name; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2072 arguments_ty args = e->v.Lambda.args; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2073 assert(e->kind == Lambda_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2074 |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2075 if (!name) { |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2076 name = PyString_InternFromString("<lambda>"); |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2077 if (!name) |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2078 return 0; |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
2079 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2080 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2081 if (args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2082 VISIT_SEQ(c, expr, args->defaults); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2083 if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2084 return 0; |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2085 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2086 /* unpack nested arguments */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2087 compiler_arguments(c, args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2088 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2089 c->u->u_argcount = asdl_seq_LEN(args->args); |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
2090 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
2091 ADDOP_IN_SCOPE(c, RETURN_VALUE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2092 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
2093 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2094 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2095 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2096 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2097 compiler_make_closure(c, co, asdl_seq_LEN(args->defaults)); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2098 Py_DECREF(co); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2099 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2100 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2101 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2102 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2103 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2104 compiler_print(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2105 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2106 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2107 bool dest; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2108 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2109 assert(s->kind == Print_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2110 n = asdl_seq_LEN(s->v.Print.values); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2111 dest = false; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2112 if (s->v.Print.dest) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2113 VISIT(c, expr, s->v.Print.dest); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2114 dest = true; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2115 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2116 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2117 expr_ty e = (expr_ty)asdl_seq_GET(s->v.Print.values, i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2118 if (dest) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2119 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2120 VISIT(c, expr, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2121 ADDOP(c, ROT_TWO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2122 ADDOP(c, PRINT_ITEM_TO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2123 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2124 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2125 VISIT(c, expr, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2126 ADDOP(c, PRINT_ITEM); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2127 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2128 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2129 if (s->v.Print.nl) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2130 if (dest) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2131 ADDOP(c, PRINT_NEWLINE_TO) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2132 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2133 ADDOP(c, PRINT_NEWLINE) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2134 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2135 else if (dest) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2136 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2137 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2138 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2139 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2140 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2141 compiler_if(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2142 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2143 basicblock *end, *next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2144 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2145 assert(s->kind == If_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2146 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2147 if (end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2148 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2149 next = compiler_new_block(c); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2150 if (next == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2151 return 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2152 VISIT(c, expr, s->v.If.test); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2153 ADDOP_JREL(c, JUMP_IF_FALSE, next); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2154 ADDOP(c, POP_TOP); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2155 VISIT_SEQ(c, stmt, s->v.If.body); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2156 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2157 compiler_use_next_block(c, next); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2158 ADDOP(c, POP_TOP); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2159 if (s->v.If.orelse) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2160 VISIT_SEQ(c, stmt, s->v.If.orelse); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2161 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2162 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2163 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2164 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2165 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2166 compiler_for(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2167 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2168 basicblock *start, *cleanup, *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2169 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2170 start = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2171 cleanup = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2172 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2173 if (start == NULL || end == NULL || cleanup == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2174 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2175 ADDOP_JREL(c, SETUP_LOOP, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2176 if (!compiler_push_fblock(c, LOOP, start)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2177 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2178 VISIT(c, expr, s->v.For.iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2179 ADDOP(c, GET_ITER); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2180 compiler_use_next_block(c, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2181 ADDOP_JREL(c, FOR_ITER, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2182 VISIT(c, expr, s->v.For.target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2183 VISIT_SEQ(c, stmt, s->v.For.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2184 ADDOP_JABS(c, JUMP_ABSOLUTE, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2185 compiler_use_next_block(c, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2186 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2187 compiler_pop_fblock(c, LOOP, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2188 VISIT_SEQ(c, stmt, s->v.For.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2189 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2190 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2191 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2192 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2193 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2194 compiler_while(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2195 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2196 basicblock *loop, *orelse, *end, *anchor = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2197 int constant = expr_constant(s->v.While.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2198 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2199 if (constant == 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2200 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2201 loop = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2202 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2203 if (constant == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2204 anchor = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2205 if (anchor == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2206 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2207 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2208 if (loop == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2209 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2210 if (s->v.While.orelse) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2211 orelse = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2212 if (orelse == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2213 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2214 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2215 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2216 orelse = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2217 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2218 ADDOP_JREL(c, SETUP_LOOP, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2219 compiler_use_next_block(c, loop); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2220 if (!compiler_push_fblock(c, LOOP, loop)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2221 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2222 if (constant == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2223 VISIT(c, expr, s->v.While.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2224 ADDOP_JREL(c, JUMP_IF_FALSE, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2225 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2226 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2227 VISIT_SEQ(c, stmt, s->v.While.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2228 ADDOP_JABS(c, JUMP_ABSOLUTE, loop); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2229 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2230 /* XXX should the two POP instructions be in a separate block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2231 if there is no else clause ? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2232 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2233 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2234 if (constant == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2235 compiler_use_next_block(c, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2236 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2237 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2238 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2239 compiler_pop_fblock(c, LOOP, loop); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2240 if (orelse != NULL) /* what if orelse is just pass? */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2241 VISIT_SEQ(c, stmt, s->v.While.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2242 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2243 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2244 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2245 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2246 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2247 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2248 compiler_continue(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2249 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2250 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop"; |
| 69 | 2251 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2252 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2253 if (!c->u->u_nfblocks) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2254 return compiler_error(c, LOOP_ERROR_MSG); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2255 i = c->u->u_nfblocks - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2256 switch (c->u->u_fblock[i].fb_type) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2257 case LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2258 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2259 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2260 case EXCEPT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2261 case FINALLY_TRY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2262 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2263 ; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2264 if (i == -1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2265 return compiler_error(c, LOOP_ERROR_MSG); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2266 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2267 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2268 case FINALLY_END: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2269 return compiler_error(c, |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2270 "'continue' not supported inside 'finally' clause"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2271 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2272 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2273 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2274 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2275 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2276 /* Code generated for "try: <body> finally: <finalbody>" is as follows: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2277 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2278 SETUP_FINALLY L |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2279 <code for body> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2280 POP_BLOCK |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2281 LOAD_CONST <None> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2282 L: <code for finalbody> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2283 END_FINALLY |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2284 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2285 The special instructions use the block stack. Each block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2286 stack entry contains the instruction that created it (here |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2287 SETUP_FINALLY), the level of the value stack at the time the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2288 block stack entry was created, and a label (here L). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2289 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2290 SETUP_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2291 Pushes the current value stack level and the label |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2292 onto the block stack. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2293 POP_BLOCK: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2294 Pops en entry from the block stack, and pops the value |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2295 stack until its level is the same as indicated on the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2296 block stack. (The label is ignored.) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2297 END_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2298 Pops a variable number of entries from the *value* stack |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2299 and re-raises the exception they specify. The number of |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2300 entries popped depends on the (pseudo) exception type. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2301 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2302 The block stack is unwound when an exception is raised: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2303 when a SETUP_FINALLY entry is found, the exception is pushed |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2304 onto the value stack (and the exception condition is cleared), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2305 and the interpreter jumps to the label gotten from the block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2306 stack. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2307 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2308 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2309 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2310 compiler_try_finally(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2311 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2312 basicblock *body, *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2313 body = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2314 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2315 if (body == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2316 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2317 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2318 ADDOP_JREL(c, SETUP_FINALLY, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2319 compiler_use_next_block(c, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2320 if (!compiler_push_fblock(c, FINALLY_TRY, body)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2321 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2322 VISIT_SEQ(c, stmt, s->v.TryFinally.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2323 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2324 compiler_pop_fblock(c, FINALLY_TRY, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2325 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2326 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2327 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2328 if (!compiler_push_fblock(c, FINALLY_END, end)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2329 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2330 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2331 ADDOP(c, END_FINALLY); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2332 compiler_pop_fblock(c, FINALLY_END, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2333 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2334 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2335 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2336 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2337 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2338 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...": |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2339 (The contents of the value stack is shown in [], with the top |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2340 at the right; 'tb' is trace-back info, 'val' the exception's |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2341 associated value, and 'exc' the exception.) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2342 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2343 Value stack Label Instruction Argument |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2344 [] SETUP_EXCEPT L1 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2345 [] <code for S> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2346 [] POP_BLOCK |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2347 [] JUMP_FORWARD L0 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2348 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2349 [tb, val, exc] L1: DUP ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2350 [tb, val, exc, exc] <evaluate E1> ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2351 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2352 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2353 [tb, val, exc, 1] POP ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2354 [tb, val, exc] POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2355 [tb, val] <assign to V1> (or POP if no V1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2356 [tb] POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2357 [] <code for S1> |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2358 JUMP_FORWARD L0 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2359 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2360 [tb, val, exc, 0] L2: POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2361 [tb, val, exc] DUP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2362 .............................etc....................... |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2363 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2364 [tb, val, exc, 0] Ln+1: POP |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2365 [tb, val, exc] END_FINALLY # re-raise exception |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2366 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2367 [] L0: <next statement> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2368 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2369 Of course, parts are not generated if Vi or Ei is not present. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2370 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2371 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2372 compiler_try_except(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2373 { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2374 basicblock *body, *orelse, *except, *end; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2375 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2376 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2377 body = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2378 except = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2379 orelse = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2380 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2381 if (body == NULL || except == NULL || orelse == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2382 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2383 ADDOP_JREL(c, SETUP_EXCEPT, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2384 compiler_use_next_block(c, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2385 if (!compiler_push_fblock(c, EXCEPT, body)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2386 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2387 VISIT_SEQ(c, stmt, s->v.TryExcept.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2388 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2389 compiler_pop_fblock(c, EXCEPT, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2390 ADDOP_JREL(c, JUMP_FORWARD, orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2391 n = asdl_seq_LEN(s->v.TryExcept.handlers); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2392 compiler_use_next_block(c, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2393 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2394 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2395 s->v.TryExcept.handlers, i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2396 if (!handler->type && i < n-1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2397 return compiler_error(c, "default 'except:' must be last"); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2398 c->u->u_lineno_set = false; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2399 c->u->u_lineno = handler->lineno; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2400 except = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2401 if (except == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2402 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2403 if (handler->type) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2404 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2405 VISIT(c, expr, handler->type); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2406 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2407 ADDOP_JREL(c, JUMP_IF_FALSE, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2408 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2409 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2410 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2411 if (handler->name) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2412 VISIT(c, expr, handler->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2413 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2414 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2415 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2416 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2417 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2418 VISIT_SEQ(c, stmt, handler->body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2419 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2420 compiler_use_next_block(c, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2421 if (handler->type) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2422 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2423 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2424 ADDOP(c, END_FINALLY); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2425 compiler_use_next_block(c, orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2426 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2427 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2428 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2429 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2430 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2431 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2432 compiler_import_as(struct compiler *c, identifier name, identifier asname) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2433 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2434 /* The IMPORT_NAME opcode was already generated. This function |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2435 merely needs to bind the result to a name. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2436 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2437 If there is a dot in name, we need to split it and emit a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2438 LOAD_ATTR for each name. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2439 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2440 const char *src = PyString_AS_STRING(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2441 const char *dot = strchr(src, '.'); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2442 if (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2443 /* Consume the base module name to get the first attribute */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2444 src = dot + 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2445 while (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2446 /* NB src is only defined when dot != NULL */ |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35742
diff
changeset
|
2447 PyObject *attr; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2448 dot = strchr(src, '.'); |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35742
diff
changeset
|
2449 attr = PyString_FromStringAndSize(src, |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2450 dot ? dot - src : strlen(src)); |
|
35895
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2451 if (!attr) |
|
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2452 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2453 ADDOP_O(c, LOAD_ATTR, attr, names); |
|
35895
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2454 Py_DECREF(attr); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2455 src = dot + 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2456 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2457 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2458 return compiler_nameop(c, asname, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2459 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2460 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2461 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2462 compiler_import(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2463 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2464 /* The Import node stores a module name like a.b.c as a single |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2465 string. This is convenient for all cases except |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2466 import a.b.c as d |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2467 where we need to parse that string to extract the individual |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2468 module names. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2469 XXX Perhaps change the representation to make this case simpler? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2470 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2471 int i, n = asdl_seq_LEN(s->v.Import.names); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2472 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2473 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2474 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2475 int r; |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2476 PyObject *level; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2477 |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2478 level = PyInt_FromLong(0); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2479 if (level == NULL) |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2480 return 0; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2481 |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2482 ADDOP_O(c, LOAD_CONST, level, consts); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2483 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2484 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2485 ADDOP_NAME(c, IMPORT_NAME, alias->name, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2486 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2487 if (alias->asname) { |
|
35772
f64fb284ed15
Don't stop generating code for import statements after the first "import as"
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35767
diff
changeset
|
2488 r = compiler_import_as(c, alias->name, alias->asname); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2489 if (!r) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2490 return r; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2491 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2492 else { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2493 identifier tmp = alias->name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2494 const char *base = PyString_AS_STRING(alias->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2495 char *dot = strchr(base, '.'); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2496 if (dot) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2497 tmp = PyString_FromStringAndSize(base, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2498 dot - base); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2499 r = compiler_nameop(c, tmp, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2500 if (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2501 Py_DECREF(tmp); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2502 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2503 if (!r) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2504 return r; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2505 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2506 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2507 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2508 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2509 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2510 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2511 compiler_from_import(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2512 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2513 int i, n = asdl_seq_LEN(s->v.ImportFrom.names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2514 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2515 PyObject *names = PyTuple_New(n); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2516 PyObject *level; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2517 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2518 if (!names) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2519 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2520 |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2521 level = PyInt_FromLong(s->v.ImportFrom.level); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2522 if (!level) { |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2523 Py_DECREF(names); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2524 return 0; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2525 } |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2526 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2527 /* build up the names */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2528 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2529 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2530 Py_INCREF(alias->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2531 PyTuple_SET_ITEM(names, i, alias->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2532 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2533 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2534 if (s->lineno > c->c_future->ff_lineno) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2535 if (!strcmp(PyString_AS_STRING(s->v.ImportFrom.module), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2536 "__future__")) { |
|
36804
c552f2275782
Fix refleak if from __future__ import was not first
Neal Norwitz <nnorwitz@gmail.com>
parents:
36797
diff
changeset
|
2537 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2538 Py_DECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2539 return compiler_error(c, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2540 "from __future__ imports must occur " |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2541 "at the beginning of the file"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2542 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2543 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2544 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2545 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2546 ADDOP_O(c, LOAD_CONST, level, consts); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2547 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2548 ADDOP_O(c, LOAD_CONST, names, consts); |
|
35939
79374eb6db51
Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents:
35895
diff
changeset
|
2549 Py_DECREF(names); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2550 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2551 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2552 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2553 identifier store_name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2554 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2555 if (i == 0 && *PyString_AS_STRING(alias->name) == '*') { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2556 assert(n == 1); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2557 ADDOP(c, IMPORT_STAR); |
|
35993
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2558 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2559 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2560 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2561 ADDOP_NAME(c, IMPORT_FROM, alias->name, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2562 store_name = alias->name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2563 if (alias->asname) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2564 store_name = alias->asname; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2565 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2566 if (!compiler_nameop(c, store_name, Store)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2567 Py_DECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2568 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2569 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2570 } |
|
35993
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2571 /* remove imported module */ |
|
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2572 ADDOP(c, POP_TOP); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2573 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2574 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2575 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2576 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2577 compiler_assert(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2578 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2579 static PyObject *assertion_error = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2580 basicblock *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2581 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2582 if (Py_OptimizeFlag) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2583 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2584 if (assertion_error == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2585 assertion_error = PyString_FromString("AssertionError"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2586 if (assertion_error == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2587 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2588 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2589 VISIT(c, expr, s->v.Assert.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2590 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2591 if (end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2592 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2593 ADDOP_JREL(c, JUMP_IF_TRUE, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2594 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2595 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2596 if (s->v.Assert.msg) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2597 VISIT(c, expr, s->v.Assert.msg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2598 ADDOP_I(c, RAISE_VARARGS, 2); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2599 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2600 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2601 ADDOP_I(c, RAISE_VARARGS, 1); |
|
9293
0a67db47e1d0
Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents:
9215
diff
changeset
|
2602 } |
|
36081
19d96c2d7df5
Fix Armin's bug 1333982. He found it, he didn't created it :-)
Neal Norwitz <nnorwitz@gmail.com>
parents:
36079
diff
changeset
|
2603 compiler_use_next_block(c, end); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2604 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2605 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2606 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2607 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2608 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2609 compiler_visit_stmt(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2610 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2611 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2612 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2613 /* Always assign a lineno to the next instruction for a stmt. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2614 c->u->u_lineno = s->lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2615 c->u->u_lineno_set = false; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2616 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2617 switch (s->kind) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2618 case FunctionDef_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2619 return compiler_function(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2620 case ClassDef_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2621 return compiler_class(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2622 case Return_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2623 if (c->u->u_ste->ste_type != FunctionBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2624 return compiler_error(c, "'return' outside function"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2625 if (s->v.Return.value) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2626 if (c->u->u_ste->ste_generator) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2627 return compiler_error(c, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2628 "'return' with argument inside generator"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2629 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2630 VISIT(c, expr, s->v.Return.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2631 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2632 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2633 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2634 ADDOP(c, RETURN_VALUE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2635 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2636 case Delete_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2637 VISIT_SEQ(c, expr, s->v.Delete.targets) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2638 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2639 case Assign_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2640 n = asdl_seq_LEN(s->v.Assign.targets); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2641 VISIT(c, expr, s->v.Assign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2642 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2643 if (i < n - 1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2644 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2645 VISIT(c, expr, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2646 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2647 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2648 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2649 case AugAssign_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2650 return compiler_augassign(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2651 case Print_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2652 return compiler_print(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2653 case For_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2654 return compiler_for(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2655 case While_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2656 return compiler_while(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2657 case If_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2658 return compiler_if(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2659 case Raise_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2660 n = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2661 if (s->v.Raise.type) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2662 VISIT(c, expr, s->v.Raise.type); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2663 n++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2664 if (s->v.Raise.inst) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2665 VISIT(c, expr, s->v.Raise.inst); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2666 n++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2667 if (s->v.Raise.tback) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2668 VISIT(c, expr, s->v.Raise.tback); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2669 n++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2670 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2671 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2672 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2673 ADDOP_I(c, RAISE_VARARGS, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2674 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2675 case TryExcept_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2676 return compiler_try_except(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2677 case TryFinally_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2678 return compiler_try_finally(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2679 case Assert_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2680 return compiler_assert(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2681 case Import_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2682 return compiler_import(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2683 case ImportFrom_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2684 return compiler_from_import(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2685 case Exec_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2686 VISIT(c, expr, s->v.Exec.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2687 if (s->v.Exec.globals) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2688 VISIT(c, expr, s->v.Exec.globals); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2689 if (s->v.Exec.locals) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2690 VISIT(c, expr, s->v.Exec.locals); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2691 } else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2692 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2693 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2694 } else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2695 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2696 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2697 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2698 ADDOP(c, EXEC_STMT); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2699 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2700 case Global_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2701 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2702 case Expr_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2703 VISIT(c, expr, s->v.Expr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2704 if (c->c_interactive && c->c_nestlevel <= 1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2705 ADDOP(c, PRINT_EXPR); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2706 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2707 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2708 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2709 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2710 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2711 case Pass_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2712 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2713 case Break_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2714 if (!c->u->u_nfblocks) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2715 return compiler_error(c, "'break' outside loop"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2716 ADDOP(c, BREAK_LOOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2717 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2718 case Continue_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2719 return compiler_continue(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2720 case With_kind: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2721 return compiler_with(c, s); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2722 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2723 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2724 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2725 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2726 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2727 unaryop(unaryop_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2728 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2729 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2730 case Invert: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2731 return UNARY_INVERT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2732 case Not: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2733 return UNARY_NOT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2734 case UAdd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2735 return UNARY_POSITIVE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2736 case USub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2737 return UNARY_NEGATIVE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2738 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2739 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2740 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2741 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2742 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2743 binop(struct compiler *c, operator_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2744 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2745 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2746 case Add: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2747 return BINARY_ADD; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2748 case Sub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2749 return BINARY_SUBTRACT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2750 case Mult: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2751 return BINARY_MULTIPLY; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2752 case Div: |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2753 return BINARY_TRUE_DIVIDE; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2754 case Mod: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2755 return BINARY_MODULO; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2756 case Pow: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2757 return BINARY_POWER; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2758 case LShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2759 return BINARY_LSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2760 case RShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2761 return BINARY_RSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2762 case BitOr: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2763 return BINARY_OR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2764 case BitXor: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2765 return BINARY_XOR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2766 case BitAnd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2767 return BINARY_AND; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2768 case FloorDiv: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2769 return BINARY_FLOOR_DIVIDE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2770 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2771 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2772 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2773 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2774 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2775 cmpop(cmpop_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2776 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2777 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2778 case Eq: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2779 return PyCmp_EQ; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2780 case NotEq: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2781 return PyCmp_NE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2782 case Lt: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2783 return PyCmp_LT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2784 case LtE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2785 return PyCmp_LE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2786 case Gt: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2787 return PyCmp_GT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2788 case GtE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2789 return PyCmp_GE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2790 case Is: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2791 return PyCmp_IS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2792 case IsNot: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2793 return PyCmp_IS_NOT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2794 case In: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2795 return PyCmp_IN; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2796 case NotIn: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2797 return PyCmp_NOT_IN; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2798 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2799 return PyCmp_BAD; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2800 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2801 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2802 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2803 inplace_binop(struct compiler *c, operator_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2804 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2805 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2806 case Add: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2807 return INPLACE_ADD; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2808 case Sub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2809 return INPLACE_SUBTRACT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2810 case Mult: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2811 return INPLACE_MULTIPLY; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2812 case Div: |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2813 return INPLACE_TRUE_DIVIDE; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2814 case Mod: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2815 return INPLACE_MODULO; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2816 case Pow: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2817 return INPLACE_POWER; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2818 case LShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2819 return INPLACE_LSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2820 case RShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2821 return INPLACE_RSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2822 case BitOr: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2823 return INPLACE_OR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2824 case BitXor: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2825 return INPLACE_XOR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2826 case BitAnd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2827 return INPLACE_AND; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2828 case FloorDiv: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2829 return INPLACE_FLOOR_DIVIDE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2830 } |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2831 PyErr_Format(PyExc_SystemError, |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2832 "inplace binary op %d should not be possible", op); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2833 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2834 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2835 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2836 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2837 compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2838 { |
|
35781
31d36dd5959c
Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35779
diff
changeset
|
2839 int op, scope, arg; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2840 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2841 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2842 PyObject *dict = c->u->u_names; |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2843 PyObject *mangled; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2844 /* XXX AugStore isn't used anywhere! */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2845 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2846 /* First check for assignment to __debug__. Param? */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2847 if ((ctx == Store || ctx == AugStore || ctx == Del) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2848 && !strcmp(PyString_AS_STRING(name), "__debug__")) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2849 return compiler_error(c, "can not assign to __debug__"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2850 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2851 |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2852 mangled = _Py_Mangle(c->u->u_private, name); |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2853 if (!mangled) |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2854 return 0; |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2855 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2856 op = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2857 optype = OP_NAME; |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2858 scope = PyST_GetScope(c->u->u_ste, mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2859 switch (scope) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2860 case FREE: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2861 dict = c->u->u_freevars; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2862 optype = OP_DEREF; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2863 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2864 case CELL: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2865 dict = c->u->u_cellvars; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2866 optype = OP_DEREF; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2867 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2868 case LOCAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2869 if (c->u->u_ste->ste_type == FunctionBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2870 optype = OP_FAST; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2871 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2872 case GLOBAL_IMPLICIT: |
|
35773
0aef351223da
Fix arigo's funky LOAD_NAME bug: implicit globals inside classes have
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35772
diff
changeset
|
2873 if (c->u->u_ste->ste_type == FunctionBlock && |
|
0aef351223da
Fix arigo's funky LOAD_NAME bug: implicit globals inside classes have
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35772
diff
changeset
|
2874 !c->u->u_ste->ste_unoptimized) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2875 optype = OP_GLOBAL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2876 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2877 case GLOBAL_EXPLICIT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2878 optype = OP_GLOBAL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2879 break; |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2880 default: |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2881 /* scope can be 0 */ |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2882 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2883 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2884 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2885 /* XXX Leave assert here, but handle __doc__ and the like better */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2886 assert(scope || PyString_AS_STRING(name)[0] == '_'); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2887 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2888 switch (optype) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2889 case OP_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2890 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2891 case Load: op = LOAD_DEREF; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2892 case Store: op = STORE_DEREF; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2893 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2894 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2895 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2896 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2897 PyErr_Format(PyExc_SyntaxError, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2898 "can not delete variable '%s' referenced " |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2899 "in nested scope", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2900 PyString_AS_STRING(name)); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2901 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2902 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2903 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2904 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2905 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2906 "param invalid for deref variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2907 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2908 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2909 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2910 case OP_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2911 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2912 case Load: op = LOAD_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2913 case Store: op = STORE_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2914 case Del: op = DELETE_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2915 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2916 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2917 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2918 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2919 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2920 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2921 "param invalid for local variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2922 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2923 } |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2924 ADDOP_O(c, op, mangled, varnames); |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2925 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2926 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2927 case OP_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2928 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2929 case Load: op = LOAD_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2930 case Store: op = STORE_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2931 case Del: op = DELETE_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2932 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2933 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2934 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2935 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2936 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2937 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2938 "param invalid for global variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2939 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2940 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2941 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2942 case OP_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2943 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2944 case Load: op = LOAD_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2945 case Store: op = STORE_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2946 case Del: op = DELETE_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2947 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2948 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2949 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2950 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2951 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2952 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2953 "param invalid for name variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2954 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2955 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2956 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2957 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2958 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2959 assert(op); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2960 arg = compiler_add_o(c, dict, mangled); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2961 Py_DECREF(mangled); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2962 if (arg < 0) |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2963 return 0; |
|
35781
31d36dd5959c
Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35779
diff
changeset
|
2964 return compiler_addop_i(c, op, arg); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2965 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2966 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2967 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2968 compiler_boolop(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2969 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2970 basicblock *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2971 int jumpi, i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2972 asdl_seq *s; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2973 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2974 assert(e->kind == BoolOp_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2975 if (e->v.BoolOp.op == And) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2976 jumpi = JUMP_IF_FALSE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2977 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2978 jumpi = JUMP_IF_TRUE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2979 end = compiler_new_block(c); |
|
36173
ade46371f04b
Adjust usage of compiler_use_new_block to its return type.
Martin v. Löwis <martin@v.loewis.de>
parents:
36084
diff
changeset
|
2980 if (end == NULL) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2981 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2982 s = e->v.BoolOp.values; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2983 n = asdl_seq_LEN(s) - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2984 for (i = 0; i < n; ++i) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2985 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2986 ADDOP_JREL(c, jumpi, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2987 ADDOP(c, POP_TOP) |
| 69 | 2988 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2989 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2990 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2991 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2992 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2993 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2994 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2995 compiler_list(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2996 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2997 int n = asdl_seq_LEN(e->v.List.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2998 if (e->v.List.ctx == Store) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2999 ADDOP_I(c, UNPACK_SEQUENCE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3000 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3001 VISIT_SEQ(c, expr, e->v.List.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3002 if (e->v.List.ctx == Load) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3003 ADDOP_I(c, BUILD_LIST, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3004 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3005 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3006 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3007 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3008 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3009 compiler_tuple(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3010 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3011 int n = asdl_seq_LEN(e->v.Tuple.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3012 if (e->v.Tuple.ctx == Store) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3013 ADDOP_I(c, UNPACK_SEQUENCE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3014 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3015 VISIT_SEQ(c, expr, e->v.Tuple.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3016 if (e->v.Tuple.ctx == Load) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3017 ADDOP_I(c, BUILD_TUPLE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3018 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3019 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3020 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3021 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3022 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3023 compiler_compare(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3024 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3025 int i, n; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3026 basicblock *cleanup = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3027 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3028 /* XXX the logic can be cleaned up for 1 or multiple comparisons */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3029 VISIT(c, expr, e->v.Compare.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3030 n = asdl_seq_LEN(e->v.Compare.ops); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3031 assert(n > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3032 if (n > 1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3033 cleanup = compiler_new_block(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3034 if (cleanup == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3035 return 0; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3036 VISIT(c, expr, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3037 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3038 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3039 for (i = 1; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3040 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3041 ADDOP(c, ROT_THREE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3042 ADDOP_I(c, COMPARE_OP, |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3043 cmpop((cmpop_ty)(asdl_seq_GET( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3044 e->v.Compare.ops, i - 1)))); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3045 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3046 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3047 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3048 if (i < (n - 1)) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3049 VISIT(c, expr, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3050 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3051 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3052 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3053 ADDOP_I(c, COMPARE_OP, |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3054 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1)))); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3055 if (n > 1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3056 basicblock *end = compiler_new_block(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3057 if (end == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3058 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3059 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3060 compiler_use_next_block(c, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3061 ADDOP(c, ROT_TWO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3062 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3063 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3064 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3065 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3066 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3067 #undef CMPCAST |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3068 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3069 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3070 compiler_call(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3071 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3072 int n, code = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3073 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3074 VISIT(c, expr, e->v.Call.func); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3075 n = asdl_seq_LEN(e->v.Call.args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3076 VISIT_SEQ(c, expr, e->v.Call.args); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3077 if (e->v.Call.keywords) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3078 VISIT_SEQ(c, keyword, e->v.Call.keywords); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3079 n |= asdl_seq_LEN(e->v.Call.keywords) << 8; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3080 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3081 if (e->v.Call.starargs) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3082 VISIT(c, expr, e->v.Call.starargs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3083 code |= 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3084 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3085 if (e->v.Call.kwargs) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3086 VISIT(c, expr, e->v.Call.kwargs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3087 code |= 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3088 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3089 switch (code) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3090 case 0: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3091 ADDOP_I(c, CALL_FUNCTION, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3092 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3093 case 1: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3094 ADDOP_I(c, CALL_FUNCTION_VAR, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3095 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3096 case 2: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3097 ADDOP_I(c, CALL_FUNCTION_KW, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3098 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3099 case 3: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3100 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3101 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3102 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3103 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3104 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3105 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3106 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3107 compiler_listcomp_generator(struct compiler *c, PyObject *tmpname, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3108 asdl_seq *generators, int gen_index, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3109 expr_ty elt) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3110 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3111 /* generate code for the iterator, then each of the ifs, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3112 and then write to the element */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3113 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3114 comprehension_ty l; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3115 basicblock *start, *anchor, *skip, *if_cleanup; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3116 int i, n; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3117 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3118 start = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3119 skip = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3120 if_cleanup = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3121 anchor = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3122 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3123 if (start == NULL || skip == NULL || if_cleanup == NULL || |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3124 anchor == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3125 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3126 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3127 l = (comprehension_ty)asdl_seq_GET(generators, gen_index); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3128 VISIT(c, expr, l->iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3129 ADDOP(c, GET_ITER); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3130 compiler_use_next_block(c, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3131 ADDOP_JREL(c, FOR_ITER, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3132 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3133 VISIT(c, expr, l->target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3134 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3135 /* XXX this needs to be cleaned up...a lot! */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3136 n = asdl_seq_LEN(l->ifs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3137 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3138 expr_ty e = (expr_ty)asdl_seq_GET(l->ifs, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3139 VISIT(c, expr, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3140 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3141 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3142 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3143 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3144 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3145 if (++gen_index < asdl_seq_LEN(generators)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3146 if (!compiler_listcomp_generator(c, tmpname, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3147 generators, gen_index, elt)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3148 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3149 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3150 /* only append after the last for generator */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3151 if (gen_index >= asdl_seq_LEN(generators)) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3152 if (!compiler_nameop(c, tmpname, Load)) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3153 return 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3154 VISIT(c, expr, elt); |
|
36824
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
3155 ADDOP(c, LIST_APPEND); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3156 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3157 compiler_use_next_block(c, skip); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3158 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3159 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3160 ADDOP_I(c, JUMP_FORWARD, 1); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3161 if (i == 0) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3162 compiler_use_next_block(c, if_cleanup); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3163 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3164 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3165 ADDOP_JABS(c, JUMP_ABSOLUTE, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3166 compiler_use_next_block(c, anchor); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3167 /* delete the append method added to locals */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3168 if (gen_index == 1) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3169 if (!compiler_nameop(c, tmpname, Del)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3170 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3171 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3172 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3173 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3174 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3175 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3176 compiler_listcomp(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3177 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3178 identifier tmp; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3179 int rc = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3180 static identifier append; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3181 asdl_seq *generators = e->v.ListComp.generators; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3182 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3183 assert(e->kind == ListComp_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3184 if (!append) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3185 append = PyString_InternFromString("append"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3186 if (!append) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3187 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3188 } |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3189 tmp = compiler_new_tmpname(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3190 if (!tmp) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3191 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3192 ADDOP_I(c, BUILD_LIST, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3193 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3194 if (compiler_nameop(c, tmp, Store)) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3195 rc = compiler_listcomp_generator(c, tmp, generators, 0, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3196 e->v.ListComp.elt); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3197 Py_DECREF(tmp); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3198 return rc; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3199 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3200 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3201 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3202 compiler_genexp_generator(struct compiler *c, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3203 asdl_seq *generators, int gen_index, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3204 expr_ty elt) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3205 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3206 /* generate code for the iterator, then each of the ifs, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3207 and then write to the element */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3208 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3209 comprehension_ty ge; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3210 basicblock *start, *anchor, *skip, *if_cleanup, *end; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3211 int i, n; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3212 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3213 start = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3214 skip = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3215 if_cleanup = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3216 anchor = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3217 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3218 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3219 if (start == NULL || skip == NULL || if_cleanup == NULL || |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3220 anchor == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3221 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3222 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3223 ge = (comprehension_ty)asdl_seq_GET(generators, gen_index); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3224 ADDOP_JREL(c, SETUP_LOOP, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3225 if (!compiler_push_fblock(c, LOOP, start)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3226 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3227 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3228 if (gen_index == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3229 /* Receive outermost iter as an implicit argument */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3230 c->u->u_argcount = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3231 ADDOP_I(c, LOAD_FAST, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3232 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3233 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3234 /* Sub-iter - calculate on the fly */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3235 VISIT(c, expr, ge->iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3236 ADDOP(c, GET_ITER); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3237 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3238 compiler_use_next_block(c, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3239 ADDOP_JREL(c, FOR_ITER, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3240 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3241 VISIT(c, expr, ge->target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3242 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3243 /* XXX this needs to be cleaned up...a lot! */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3244 n = asdl_seq_LEN(ge->ifs); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3245 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3246 expr_ty e = (expr_ty)asdl_seq_GET(ge->ifs, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3247 VISIT(c, expr, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3248 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3249 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3250 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3251 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3252 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3253 if (++gen_index < asdl_seq_LEN(generators)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3254 if (!compiler_genexp_generator(c, generators, gen_index, elt)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3255 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3256 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3257 /* only append after the last 'for' generator */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3258 if (gen_index >= asdl_seq_LEN(generators)) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3259 VISIT(c, expr, elt); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3260 ADDOP(c, YIELD_VALUE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3261 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3262 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3263 compiler_use_next_block(c, skip); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3264 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3265 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3266 ADDOP_I(c, JUMP_FORWARD, 1); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3267 if (i == 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3268 compiler_use_next_block(c, if_cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3269 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3270 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3271 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3272 ADDOP_JABS(c, JUMP_ABSOLUTE, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3273 compiler_use_next_block(c, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3274 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3275 compiler_pop_fblock(c, LOOP, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3276 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3277 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3278 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3279 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3280 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3281 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3282 compiler_genexp(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3283 { |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3284 static identifier name; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3285 PyCodeObject *co; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3286 expr_ty outermost_iter = ((comprehension_ty) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3287 (asdl_seq_GET(e->v.GeneratorExp.generators, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3288 0)))->iter; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3289 |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3290 if (!name) { |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3291 name = PyString_FromString("<genexpr>"); |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3292 if (!name) |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3293 return 0; |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3294 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3295 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3296 if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3297 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3298 compiler_genexp_generator(c, e->v.GeneratorExp.generators, 0, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3299 e->v.GeneratorExp.elt); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3300 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
3301 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3302 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3303 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3304 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3305 compiler_make_closure(c, co, 0); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3306 Py_DECREF(co); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3307 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3308 VISIT(c, expr, outermost_iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3309 ADDOP(c, GET_ITER); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3310 ADDOP_I(c, CALL_FUNCTION, 1); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3311 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3312 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3313 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3314 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3315 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3316 compiler_visit_keyword(struct compiler *c, keyword_ty k) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3317 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3318 ADDOP_O(c, LOAD_CONST, k->arg, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3319 VISIT(c, expr, k->value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3320 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3321 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3322 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3323 /* Test whether expression is constant. For constants, report |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3324 whether they are true or false. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3325 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3326 Return values: 1 for true, 0 for false, -1 for non-constant. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3327 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3328 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3329 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3330 expr_constant(expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3331 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3332 switch (e->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3333 case Num_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3334 return PyObject_IsTrue(e->v.Num.n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3335 case Str_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3336 return PyObject_IsTrue(e->v.Str.s); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3337 default: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3338 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3339 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3340 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3341 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3342 /* |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3343 Implements the with statement from PEP 343. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3344 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3345 The semantics outlined in that PEP are as follows: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3346 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3347 with EXPR as VAR: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3348 BLOCK |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3349 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3350 It is implemented roughly as: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3351 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3352 context = EXPR |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3353 exit = context.__exit__ # not calling it |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3354 value = context.__enter__() |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3355 try: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3356 VAR = value # if VAR present in the syntax |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3357 BLOCK |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3358 finally: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3359 if an exception was raised: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3360 exc = copy of (exception, instance, traceback) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3361 else: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3362 exc = (None, None, None) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3363 exit(*exc) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3364 */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3365 static int |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3366 compiler_with(struct compiler *c, stmt_ty s) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3367 { |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3368 static identifier enter_attr, exit_attr; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3369 basicblock *block, *finally; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3370 identifier tmpexit, tmpvalue = NULL; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3371 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3372 assert(s->kind == With_kind); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3373 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3374 if (!enter_attr) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3375 enter_attr = PyString_InternFromString("__enter__"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3376 if (!enter_attr) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3377 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3378 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3379 if (!exit_attr) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3380 exit_attr = PyString_InternFromString("__exit__"); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3381 if (!exit_attr) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3382 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3383 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3384 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3385 block = compiler_new_block(c); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3386 finally = compiler_new_block(c); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3387 if (!block || !finally) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3388 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3389 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3390 /* Create a temporary variable to hold context.__exit__ */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3391 tmpexit = compiler_new_tmpname(c); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3392 if (tmpexit == NULL) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3393 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3394 PyArena_AddPyObject(c->c_arena, tmpexit); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3395 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3396 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3397 /* Create a temporary variable to hold context.__enter__(). |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3398 We need to do this rather than preserving it on the stack |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3399 because SETUP_FINALLY remembers the stack level. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3400 We need to do the assignment *inside* the try/finally |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3401 so that context.__exit__() is called when the assignment |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3402 fails. But we need to call context.__enter__() *before* |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3403 the try/finally so that if it fails we won't call |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3404 context.__exit__(). |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3405 */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3406 tmpvalue = compiler_new_tmpname(c); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3407 if (tmpvalue == NULL) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3408 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3409 PyArena_AddPyObject(c->c_arena, tmpvalue); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3410 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3411 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3412 /* Evaluate EXPR */ |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3413 VISIT(c, expr, s->v.With.context_expr); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3414 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3415 /* Squirrel away context.__exit__ */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3416 ADDOP(c, DUP_TOP); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3417 ADDOP_O(c, LOAD_ATTR, exit_attr, names); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3418 if (!compiler_nameop(c, tmpexit, Store)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3419 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3420 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3421 /* Call context.__enter__() */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3422 ADDOP_O(c, LOAD_ATTR, enter_attr, names); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3423 ADDOP_I(c, CALL_FUNCTION, 0); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3424 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3425 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3426 /* Store it in tmpvalue */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3427 if (!compiler_nameop(c, tmpvalue, Store)) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3428 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3429 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3430 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3431 /* Discard result from context.__enter__() */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3432 ADDOP(c, POP_TOP); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3433 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3434 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3435 /* Start the try block */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3436 ADDOP_JREL(c, SETUP_FINALLY, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3437 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3438 compiler_use_next_block(c, block); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3439 if (!compiler_push_fblock(c, FINALLY_TRY, block)) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3440 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3441 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3442 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3443 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3444 /* Bind saved result of context.__enter__() to VAR */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3445 if (!compiler_nameop(c, tmpvalue, Load) || |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3446 !compiler_nameop(c, tmpvalue, Del)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3447 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3448 VISIT(c, expr, s->v.With.optional_vars); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3449 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3450 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3451 /* BLOCK code */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3452 VISIT_SEQ(c, stmt, s->v.With.body); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3453 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3454 /* End of try block; start the finally block */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3455 ADDOP(c, POP_BLOCK); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3456 compiler_pop_fblock(c, FINALLY_TRY, block); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3457 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3458 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3459 compiler_use_next_block(c, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3460 if (!compiler_push_fblock(c, FINALLY_END, finally)) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3461 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3462 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3463 /* Finally block starts; push tmpexit and issue our magic opcode. */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3464 if (!compiler_nameop(c, tmpexit, Load) || |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3465 !compiler_nameop(c, tmpexit, Del)) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3466 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3467 ADDOP(c, WITH_CLEANUP); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3468 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3469 /* Finally block ends. */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3470 ADDOP(c, END_FINALLY); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3471 compiler_pop_fblock(c, FINALLY_END, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3472 return 1; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3473 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3474 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3475 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3476 compiler_visit_expr(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3477 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3478 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3479 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3480 /* If expr e has a different line number than the last expr/stmt, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3481 set a new line number for the next instruction. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3482 */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3483 if (e->lineno > c->u->u_lineno) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3484 c->u->u_lineno = e->lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3485 c->u->u_lineno_set = false; |
| 69 | 3486 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3487 switch (e->kind) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3488 case BoolOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3489 return compiler_boolop(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3490 case BinOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3491 VISIT(c, expr, e->v.BinOp.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3492 VISIT(c, expr, e->v.BinOp.right); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3493 ADDOP(c, binop(c, e->v.BinOp.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3494 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3495 case UnaryOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3496 VISIT(c, expr, e->v.UnaryOp.operand); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3497 ADDOP(c, unaryop(e->v.UnaryOp.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3498 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3499 case Lambda_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3500 return compiler_lambda(c, e); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
3501 case IfExp_kind: |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
3502 return compiler_ifexp(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3503 case Dict_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3504 /* XXX get rid of arg? */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3505 ADDOP_I(c, BUILD_MAP, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3506 n = asdl_seq_LEN(e->v.Dict.values); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3507 /* We must arrange things just right for STORE_SUBSCR. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3508 It wants the stack to look like (value) (dict) (key) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3509 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3510 ADDOP(c, DUP_TOP); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3511 VISIT(c, expr, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3512 (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3513 ADDOP(c, ROT_TWO); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3514 VISIT(c, expr, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3515 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3516 ADDOP(c, STORE_SUBSCR); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3517 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3518 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3519 case ListComp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3520 return compiler_listcomp(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3521 case GeneratorExp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3522 return compiler_genexp(c, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3523 case Yield_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3524 if (c->u->u_ste->ste_type != FunctionBlock) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3525 return compiler_error(c, "'yield' outside function"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3526 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3527 for (i = 0; i < c->u->u_nfblocks; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3528 if (c->u->u_fblock[i].fb_type == FINALLY_TRY) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3529 return compiler_error( |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3530 c, "'yield' not allowed in a 'try' " |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3531 "block with a 'finally' clause"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3532 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3533 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3534 if (e->v.Yield.value) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3535 VISIT(c, expr, e->v.Yield.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3536 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3537 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3538 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3539 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3540 ADDOP(c, YIELD_VALUE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3541 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3542 case Compare_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3543 return compiler_compare(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3544 case Call_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3545 return compiler_call(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3546 case Repr_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3547 VISIT(c, expr, e->v.Repr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3548 ADDOP(c, UNARY_CONVERT); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3549 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3550 case Num_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3551 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3552 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3553 case Str_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3554 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3555 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3556 /* The following exprs can be assignment targets. */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3557 case Attribute_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3558 if (e->v.Attribute.ctx != AugStore) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3559 VISIT(c, expr, e->v.Attribute.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3560 switch (e->v.Attribute.ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3561 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3562 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3563 /* Fall through to load */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3564 case Load: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3565 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3566 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3567 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3568 ADDOP(c, ROT_TWO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3569 /* Fall through to save */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3570 case Store: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3571 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3572 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3573 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3574 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3575 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3576 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3577 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3578 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3579 "param invalid in attribute expression"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3580 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3581 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3582 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3583 case Subscript_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3584 switch (e->v.Subscript.ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3585 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3586 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3587 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3588 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3589 case Load: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3590 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3591 VISIT_SLICE(c, e->v.Subscript.slice, Load); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3592 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3593 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3594 VISIT_SLICE(c, e->v.Subscript.slice, AugStore); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3595 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3596 case Store: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3597 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3598 VISIT_SLICE(c, e->v.Subscript.slice, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3599 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3600 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3601 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3602 VISIT_SLICE(c, e->v.Subscript.slice, Del); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3603 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3604 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3605 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3606 PyErr_SetString(PyExc_SystemError, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3607 "param invalid in subscript expression"); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3608 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3609 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3610 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3611 case Name_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3612 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3613 /* child nodes of List and Tuple will have expr_context set */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3614 case List_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3615 return compiler_list(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3616 case Tuple_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3617 return compiler_tuple(c, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3618 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3619 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3620 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3621 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3622 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3623 compiler_augassign(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3624 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3625 expr_ty e = s->v.AugAssign.target; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3626 expr_ty auge; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3627 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3628 assert(s->kind == AugAssign_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3629 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3630 switch (e->kind) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3631 case Attribute_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3632 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36766
diff
changeset
|
3633 AugLoad, e->lineno, e->col_offset, c->c_arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3634 if (auge == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3635 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3636 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3637 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3638 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3639 auge->v.Attribute.ctx = AugStore; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3640 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3641 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3642 case Subscript_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3643 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36766
diff
changeset
|
3644 AugLoad, e->lineno, e->col_offset, c->c_arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3645 if (auge == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3646 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3647 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3648 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3649 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3650 auge->v.Subscript.ctx = AugStore; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3651 VISIT(c, expr, auge); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3652 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3653 case Name_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3654 VISIT(c, expr, s->v.AugAssign.target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3655 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3656 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3657 return compiler_nameop(c, e->v.Name.id, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3658 default: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3659 PyErr_Format(PyExc_SystemError, |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3660 "invalid node type (%d) for augmented assignment", |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3661 e->kind); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3662 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3663 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3664 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3665 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3666 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3667 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3668 compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3669 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3670 struct fblockinfo *f; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3671 if (c->u->u_nfblocks >= CO_MAXBLOCKS) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3672 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3673 f = &c->u->u_fblock[c->u->u_nfblocks++]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3674 f->fb_type = t; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3675 f->fb_block = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3676 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3677 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3678 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3679 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3680 compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3681 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3682 struct compiler_unit *u = c->u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3683 assert(u->u_nfblocks > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3684 u->u_nfblocks--; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3685 assert(u->u_fblock[u->u_nfblocks].fb_type == t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3686 assert(u->u_fblock[u->u_nfblocks].fb_block == b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3687 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3688 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3689 /* Raises a SyntaxError and returns 0. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3690 If something goes wrong, a different exception may be raised. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3691 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3692 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3693 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3694 compiler_error(struct compiler *c, const char *errstr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3695 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3696 PyObject *loc; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3697 PyObject *u = NULL, *v = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3698 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3699 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3700 if (!loc) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3701 Py_INCREF(Py_None); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3702 loc = Py_None; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3703 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3704 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3705 Py_None, loc); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3706 if (!u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3707 goto exit; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3708 v = Py_BuildValue("(zO)", errstr, u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3709 if (!v) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3710 goto exit; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3711 PyErr_SetObject(PyExc_SyntaxError, v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3712 exit: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3713 Py_DECREF(loc); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3714 Py_XDECREF(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3715 Py_XDECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3716 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3717 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3718 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3719 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3720 compiler_handle_subscr(struct compiler *c, const char *kind, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3721 expr_context_ty ctx) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3722 { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3723 int op = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3724 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3725 /* XXX this code is duplicated */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3726 switch (ctx) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3727 case AugLoad: /* fall through to Load */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3728 case Load: op = BINARY_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3729 case AugStore:/* fall through to Store */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3730 case Store: op = STORE_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3731 case Del: op = DELETE_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3732 case Param: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3733 PyErr_Format(PyExc_SystemError, |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3734 "invalid %s kind %d in subscript\n", |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3735 kind, ctx); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3736 return 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3737 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3738 if (ctx == AugLoad) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3739 ADDOP_I(c, DUP_TOPX, 2); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3740 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3741 else if (ctx == AugStore) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3742 ADDOP(c, ROT_THREE); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3743 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3744 ADDOP(c, op); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3745 return 1; |
| 69 | 3746 } |
| 3747 | |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3748 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3749 compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3750 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3751 int n = 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3752 assert(s->kind == Slice_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3753 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3754 /* only handles the cases where BUILD_SLICE is emitted */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3755 if (s->v.Slice.lower) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3756 VISIT(c, expr, s->v.Slice.lower); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3757 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3758 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3759 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3760 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3761 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3762 if (s->v.Slice.upper) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3763 VISIT(c, expr, s->v.Slice.upper); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3764 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3765 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3766 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3767 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3768 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3769 if (s->v.Slice.step) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3770 n++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3771 VISIT(c, expr, s->v.Slice.step); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3772 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3773 ADDOP_I(c, BUILD_SLICE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3774 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3775 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3776 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3777 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3778 compiler_simple_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3779 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3780 int op = 0, slice_offset = 0, stack_count = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3781 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3782 assert(s->v.Slice.step == NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3783 if (s->v.Slice.lower) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3784 slice_offset++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3785 stack_count++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3786 if (ctx != AugStore) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3787 VISIT(c, expr, s->v.Slice.lower); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3788 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3789 if (s->v.Slice.upper) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3790 slice_offset += 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3791 stack_count++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3792 if (ctx != AugStore) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3793 VISIT(c, expr, s->v.Slice.upper); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3794 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3795 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3796 if (ctx == AugLoad) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3797 switch (stack_count) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3798 case 0: ADDOP(c, DUP_TOP); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3799 case 1: ADDOP_I(c, DUP_TOPX, 2); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3800 case 2: ADDOP_I(c, DUP_TOPX, 3); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3801 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3802 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3803 else if (ctx == AugStore) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3804 switch (stack_count) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3805 case 0: ADDOP(c, ROT_TWO); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3806 case 1: ADDOP(c, ROT_THREE); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3807 case 2: ADDOP(c, ROT_FOUR); break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3808 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3809 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3810 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3811 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3812 case AugLoad: /* fall through to Load */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3813 case Load: op = SLICE; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3814 case AugStore:/* fall through to Store */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3815 case Store: op = STORE_SLICE; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3816 case Del: op = DELETE_SLICE; break; |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3817 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3818 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3819 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3820 "param invalid in simple slice"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3821 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3822 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3823 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3824 ADDOP(c, op + slice_offset); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3825 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3826 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3827 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3828 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3829 compiler_visit_nested_slice(struct compiler *c, slice_ty s, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3830 expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3831 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3832 switch (s->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3833 case Ellipsis_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3834 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3835 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3836 case Slice_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3837 return compiler_slice(c, s, ctx); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3838 case Index_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3839 VISIT(c, expr, s->v.Index.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3840 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3841 case ExtSlice_kind: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3842 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3843 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3844 "extended slice invalid in nested slice"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3845 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3846 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3847 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3848 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3849 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3850 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3851 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3852 compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3853 { |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3854 char * kindname = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3855 switch (s->kind) { |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3856 case Index_kind: |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3857 kindname = "index"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3858 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3859 VISIT(c, expr, s->v.Index.value); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3860 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3861 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3862 case Ellipsis_kind: |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3863 kindname = "ellipsis"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3864 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3865 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3866 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3867 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3868 case Slice_kind: |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3869 kindname = "slice"; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3870 if (!s->v.Slice.step) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3871 return compiler_simple_slice(c, s, ctx); |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3872 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3873 if (!compiler_slice(c, s, ctx)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3874 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3875 } |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3876 break; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3877 case ExtSlice_kind: |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3878 kindname = "extended slice"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3879 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3880 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3881 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3882 slice_ty sub = (slice_ty)asdl_seq_GET( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3883 s->v.ExtSlice.dims, i); |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3884 if (!compiler_visit_nested_slice(c, sub, ctx)) |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3885 return 0; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3886 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3887 ADDOP_I(c, BUILD_TUPLE, n); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3888 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3889 break; |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3890 default: |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3891 PyErr_Format(PyExc_SystemError, |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3892 "invalid subscript kind %d", s->kind); |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3893 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3894 } |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3895 return compiler_handle_subscr(c, kindname, ctx); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3896 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3897 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3898 /* do depth-first search of basic block graph, starting with block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3899 post records the block indices in post-order. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3900 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3901 XXX must handle implicit jumps from one block to next |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
3902 */ |
|
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
3903 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3904 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3905 dfs(struct compiler *c, basicblock *b, struct assembler *a) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3906 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3907 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3908 struct instr *instr = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3909 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3910 if (b->b_seen) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3911 return; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3912 b->b_seen = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3913 if (b->b_next != NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3914 dfs(c, b->b_next, a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3915 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3916 instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3917 if (instr->i_jrel || instr->i_jabs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3918 dfs(c, instr->i_target, a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3919 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3920 a->a_postorder[a->a_nblocks++] = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3921 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3922 |
|
35860
9b885c934144
make internal method static
Neal Norwitz <nnorwitz@gmail.com>
parents:
35797
diff
changeset
|
3923 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3924 stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3925 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3926 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3927 struct instr *instr; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3928 if (b->b_seen || b->b_startdepth >= depth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3929 return maxdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3930 b->b_seen = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3931 b->b_startdepth = depth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3932 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3933 instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3934 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3935 if (depth > maxdepth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3936 maxdepth = depth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3937 assert(depth >= 0); /* invalid code or bug in stackdepth() */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3938 if (instr->i_jrel || instr->i_jabs) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3939 maxdepth = stackdepth_walk(c, instr->i_target, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3940 depth, maxdepth); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3941 if (instr->i_opcode == JUMP_ABSOLUTE || |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3942 instr->i_opcode == JUMP_FORWARD) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3943 goto out; /* remaining code is dead */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3944 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3945 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3946 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3947 if (b->b_next) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3948 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3949 out: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3950 b->b_seen = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3951 return maxdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3952 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3953 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3954 /* Find the flow path that needs the largest stack. We assume that |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3955 * cycles in the flow graph have no net effect on the stack depth. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3956 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3957 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3958 stackdepth(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3959 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3960 basicblock *b, *entryblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3961 entryblock = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3962 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3963 b->b_seen = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3964 b->b_startdepth = INT_MIN; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3965 entryblock = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3966 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3967 return stackdepth_walk(c, entryblock, 0, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3968 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3969 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3970 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3971 assemble_init(struct assembler *a, int nblocks, int firstlineno) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3972 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3973 memset(a, 0, sizeof(struct assembler)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3974 a->a_lineno = firstlineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3975 a->a_bytecode = PyString_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3976 if (!a->a_bytecode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3977 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3978 a->a_lnotab = PyString_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3979 if (!a->a_lnotab) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3980 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3981 a->a_postorder = (basicblock **)PyObject_Malloc( |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3982 sizeof(basicblock *) * nblocks); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3983 if (!a->a_postorder) { |
|
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3984 PyErr_NoMemory(); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3985 return 0; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3986 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3987 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3988 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3989 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3990 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3991 assemble_free(struct assembler *a) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3992 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3993 Py_XDECREF(a->a_bytecode); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3994 Py_XDECREF(a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3995 if (a->a_postorder) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3996 PyObject_Free(a->a_postorder); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3997 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3998 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3999 /* Return the size of a basic block in bytes. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4000 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4001 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4002 instrsize(struct instr *instr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4003 { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4004 if (!instr->i_hasarg) |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4005 return 1; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4006 if (instr->i_oparg > 0xffff) |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4007 return 6; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4008 return 3; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4009 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4010 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4011 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4012 blocksize(basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4013 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4014 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4015 int size = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4016 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4017 for (i = 0; i < b->b_iused; i++) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4018 size += instrsize(&b->b_instr[i]); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4019 return size; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4020 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4021 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4022 /* All about a_lnotab. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4023 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4024 c_lnotab is an array of unsigned bytes disguised as a Python string. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4025 It is used to map bytecode offsets to source code line #s (when needed |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4026 for tracebacks). |
| 24844 | 4027 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4028 The array is conceptually a list of |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4029 (bytecode offset increment, line number increment) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4030 pairs. The details are important and delicate, best illustrated by example: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4031 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4032 byte code offset source code line number |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4033 0 1 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4034 6 2 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4035 50 7 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4036 350 307 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4037 361 308 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4038 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4039 The first trick is that these numbers aren't stored, only the increments |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4040 from one row to the next (this doesn't really work, but it's a start): |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4041 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4042 0, 1, 6, 1, 44, 5, 300, 300, 11, 1 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4043 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4044 The second trick is that an unsigned byte can't hold negative values, or |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4045 values larger than 255, so (a) there's a deep assumption that byte code |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4046 offsets and their corresponding line #s both increase monotonically, and (b) |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4047 if at least one column jumps by more than 255 from one row to the next, more |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4048 than one pair is written to the table. In case #b, there's no way to know |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4049 from looking at the table later how many were written. That's the delicate |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4050 part. A user of c_lnotab desiring to find the source line number |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4051 corresponding to a bytecode address A should do something like this |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4052 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4053 lineno = addr = 0 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4054 for addr_incr, line_incr in c_lnotab: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4055 addr += addr_incr |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4056 if addr > A: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4057 return lineno |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4058 lineno += line_incr |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4059 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4060 In order for this to work, when the addr field increments by more than 255, |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4061 the line # increment in each pair generated must be 0 until the remaining addr |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4062 increment is < 256. So, in the example above, com_set_lineno should not (as |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4063 was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4064 255, 0, 45, 255, 0, 45. |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4065 */ |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4066 |
|
17518
f939ce52a734
Make some private symbols static.
Guido van Rossum <guido@python.org>
parents:
17355
diff
changeset
|
4067 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4068 assemble_lnotab(struct assembler *a, struct instr *i) |
| 69 | 4069 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4070 int d_bytecode, d_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4071 int len; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4072 unsigned char *lnotab; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4073 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4074 d_bytecode = a->a_offset - a->a_lineno_off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4075 d_lineno = i->i_lineno - a->a_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4076 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4077 assert(d_bytecode >= 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4078 assert(d_lineno >= 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4079 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4080 if (d_lineno == 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4081 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4082 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4083 if (d_bytecode > 255) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4084 int j, nbytes, ncodes = d_bytecode / 255; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4085 nbytes = a->a_lnotab_off + 2 * ncodes; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4086 len = PyString_GET_SIZE(a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4087 if (nbytes >= len) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4088 if (len * 2 < nbytes) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4089 len = nbytes; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4090 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4091 len *= 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4092 if (_PyString_Resize(&a->a_lnotab, len) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4093 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4094 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4095 lnotab = (unsigned char *) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4096 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4097 for (j = 0; j < ncodes; j++) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4098 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4099 *lnotab++ = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4100 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4101 d_bytecode -= ncodes * 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4102 a->a_lnotab_off += ncodes * 2; |
|
5041
c497929b2371
Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents:
5011
diff
changeset
|
4103 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4104 assert(d_bytecode <= 255); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4105 if (d_lineno > 255) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4106 int j, nbytes, ncodes = d_lineno / 255; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4107 nbytes = a->a_lnotab_off + 2 * ncodes; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4108 len = PyString_GET_SIZE(a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4109 if (nbytes >= len) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4110 if (len * 2 < nbytes) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4111 len = nbytes; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4112 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4113 len *= 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4114 if (_PyString_Resize(&a->a_lnotab, len) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4115 return 0; |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
4116 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4117 lnotab = (unsigned char *) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4118 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4119 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4120 *lnotab++ = d_bytecode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4121 d_bytecode = 0; |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4122 for (j = 1; j < ncodes; j++) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4123 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4124 *lnotab++ = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4125 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4126 d_lineno -= ncodes * 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4127 a->a_lnotab_off += ncodes * 2; |
|
14147
21ec69a56228
Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents:
14117
diff
changeset
|
4128 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4129 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4130 len = PyString_GET_SIZE(a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4131 if (a->a_lnotab_off + 2 >= len) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4132 if (_PyString_Resize(&a->a_lnotab, len * 2) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4133 return 0; |
| 69 | 4134 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4135 lnotab = (unsigned char *) |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
4136 PyString_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4137 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4138 a->a_lnotab_off += 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4139 if (d_bytecode) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4140 *lnotab++ = d_bytecode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4141 *lnotab++ = d_lineno; |
|
73
3028acaa56b0
Compile class definitions.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
4142 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4143 else { /* First line of a block; def stmt, etc. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4144 *lnotab++ = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4145 *lnotab++ = d_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4146 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4147 a->a_lineno = i->i_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4148 a->a_lineno_off = a->a_offset; |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4149 return 1; |
|
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4150 } |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4151 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4152 /* assemble_emit() |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4153 Extend the bytecode with a new instruction. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4154 Update lnotab if necessary. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4155 */ |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4156 |
|
24855
bed5d5e536bc
Add warnings for assignment or deletion of variables and attributes
Guido van Rossum <guido@python.org>
parents:
24854
diff
changeset
|
4157 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4158 assemble_emit(struct assembler *a, struct instr *i) |
| 69 | 4159 { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4160 int size, arg = 0, ext = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4161 int len = PyString_GET_SIZE(a->a_bytecode); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4162 char *code; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4163 |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4164 size = instrsize(i); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4165 if (i->i_hasarg) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4166 arg = i->i_oparg; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4167 ext = arg >> 16; |
|
32121
302d399cfd37
SF patch #872326: Generator expression implementation
Raymond Hettinger <python@rcn.com>
parents:
31764
diff
changeset
|
4168 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4169 if (i->i_lineno && !assemble_lnotab(a, i)) |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4170 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4171 if (a->a_offset + size >= len) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4172 if (_PyString_Resize(&a->a_bytecode, len * 2) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4173 return 0; |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2367
diff
changeset
|
4174 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4175 code = PyString_AS_STRING(a->a_bytecode) + a->a_offset; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4176 a->a_offset += size; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4177 if (size == 6) { |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4178 assert(i->i_hasarg); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4179 *code++ = (char)EXTENDED_ARG; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4180 *code++ = ext & 0xff; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4181 *code++ = ext >> 8; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4182 arg &= 0xffff; |
|
4991
8276916e1ea8
Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents:
4905
diff
changeset
|
4183 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4184 *code++ = i->i_opcode; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4185 if (i->i_hasarg) { |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4186 assert(size == 3 || size == 6); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4187 *code++ = arg & 0xff; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4188 *code++ = arg >> 8; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4189 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4190 return 1; |
|
19187
30f8b654c2e5
SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19177
diff
changeset
|
4191 } |
|
30f8b654c2e5
SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19177
diff
changeset
|
4192 |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4193 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4194 assemble_jump_offsets(struct assembler *a, struct compiler *c) |
| 69 | 4195 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4196 basicblock *b; |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4197 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0; |
|
5233
b749d2dd7582
Added assert statement.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
4198 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4199 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4200 /* Compute the size of each block and fixup jump args. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4201 Replace block pointer with position in bytecode. */ |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4202 start: |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4203 totsize = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4204 for (i = a->a_nblocks - 1; i >= 0; i--) { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4205 b = a->a_postorder[i]; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4206 bsize = blocksize(b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4207 b->b_offset = totsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4208 totsize += bsize; |
| 86 | 4209 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4210 extended_arg_count = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4211 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4212 bsize = b->b_offset; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4213 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4214 struct instr *instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4215 /* Relative jumps are computed relative to |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4216 the instruction pointer after fetching |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4217 the jump instruction. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4218 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4219 bsize += instrsize(instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4220 if (instr->i_jabs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4221 instr->i_oparg = instr->i_target->b_offset; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4222 else if (instr->i_jrel) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4223 int delta = instr->i_target->b_offset - bsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4224 instr->i_oparg = delta; |
|
18333
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
4225 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4226 else |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4227 continue; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4228 if (instr->i_oparg > 0xffff) |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4229 extended_arg_count++; |
|
18333
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
4230 } |
|
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
4231 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4232 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4233 /* XXX: This is an awful hack that could hurt performance, but |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4234 on the bright side it should work until we come up |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4235 with a better solution. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4236 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4237 In the meantime, should the goto be dropped in favor |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4238 of a loop? |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4239 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4240 The issue is that in the first loop blocksize() is called |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4241 which calls instrsize() which requires i_oparg be set |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4242 appropriately. There is a bootstrap problem because |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4243 i_oparg is calculated in the second loop above. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4244 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4245 So we loop until we stop seeing new EXTENDED_ARGs. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4246 The only EXTENDED_ARGs that could be popping up are |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4247 ones in jump instructions. So this should converge |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4248 fairly quickly. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4249 */ |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4250 if (last_extended_arg_count != extended_arg_count) { |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4251 last_extended_arg_count = extended_arg_count; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4252 goto start; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4253 } |
| 69 | 4254 } |
| 4255 | |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4256 static PyObject * |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4257 dict_keys_inorder(PyObject *dict, int offset) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4258 { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4259 PyObject *tuple, *k, *v; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
4260 Py_ssize_t i, pos = 0, size = PyDict_Size(dict); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4261 |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4262 tuple = PyTuple_New(size); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4263 if (tuple == NULL) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4264 return NULL; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4265 while (PyDict_Next(dict, &pos, &k, &v)) { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4266 i = PyInt_AS_LONG(v); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4267 k = PyTuple_GET_ITEM(k, 0); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4268 Py_INCREF(k); |
|
17078
7e181eba6b9b
Fixup handling of free variables in methods when the class scope also
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17076
diff
changeset
|
4269 assert((i - offset) < size); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4270 assert((i - offset) >= 0); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4271 PyTuple_SET_ITEM(tuple, i - offset, k); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4272 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4273 return tuple; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4274 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4275 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4276 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4277 compute_code_flags(struct compiler *c) |
|
16421
aa844711463a
Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16408
diff
changeset
|
4278 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4279 PySTEntryObject *ste = c->u->u_ste; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4280 int flags = 0, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4281 if (ste->ste_type != ModuleBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4282 flags |= CO_NEWLOCALS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4283 if (ste->ste_type == FunctionBlock) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4284 if (!ste->ste_unoptimized) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4285 flags |= CO_OPTIMIZED; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4286 if (ste->ste_nested) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4287 flags |= CO_NESTED; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4288 if (ste->ste_generator) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4289 flags |= CO_GENERATOR; |
|
20867
40a88989d6cb
Part of SF bug #478003 possible memory leaks in err handling.
Tim Peters <tim.peters@gmail.com>
parents:
20517
diff
changeset
|
4290 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4291 if (ste->ste_varargs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4292 flags |= CO_VARARGS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4293 if (ste->ste_varkeywords) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4294 flags |= CO_VARKEYWORDS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4295 if (ste->ste_generator) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4296 flags |= CO_GENERATOR; |
|
36729
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4297 |
|
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4298 /* (Only) inherit compilerflags in PyCF_MASK */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4299 flags |= (c->c_flags->cf_flags & PyCF_MASK); |
|
36729
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4300 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4301 n = PyDict_Size(c->u->u_freevars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4302 if (n < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4303 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4304 if (n == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4305 n = PyDict_Size(c->u->u_cellvars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4306 if (n < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4307 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4308 if (n == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4309 flags |= CO_NOFREE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4310 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4311 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4312 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4313 return flags; |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4314 } |
|
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4315 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
4316 static PyCodeObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4317 makecode(struct compiler *c, struct assembler *a) |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4318 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4319 PyObject *tmp; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4320 PyCodeObject *co = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4321 PyObject *consts = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4322 PyObject *names = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4323 PyObject *varnames = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4324 PyObject *filename = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4325 PyObject *name = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4326 PyObject *freevars = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4327 PyObject *cellvars = NULL; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4328 PyObject *bytecode = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4329 int nlocals, flags; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4330 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4331 tmp = dict_keys_inorder(c->u->u_consts, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4332 if (!tmp) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4333 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4334 consts = PySequence_List(tmp); /* optimize_code requires a list */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4335 Py_DECREF(tmp); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4336 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4337 names = dict_keys_inorder(c->u->u_names, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4338 varnames = dict_keys_inorder(c->u->u_varnames, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4339 if (!consts || !names || !varnames) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4340 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4341 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4342 cellvars = dict_keys_inorder(c->u->u_cellvars, 0); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4343 if (!cellvars) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4344 goto error; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4345 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4346 if (!freevars) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4347 goto error; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4348 filename = PyString_FromString(c->c_filename); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4349 if (!filename) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4350 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4351 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4352 nlocals = PyDict_Size(c->u->u_varnames); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4353 flags = compute_code_flags(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4354 if (flags < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4355 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4356 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4357 bytecode = optimize_code(a->a_bytecode, consts, names, a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4358 if (!bytecode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4359 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4360 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4361 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4362 if (!tmp) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4363 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4364 Py_DECREF(consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4365 consts = tmp; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4366 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4367 co = PyCode_New(c->u->u_argcount, nlocals, stackdepth(c), flags, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4368 bytecode, consts, names, varnames, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4369 freevars, cellvars, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4370 filename, c->u->u_name, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4371 c->u->u_firstlineno, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4372 a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4373 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4374 Py_XDECREF(consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4375 Py_XDECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4376 Py_XDECREF(varnames); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4377 Py_XDECREF(filename); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4378 Py_XDECREF(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4379 Py_XDECREF(freevars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4380 Py_XDECREF(cellvars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4381 Py_XDECREF(bytecode); |
| 69 | 4382 return co; |
| 4383 } | |
|
5041
c497929b2371
Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents:
5011
diff
changeset
|
4384 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4385 static PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4386 assemble(struct compiler *c, int addNone) |
|
16781
5a1230de436a
Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16763
diff
changeset
|
4387 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4388 basicblock *b, *entryblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4389 struct assembler a; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4390 int i, j, nblocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4391 PyCodeObject *co = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4392 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4393 /* Make sure every block that falls off the end returns None. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4394 XXX NEXT_BLOCK() isn't quite right, because if the last |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4395 block ends with a jump or return b_next shouldn't set. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4396 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4397 if (!c->u->u_curblock->b_return) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4398 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4399 if (addNone) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4400 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4401 ADDOP(c, RETURN_VALUE); |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4402 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4403 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4404 nblocks = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4405 entryblock = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4406 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4407 nblocks++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4408 entryblock = b; |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4409 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4410 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4411 if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4412 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4413 dfs(c, entryblock, &a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4414 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4415 /* Can't modify the bytecode after computing jump offsets. */ |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4416 assemble_jump_offsets(&a, c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4417 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4418 /* Emit code in reverse postorder from dfs. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4419 for (i = a.a_nblocks - 1; i >= 0; i--) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4420 b = a.a_postorder[i]; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4421 for (j = 0; j < b->b_iused; j++) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4422 if (!assemble_emit(&a, &b->b_instr[j])) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4423 goto error; |
|
16394
f700e6b8de1f
Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16357
diff
changeset
|
4424 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4425 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4426 if (_PyString_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4427 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4428 if (_PyString_Resize(&a.a_bytecode, a.a_offset) < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4429 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4430 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4431 co = makecode(c, &a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4432 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4433 assemble_free(&a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4434 return co; |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4435 } |
