Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
acc3eb77
Commit
acc3eb77
authored
Apr 29, 1997
by
Guido van Rossum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Quickly renamed.
parent
dba2948a
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
101 additions
and
100 deletions
+101
-100
Objects/frameobject.c
Objects/frameobject.c
+101
-100
No files found.
Objects/frameobject.c
View file @
acc3eb77
...
...
@@ -31,15 +31,14 @@ PERFORMANCE OF THIS SOFTWARE.
/* Frame object implementation */
#include "
allobjects
.h"
#include "
Python
.h"
#include "compile.h"
#include "frameobject.h"
#include "opcode.h"
#include "structmember.h"
#include "bltinmodule.h"
#define OFF(x) offsetof(
frameo
bject, x)
#define OFF(x) offsetof(
PyFrameO
bject, x)
static
struct
memberlist
frame_memberlist
[]
=
{
{
"f_back"
,
T_OBJECT
,
OFF
(
f_back
),
RO
},
...
...
@@ -54,23 +53,23 @@ static struct memberlist frame_memberlist[] = {
{
NULL
}
/* Sentinel */
};
static
o
bject
*
static
PyO
bject
*
frame_getattr
(
f
,
name
)
frameo
bject
*
f
;
PyFrameO
bject
*
f
;
char
*
name
;
{
if
(
strcmp
(
name
,
"f_locals"
)
==
0
)
fast_2_l
ocals
(
f
);
return
getmember
((
char
*
)
f
,
frame_memberlist
,
name
);
PyFrame_FastToL
ocals
(
f
);
return
PyMember_Get
((
char
*
)
f
,
frame_memberlist
,
name
);
}
static
int
frame_setattr
(
f
,
name
,
value
)
frameo
bject
*
f
;
PyFrameO
bject
*
f
;
char
*
name
;
o
bject
*
value
;
PyO
bject
*
value
;
{
return
setmember
((
char
*
)
f
,
frame_memberlist
,
name
,
value
);
return
PyMember_Set
((
char
*
)
f
,
frame_memberlist
,
name
,
value
);
}
/* Stack frames are allocated and deallocated at a considerable rate.
...
...
@@ -92,11 +91,11 @@ frame_setattr(f, name, value)
unless the program contains run-away recursion. I hope.
*/
static
frameo
bject
*
free_list
=
NULL
;
static
PyFrameO
bject
*
free_list
=
NULL
;
static
void
frame_dealloc
(
f
)
frameo
bject
*
f
;
PyFrameO
bject
*
f
;
{
int
i
;
PyObject
**
fastlocals
;
...
...
@@ -104,24 +103,24 @@ frame_dealloc(f)
/* Kill all local variables */
fastlocals
=
f
->
f_localsplus
;
for
(
i
=
f
->
f_nlocals
;
--
i
>=
0
;
++
fastlocals
)
{
XDECREF
(
*
fastlocals
);
Py_
XDECREF
(
*
fastlocals
);
}
XDECREF
(
f
->
f_back
);
XDECREF
(
f
->
f_code
);
XDECREF
(
f
->
f_builtins
);
XDECREF
(
f
->
f_globals
);
XDECREF
(
f
->
f_locals
);
XDECREF
(
f
->
f_trace
);
Py_
XDECREF
(
f
->
f_back
);
Py_
XDECREF
(
f
->
f_code
);
Py_
XDECREF
(
f
->
f_builtins
);
Py_
XDECREF
(
f
->
f_globals
);
Py_
XDECREF
(
f
->
f_locals
);
Py_
XDECREF
(
f
->
f_trace
);
f
->
f_back
=
free_list
;
free_list
=
f
;
}
typeobject
Framet
ype
=
{
OB_HEAD_INIT
(
&
Typet
ype
)
PyTypeObject
PyFrame_T
ype
=
{
PyObject_HEAD_INIT
(
&
PyType_T
ype
)
0
,
"frame"
,
sizeof
(
frameo
bject
),
sizeof
(
PyFrameO
bject
),
0
,
(
destructor
)
frame_dealloc
,
/*tp_dealloc*/
0
,
/*tp_print*/
...
...
@@ -134,16 +133,16 @@ typeobject Frametype = {
0
,
/*tp_as_mapping*/
};
frameo
bject
*
newframeobject
(
back
,
code
,
globals
,
locals
)
frameo
bject
*
back
;
codeo
bject
*
code
;
o
bject
*
globals
;
o
bject
*
locals
;
PyFrameO
bject
*
PyFrame_New
(
back
,
code
,
globals
,
locals
)
PyFrameO
bject
*
back
;
PyCodeO
bject
*
code
;
PyO
bject
*
globals
;
PyO
bject
*
locals
;
{
static
o
bject
*
builtin_object
;
frameo
bject
*
f
;
o
bject
*
builtins
;
static
PyO
bject
*
builtin_object
;
PyFrameO
bject
*
f
;
PyO
bject
*
builtins
;
int
extras
=
code
->
co_stacksize
+
code
->
co_nlocals
;
if
(
builtin_object
==
NULL
)
{
...
...
@@ -151,57 +150,59 @@ newframeobject(back, code, globals, locals)
if
(
builtin_object
==
NULL
)
return
NULL
;
}
if
((
back
!=
NULL
&&
!
is_frameobject
(
back
))
||
code
==
NULL
||
!
is_codeobject
(
code
)
||
globals
==
NULL
||
!
is_dictobject
(
globals
)
||
(
locals
!=
NULL
&&
!
is_dictobject
(
locals
)))
{
err_badc
all
();
if
((
back
!=
NULL
&&
!
PyFrame_Check
(
back
))
||
code
==
NULL
||
!
PyCode_Check
(
code
)
||
globals
==
NULL
||
!
PyDict_Check
(
globals
)
||
(
locals
!=
NULL
&&
!
PyDict_Check
(
locals
)))
{
PyErr_BadInternalC
all
();
return
NULL
;
}
builtins
=
mappinglookup
(
globals
,
builtin_object
);
if
(
builtins
!=
NULL
&&
is_moduleobject
(
builtins
))
builtins
=
getmoduledict
(
builtins
);
if
(
builtins
==
NULL
||
!
is_mappingobject
(
builtins
))
{
err_setstr
(
TypeError
,
"bad __builtins__ dictionary"
);
builtins
=
PyDict_GetItem
(
globals
,
builtin_object
);
if
(
builtins
!=
NULL
&&
PyModule_Check
(
builtins
))
builtins
=
PyModule_GetDict
(
builtins
);
if
(
builtins
==
NULL
||
!
PyDict_Check
(
builtins
))
{
PyErr_SetString
(
PyExc_TypeError
,
"bad __builtins__ dictionary"
);
return
NULL
;
}
if
(
free_list
==
NULL
)
{
f
=
(
frameobject
*
)
malloc
(
sizeof
(
frameobject
)
+
extras
*
sizeof
(
object
*
));
f
=
(
PyFrameObject
*
)
malloc
(
sizeof
(
PyFrameObject
)
+
extras
*
sizeof
(
PyObject
*
));
if
(
f
==
NULL
)
return
(
PyFrameObject
*
)
err_nomem
();
f
->
ob_type
=
&
Framet
ype
;
NEWREF
(
f
);
return
(
PyFrameObject
*
)
PyErr_NoMemory
();
f
->
ob_type
=
&
PyFrame_T
ype
;
_Py_NewReference
(
f
);
}
else
{
f
=
free_list
;
free_list
=
free_list
->
f_back
;
if
(
f
->
f_nlocals
+
f
->
f_stacksize
<
extras
)
{
f
=
realloc
(
f
,
sizeof
(
frameo
bject
)
+
extras
*
sizeof
(
o
bject
*
));
f
=
realloc
(
f
,
sizeof
(
PyFrameO
bject
)
+
extras
*
sizeof
(
PyO
bject
*
));
if
(
f
==
NULL
)
return
(
PyFrameObject
*
)
err_nomem
();
return
(
PyFrameObject
*
)
PyErr_NoMemory
();
}
else
extras
=
f
->
f_nlocals
+
f
->
f_stacksize
;
f
->
ob_type
=
&
Framet
ype
;
NEWREF
(
f
);
f
->
ob_type
=
&
PyFrame_T
ype
;
_Py_NewReference
(
f
);
}
XINCREF
(
back
);
Py_
XINCREF
(
back
);
f
->
f_back
=
back
;
INCREF
(
code
);
Py_
INCREF
(
code
);
f
->
f_code
=
code
;
XINCREF
(
builtins
);
Py_
XINCREF
(
builtins
);
f
->
f_builtins
=
builtins
;
INCREF
(
globals
);
Py_
INCREF
(
globals
);
f
->
f_globals
=
globals
;
if
(
code
->
co_flags
&
CO_NEWLOCALS
)
{
if
(
code
->
co_flags
&
CO_OPTIMIZED
)
locals
=
NULL
;
/* Let fast_2_locals handle it */
else
{
locals
=
newdictobject
();
locals
=
PyDict_New
();
if
(
locals
==
NULL
)
{
DECREF
(
f
);
Py_
DECREF
(
f
);
return
NULL
;
}
}
...
...
@@ -209,14 +210,14 @@ newframeobject(back, code, globals, locals)
else
{
if
(
locals
==
NULL
)
locals
=
globals
;
INCREF
(
locals
);
Py_
INCREF
(
locals
);
}
f
->
f_locals
=
locals
;
f
->
f_trace
=
NULL
;
f
->
f_lasti
=
0
;
f
->
f_lineno
=
code
->
co_firstlineno
;
f
->
f_restricted
=
(
builtins
!=
getbuiltind
ict
());
f
->
f_restricted
=
(
builtins
!=
PyBuiltin_GetD
ict
());
f
->
f_iblock
=
0
;
f
->
f_nlocals
=
code
->
co_nlocals
;
f
->
f_stacksize
=
extras
-
code
->
co_nlocals
;
...
...
@@ -232,28 +233,28 @@ newframeobject(back, code, globals, locals)
/* Block management */
void
setup_block
(
f
,
type
,
handler
,
level
)
frameo
bject
*
f
;
PyFrame_BlockSetup
(
f
,
type
,
handler
,
level
)
PyFrameO
bject
*
f
;
int
type
;
int
handler
;
int
level
;
{
b
lock
*
b
;
PyTryB
lock
*
b
;
if
(
f
->
f_iblock
>=
CO_MAXBLOCKS
)
fatal
(
"XXX block stack overflow"
);
Py_FatalError
(
"XXX block stack overflow"
);
b
=
&
f
->
f_blockstack
[
f
->
f_iblock
++
];
b
->
b_type
=
type
;
b
->
b_level
=
level
;
b
->
b_handler
=
handler
;
}
b
lock
*
pop_block
(
f
)
frameo
bject
*
f
;
PyTryB
lock
*
PyFrame_BlockPop
(
f
)
PyFrameO
bject
*
f
;
{
b
lock
*
b
;
PyTryB
lock
*
b
;
if
(
f
->
f_iblock
<=
0
)
fatal
(
"XXX block stack underflow"
);
Py_FatalError
(
"XXX block stack underflow"
);
b
=
&
f
->
f_blockstack
[
--
f
->
f_iblock
];
return
b
;
}
...
...
@@ -261,59 +262,59 @@ pop_block(f)
/* Convert between "fast" version of locals and dictionary version */
void
fast_2_l
ocals
(
f
)
frameo
bject
*
f
;
PyFrame_FastToL
ocals
(
f
)
PyFrameO
bject
*
f
;
{
/* Merge fast locals into f->f_locals */
o
bject
*
locals
,
*
map
;
o
bject
**
fast
;
o
bject
*
error_type
,
*
error_value
,
*
error_traceback
;
PyO
bject
*
locals
,
*
map
;
PyO
bject
**
fast
;
PyO
bject
*
error_type
,
*
error_value
,
*
error_traceback
;
int
j
;
if
(
f
==
NULL
)
return
;
locals
=
f
->
f_locals
;
if
(
locals
==
NULL
)
{
locals
=
f
->
f_locals
=
newdictobject
();
locals
=
f
->
f_locals
=
PyDict_New
();
if
(
locals
==
NULL
)
{
err_c
lear
();
/* Can't report it :-( */
PyErr_C
lear
();
/* Can't report it :-( */
return
;
}
}
if
(
f
->
f_nlocals
==
0
)
return
;
map
=
f
->
f_code
->
co_varnames
;
if
(
!
is_dictobject
(
locals
)
||
!
is_tupleobject
(
map
))
if
(
!
PyDict_Check
(
locals
)
||
!
PyTuple_Check
(
map
))
return
;
err_f
etch
(
&
error_type
,
&
error_value
,
&
error_traceback
);
PyErr_F
etch
(
&
error_type
,
&
error_value
,
&
error_traceback
);
fast
=
f
->
f_localsplus
;
j
=
gettuples
ize
(
map
);
j
=
PyTuple_S
ize
(
map
);
if
(
j
>
f
->
f_nlocals
)
j
=
f
->
f_nlocals
;
for
(;
--
j
>=
0
;
)
{
object
*
key
=
gettuplei
tem
(
map
,
j
);
o
bject
*
value
=
fast
[
j
];
PyObject
*
key
=
PyTuple_GetI
tem
(
map
,
j
);
PyO
bject
*
value
=
fast
[
j
];
if
(
value
==
NULL
)
{
err_c
lear
();
if
(
dict2remove
(
locals
,
key
)
!=
0
)
err_c
lear
();
PyErr_C
lear
();
if
(
PyDict_DelItem
(
locals
,
key
)
!=
0
)
PyErr_C
lear
();
}
else
{
if
(
dict2insert
(
locals
,
key
,
value
)
!=
0
)
err_c
lear
();
if
(
PyDict_SetItem
(
locals
,
key
,
value
)
!=
0
)
PyErr_C
lear
();
}
}
err_r
estore
(
error_type
,
error_value
,
error_traceback
);
PyErr_R
estore
(
error_type
,
error_value
,
error_traceback
);
}
void
locals_2_f
ast
(
f
,
clear
)
frameo
bject
*
f
;
PyFrame_LocalsToF
ast
(
f
,
clear
)
PyFrameO
bject
*
f
;
int
clear
;
{
/* Merge f->f_locals into fast locals */
o
bject
*
locals
,
*
map
;
o
bject
**
fast
;
o
bject
*
error_type
,
*
error_value
,
*
error_traceback
;
PyO
bject
*
locals
,
*
map
;
PyO
bject
**
fast
;
PyO
bject
*
error_type
,
*
error_value
,
*
error_traceback
;
int
j
;
if
(
f
==
NULL
)
return
;
...
...
@@ -321,24 +322,24 @@ locals_2_fast(f, clear)
map
=
f
->
f_code
->
co_varnames
;
if
(
locals
==
NULL
||
f
->
f_code
->
co_nlocals
==
0
)
return
;
if
(
!
is_dictobject
(
locals
)
||
!
is_tupleobject
(
map
))
if
(
!
PyDict_Check
(
locals
)
||
!
PyTuple_Check
(
map
))
return
;
err_f
etch
(
&
error_type
,
&
error_value
,
&
error_traceback
);
PyErr_F
etch
(
&
error_type
,
&
error_value
,
&
error_traceback
);
fast
=
f
->
f_localsplus
;
j
=
gettuples
ize
(
map
);
j
=
PyTuple_S
ize
(
map
);
if
(
j
>
f
->
f_nlocals
)
j
=
f
->
f_nlocals
;
for
(;
--
j
>=
0
;
)
{
object
*
key
=
gettuplei
tem
(
map
,
j
);
object
*
value
=
dict2lookup
(
locals
,
key
);
PyObject
*
key
=
PyTuple_GetI
tem
(
map
,
j
);
PyObject
*
value
=
PyDict_GetItem
(
locals
,
key
);
if
(
value
==
NULL
)
err_c
lear
();
PyErr_C
lear
();
else
INCREF
(
value
);
Py_
INCREF
(
value
);
if
(
value
!=
NULL
||
clear
)
{
XDECREF
(
fast
[
j
]);
Py_
XDECREF
(
fast
[
j
]);
fast
[
j
]
=
value
;
}
}
err_r
estore
(
error_type
,
error_value
,
error_traceback
);
PyErr_R
estore
(
error_type
,
error_value
,
error_traceback
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment