annotate Objects/frameobject.c @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents 65d2d8e67da3
children 4dc67fdd9e0b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
1 /***********************************************************
2059
866c81068dbd Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2053
diff changeset
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
866c81068dbd Added 1995 to copyright message.
Guido van Rossum <guido@python.org>
parents: 2053
diff changeset
3 The Netherlands.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
4
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
5 All Rights Reserved
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
6
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
8 documentation for any purpose and without fee is hereby granted,
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
9 provided that the above copyright notice appear in all copies and that
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
10 both that copyright notice and this permission notice appear in
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
12 Centrum or CWI or Corporation for National Research Initiatives or
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
13 CNRI not be used in advertising or publicity pertaining to
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
14 distribution of the software without specific, written prior
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
15 permission.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
16
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
17 While CWI is the initial source for this software, a modified version
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
18 is made available by the Corporation for National Research Initiatives
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
19 (CNRI) at the Internet address ftp://ftp.python.org.
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
20
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 2856
diff changeset
28 PERFORMANCE OF THIS SOFTWARE.
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
29
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
30 ******************************************************************/
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 86
diff changeset
31
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 /* Frame object implementation */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 #include "allobjects.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 #include "compile.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 #include "frameobject.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 #include "opcode.h"
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 #include "structmember.h"
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
40 #include "bltinmodule.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 #define OFF(x) offsetof(frameobject, x)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 static struct memberlist frame_memberlist[] = {
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
45 {"f_back", T_OBJECT, OFF(f_back), RO},
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
46 {"f_code", T_OBJECT, OFF(f_code), RO},
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
47 {"f_builtins", T_OBJECT, OFF(f_builtins),RO},
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
48 {"f_globals", T_OBJECT, OFF(f_globals), RO},
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
49 {"f_locals", T_OBJECT, OFF(f_locals), RO},
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
50 {"f_owner", T_OBJECT, OFF(f_owner), RO},
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
51 #if 0
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
52 {"f_fastlocals",T_OBJECT, OFF(f_fastlocals),RO}, /* XXX Unsafe */
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
53 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
54 {"f_lasti", T_INT, OFF(f_lasti), RO},
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
55 {"f_lineno", T_INT, OFF(f_lineno), RO},
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
56 {"f_restricted",T_INT, OFF(f_restricted),RO},
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
57 {"f_trace", T_OBJECT, OFF(f_trace)},
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 {NULL} /* Sentinel */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 static object *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 frame_getattr(f, name)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 frameobject *f;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 char *name;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 {
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
66 if (strcmp(name, "f_locals") == 0)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
67 fast_2_locals(f);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 return getmember((char *)f, frame_memberlist, name);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
71 static int
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
72 frame_setattr(f, name, value)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
73 frameobject *f;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
74 char *name;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
75 object *value;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
76 {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
77 return setmember((char *)f, frame_memberlist, name, value);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
78 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
79
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
80 /* Stack frames are allocated and deallocated at a considerable rate.
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
81 In an attempt to improve the speed of function calls, we maintain a
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
82 separate free list of stack frames (just like integers are
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
83 allocated in a special way -- see intobject.c). When a stack frame
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
84 is on the free list, only the following members have a meaning:
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
85 ob_type == &Frametype
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
86 f_back next item on free list, or NULL
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
87 f_nvalues size of f_valuestack
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
88 f_valuestack array of (f_nvalues+1) object pointers, or NULL
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
89 f_nblocks size of f_blockstack
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
90 f_blockstack array of (f_nblocks+1) blocks, or NULL
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
91 Note that the value and block stacks are preserved -- this can save
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
92 another malloc() call or two (and two free() calls as well!).
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
93 Also note that, unlike for integers, each frame object is a
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
94 malloc'ed object in its own right -- it is only the actual calls to
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
95 malloc() that we are trying to save here, not the administration.
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
96 After all, while a typical program may make millions of calls, a
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
97 call depth of more than 20 or 30 is probably already exceptional
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
98 unless the program contains run-away recursion. I hope.
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
99 */
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
100
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
101 static frameobject *free_list = NULL;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
102
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 static void
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 frame_dealloc(f)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 frameobject *f;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 XDECREF(f->f_back);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 XDECREF(f->f_code);
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
109 XDECREF(f->f_builtins);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 XDECREF(f->f_globals);
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 XDECREF(f->f_locals);
1293
ac3c80abbf43 * classobject.c: in instance_getattr, don't make a method out of a
Guido van Rossum <guido@python.org>
parents: 1289
diff changeset
112 XDECREF(f->f_owner);
1262
f820e6917f07 Changes to speed up local variables enormously, by avoiding dictionary
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
113 XDECREF(f->f_fastlocals);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
114 XDECREF(f->f_trace);
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
115 f->f_back = free_list;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
116 free_list = f;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 typeobject Frametype = {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 OB_HEAD_INIT(&Typetype)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 0,
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 "frame",
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 sizeof(frameobject),
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 0,
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
125 (destructor)frame_dealloc, /*tp_dealloc*/
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 0, /*tp_print*/
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
127 (getattrfunc)frame_getattr, /*tp_getattr*/
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
128 (setattrfunc)frame_setattr, /*tp_setattr*/
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 0, /*tp_compare*/
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 0, /*tp_repr*/
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 0, /*tp_as_number*/
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 0, /*tp_as_sequence*/
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 0, /*tp_as_mapping*/
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 frameobject *
1293
ac3c80abbf43 * classobject.c: in instance_getattr, don't make a method out of a
Guido van Rossum <guido@python.org>
parents: 1289
diff changeset
137 newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 frameobject *back;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 codeobject *code;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 object *globals;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 object *locals;
1293
ac3c80abbf43 * classobject.c: in instance_getattr, don't make a method out of a
Guido van Rossum <guido@python.org>
parents: 1289
diff changeset
142 object *owner;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 int nvalues;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 int nblocks;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 {
2627
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
146 static object *builtin_object;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 frameobject *f;
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
148 object *builtins;
2627
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
149 if (builtin_object == NULL) {
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
150 builtin_object = newstringobject("__builtins__");
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
151 if (builtin_object == NULL)
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
152 return NULL;
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
153 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 if ((back != NULL && !is_frameobject(back)) ||
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 code == NULL || !is_codeobject(code) ||
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 globals == NULL || !is_dictobject(globals) ||
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
157 locals != NULL && !is_dictobject(locals) ||
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 nvalues < 0 || nblocks < 0) {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 err_badcall();
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 }
2627
e9ea05702676 Use mappinglookup instead of dictlookup for looking up __builtin__.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2151
diff changeset
162 builtins = mappinglookup(globals, builtin_object);
2151
5fd8524dd03a different init for __builtins__
Guido van Rossum <guido@python.org>
parents: 2104
diff changeset
163 if (builtins != NULL && is_moduleobject(builtins))
5fd8524dd03a different init for __builtins__
Guido van Rossum <guido@python.org>
parents: 2104
diff changeset
164 builtins = getmoduledict(builtins);
2104
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
165 if (builtins == NULL || !is_mappingobject(builtins)) {
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
166 err_setstr(TypeError, "bad __builtins__ dictionary");
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
167 return NULL;
7493c6805dc6 add builtins handling and restricted flag
Guido van Rossum <guido@python.org>
parents: 2059
diff changeset
168 }
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
169 if (free_list == NULL) {
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
170 f = NEWOBJ(frameobject, &Frametype);
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
171 if (f == NULL)
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
172 return NULL;
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
173 f->f_nvalues = f->f_nblocks = 0;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
174 f->f_valuestack = NULL;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
175 f->f_blockstack = NULL;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
176 }
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
177 else {
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
178 f = free_list;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
179 free_list = free_list->f_back;
1334
f3848f74b282 * clmodule.c (doParams): free PVbuffer in error condition.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1293
diff changeset
180 f->ob_type = &Frametype;
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
181 NEWREF(f);
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
182 }
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
183 XINCREF(back);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
184 f->f_back = back;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
185 INCREF(code);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
186 f->f_code = code;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
187 XINCREF(builtins);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
188 f->f_builtins = builtins;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
189 INCREF(globals);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
190 f->f_globals = globals;
2856
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
191 if (code->co_flags & CO_NEWLOCALS) {
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
192 if (code->co_flags & CO_OPTIMIZED)
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
193 locals = NULL; /* Let fast_2_locals handle it */
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
194 else {
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
195 locals = newdictobject();
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
196 if (locals == NULL) {
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
197 DECREF(f);
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
198 return NULL;
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
199 }
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
200 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
201 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
202 else {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
203 if (locals == NULL)
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
204 locals = globals;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 INCREF(locals);
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
206 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
207 f->f_locals = locals;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
208 XINCREF(owner);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
209 f->f_owner = owner;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
210 f->f_fastlocals = NULL;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
211 if (code->co_nlocals > 0) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
212 f->f_fastlocals = newlistobject(code->co_nlocals);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
213 if (f->f_fastlocals == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
214 DECREF(f);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
215 return NULL;
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
216 }
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
217 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
218 if (nvalues > f->f_nvalues || f->f_valuestack == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
219 XDEL(f->f_valuestack);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
220 f->f_valuestack = NEW(object *, nvalues+1);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
221 f->f_nvalues = nvalues;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
222 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
223 if (nblocks > f->f_nblocks || f->f_blockstack == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
224 XDEL(f->f_blockstack);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
225 f->f_blockstack = NEW(block, nblocks+1);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
226 f->f_nblocks = nblocks;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
227 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
228 f->f_iblock = 0;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
229 f->f_lasti = 0;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
230 f->f_lineno = -1;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
231 f->f_restricted = (builtins != getbuiltindict());
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
232 f->f_trace = NULL;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
233 if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
234 err_nomem();
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
235 DECREF(f);
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
236 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 return f;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
240
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
241 object **
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
242 extend_stack(f, level, incr)
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
243 frameobject *f;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
244 int level;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
245 int incr;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
246 {
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
247 f->f_nvalues = level + incr + 10;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
248 f->f_valuestack =
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
249 (object **) realloc((ANY *)f->f_valuestack,
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
250 sizeof(object *) * (f->f_nvalues + 1));
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
251 if (f->f_valuestack == NULL) {
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
252 err_nomem();
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
253 return NULL;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
254 }
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
255 return f->f_valuestack + level;
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
256 }
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
257
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 /* Block management */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
259
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 void
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 setup_block(f, type, handler, level)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 frameobject *f;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 int type;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 int handler;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 int level;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 block *b;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
268 if (f->f_iblock >= f->f_nblocks)
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
269 fatal("XXX block stack overflow");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 b = &f->f_blockstack[f->f_iblock++];
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 b->b_type = type;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 b->b_level = level;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 b->b_handler = handler;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
275
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 block *
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 pop_block(f)
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 frameobject *f;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 block *b;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
281 if (f->f_iblock <= 0)
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
282 fatal("XXX block stack underflow");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 b = &f->f_blockstack[--f->f_iblock];
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 return b;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 }
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
286
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
287 /* Convert between "fast" version of locals and dictionary version */
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
288
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
289 void
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
290 fast_2_locals(f)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
291 frameobject *f;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
292 {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
293 /* Merge f->f_fastlocals into f->f_locals */
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
294 object *locals, *fast, *map;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
295 object *error_type, *error_value, *error_traceback;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
296 int j;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
297 if (f == NULL)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
298 return;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
299 locals = f->f_locals;
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
300 if (locals == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
301 locals = f->f_locals = newdictobject();
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
302 if (locals == NULL) {
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
303 err_clear(); /* Can't report it :-( */
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
304 return;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
305 }
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
306 }
2856
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
307 fast = f->f_fastlocals;
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
308 if (fast == NULL || f->f_code->co_nlocals == 0)
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
309 return;
a7af970a94a4 better policy regarding NULL locals
Guido van Rossum <guido@python.org>
parents: 2842
diff changeset
310 map = f->f_code->co_varnames;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
311 if (!is_dictobject(locals) || !is_listobject(fast) ||
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
312 !is_tupleobject(map))
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
313 return;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
314 err_fetch(&error_type, &error_value, &error_traceback);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
315 for (j = gettuplesize(map); --j >= 0; ) {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
316 object *key = gettupleitem(map, j);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
317 object *value = getlistitem(fast, j);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
318 if (value == NULL) {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
319 err_clear();
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
320 if (dict2remove(locals, key) != 0)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
321 err_clear();
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
322 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
323 else {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
324 if (dict2insert(locals, key, value) != 0)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
325 err_clear();
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
326 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
327 }
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
328 err_restore(error_type, error_value, error_traceback);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
329 }
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
330
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
331 void
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
332 locals_2_fast(f, clear)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
333 frameobject *f;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
334 int clear;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
335 {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
336 /* Merge f->f_locals into f->f_fastlocals */
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
337 object *locals, *fast, *map;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
338 object *error_type, *error_value, *error_traceback;
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
339 int j;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
340 if (f == NULL)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
341 return;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
342 locals = f->f_locals;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
343 fast = f->f_fastlocals;
2842
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
344 map = f->f_code->co_varnames;
420874f7d8bd changes for keyword arguments and fast function call; added abstract.c
Guido van Rossum <guido@python.org>
parents: 2627
diff changeset
345 if (locals == NULL || fast == NULL || f->f_code->co_nlocals == 0)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
346 return;
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
347 if (!is_dictobject(locals) || !is_listobject(fast) ||
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
348 !is_tupleobject(map))
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
349 return;
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
350 err_fetch(&error_type, &error_value, &error_traceback);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
351 for (j = gettuplesize(map); --j >= 0; ) {
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
352 object *key = gettupleitem(map, j);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
353 object *value = dict2lookup(locals, key);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
354 if (value == NULL)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
355 err_clear();
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
356 else
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
357 INCREF(value);
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
358 if (value != NULL || clear)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
359 if (setlistitem(fast, j, value) != 0)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
360 err_clear();
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
361 }
2053
de49d49044d7 Lots of minor changes. Note for mappingobject.c: the hash table pointer
Guido van Rossum <guido@python.org>
parents: 1848
diff changeset
362 err_restore(error_type, error_value, error_traceback);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1334
diff changeset
363 }