summaryrefslogtreecommitdiffstats
path: root/Tools/freeze/makefreeze.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-03-05 03:42:00 (GMT)
committerGuido van Rossum <guido@python.org>1998-03-05 03:42:00 (GMT)
commit75dc4969ab202e8c3dda15bedacc880d589e1e44 (patch)
tree1dc5d67c772aba4027076eedeeddbe73c797257e /Tools/freeze/makefreeze.py
parent3455edcbc8fa586a6d3c70ea34e3c71b2763c98a (diff)
downloadcpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.zip
cpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.tar.gz
cpython-75dc4969ab202e8c3dda15bedacc880d589e1e44.tar.bz2
Added support for packages.
We have a whole new module finder that uses the actual Python parser and scans the bytecode for IMPORT_NAME and IMPORT_FROM. This requires some support in import.c (that hasn't been checked in). New command line options for this: -d, -q, -m.
Diffstat (limited to 'Tools/freeze/makefreeze.py')
-rw-r--r--Tools/freeze/makefreeze.py74
1 files changed, 18 insertions, 56 deletions
diff --git a/Tools/freeze/makefreeze.py b/Tools/freeze/makefreeze.py
index 5c6f371..97315b3 100644
--- a/Tools/freeze/makefreeze.py
+++ b/Tools/freeze/makefreeze.py
@@ -1,4 +1,5 @@
import marshal
+import string
# Write a file containing frozen code for the modules in the dictionary.
@@ -23,51 +24,31 @@ main(argc, argv)
"""
-def makefreeze(outfp, dict):
+def makefreeze(outfp, dict, debug=0):
done = []
mods = dict.keys()
mods.sort()
for mod in mods:
- modfn = dict[mod]
- try:
- str = makecode(modfn)
- except IOError, msg:
- sys.stderr.write("%s: %s\n" % (modfn, str(msg)))
- continue
- if str:
- done.append(mod, len(str))
- writecode(outfp, mod, str)
+ m = dict[mod]
+ mangled = string.join(string.split(mod, "."), "__")
+ if m.__code__:
+ if debug:
+ print "freezing", mod, "..."
+ str = marshal.dumps(m.__code__)
+ size = len(str)
+ if m.__path__:
+ # Indicate package by negative size
+ size = -size
+ done.append((mod, mangled, size))
+ writecode(outfp, mangled, str)
+ if debug:
+ print "generating table of frozen modules"
outfp.write(header)
- for mod, size in done:
- outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mod, size))
+ for mod, mangled, size in done:
+ outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))
outfp.write(trailer)
-# Return code string for a given module -- either a .py or a .pyc
-# file. Return either a string or None (if it's not Python code).
-# May raise IOError.
-
-def makecode(filename):
- if filename[-3:] == '.py':
- f = open(filename, 'r')
- try:
- text = f.read()
- code = compile(text, filename, 'exec')
- finally:
- f.close()
- return marshal.dumps(code)
- if filename[-4:] == '.pyc':
- f = open(filename, 'rb')
- try:
- f.seek(8)
- str = f.read()
- finally:
- f.close()
- return str
- # Can't generate code for this extension
- return None
-
-
# Write a C initializer for a module containing the frozen python code.
# The array is called M_<mod>.
@@ -78,22 +59,3 @@ def writecode(outfp, mod, str):
for c in str[i:i+16]:
outfp.write('%d,' % ord(c))
outfp.write('\n};\n')
-
-
-# Test for the above functions.
-
-def test():
- import os
- import sys
- if not sys.argv[1:]:
- print 'usage: python freezepython.py file.py(c) ...'
- sys.exit(2)
- dict = {}
- for arg in sys.argv[1:]:
- base = os.path.basename(arg)
- mod, ext = os.path.splitext(base)
- dict[mod] = arg
- makefreeze(sys.stdout, dict)
-
-if __name__ == '__main__':
- test()