annotate Tools/framer/example.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents c3a096bfbd6b
children f6069f9dd52d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24581
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 """Generate the skeleton for cStringIO as an example of framer."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 from framer.bases import Module, Type
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 from framer.member import member
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
6 class cStringIO(Module):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 """A simple fast partial StringIO replacement.
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 This module provides a simple useful replacement for the StringIO
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 module that is written in C. It does not provide the full
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
11 generality of StringIO, but it provides enough for most
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 applications and is especially useful in conjunction with the
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13 pickle module.
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 24581
diff changeset
14
24581
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
15 Usage:
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17 from cStringIO import StringIO
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 an_output_stream = StringIO()
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 an_output_stream.write(some_stuff)
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 ...
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 value = an_output_stream.getvalue()
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 24581
diff changeset
23
24581
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 an_input_stream = StringIO(a_string)
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 spam = an_input_stream.readline()
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 spam = an_input_stream.read(5)
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 an_input_stream.seek(0) # OK, start over
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 spam = an_input_stream.read() # and read it all
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 """
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 __file__ = "cStringIO.c"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 def StringIO(o):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 """Return a StringIO-like stream for reading or writing"""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 StringIO.pyarg = "|O"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37 class InputType(Type):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
38 "Simple type for treating strings as input file streams"
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 24581
diff changeset
39
24581
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40 abbrev = "input"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
41
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 struct = """\
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 typedef struct {
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 PyObject_HEAD
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45 char *buf;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 int pos;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 int size;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48 PyObject *pbuf;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 } InputObject;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 """
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52 def flush(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 """Does nothing"""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55 def getvalue(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
56 """Get the string value.
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
57
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
58 If use_pos is specified and is a true value, then the
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
59 string returned will include only the text up to the
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60 current file position.
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 """
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63 def isatty(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
64 """Always returns False"""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
65
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66 def read(self, s):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 """Return s characters or the rest of the string."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
68 read.pyarg = "|i"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
69
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70 def readline(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71 """Read one line."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
72
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
73 def readlines(self, hint):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
74 """Read all lines."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
75 readlines.pyarg = "|i"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
76
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
77 def reset(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
78 """Reset the file position to the beginning."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
79
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
80 def tell(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
81 """Get the current position."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
82
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
83 def truncate(self, pos):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
84 """Truncate the file at the current position."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
85 truncate.pyarg = "|i"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
86
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
87 def seek(self, position, mode=0):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88 """Set the current position.
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90 The optional mode argument can be 0 for absolute, 1 for relative,
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
91 and 2 for relative to EOF. The default is absolute.
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
92 """
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
93 seek.pyarg = "i|i"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
94
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
95 def close(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
96 pass
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 class OutputType(InputType):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
99 "Simple type for output strings."
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
100
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 abbrev = "output"
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 struct = """\
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 typedef struct {
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105 PyObject_HEAD
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 char *buf;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 int pos;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 int size;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 int softspace;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 } OutputObject;
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 """
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
113 softspace = member()
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115 def close(self):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116 """Explicitly release resources."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
117
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
118 def write(self, s):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
119 """Write a string to the file."""
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
120 # XXX Hack: writing None resets the buffer
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122 def writelines(self, lines):
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123 """Write each string in lines."""
32736
c3a096bfbd6b Whitespace normalization, via reindent.py.
Tim Peters <tim.peters@gmail.com>
parents: 24581
diff changeset
124
24581
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125
4382b2374390 Initial prototype of framer: a tool to build the frame for extension modules.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 cStringIO.gen()