Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
18752475
Kaydet (Commit)
18752475
authored
Nis 29, 1997
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Quickly renamed.
üst
9d0a3dfa
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
101 additions
and
100 deletions
+101
-100
frameobject.c
Objects/frameobject.c
+101
-100
No files found.
Objects/frameobject.c
Dosyayı görüntüle @
18752475
...
...
@@ -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