Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion 1 Include/cpython/import.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ struct _frozen {
const unsigned char *code;
int size;
int is_package;
PyObject *(*get_code)(void);
};

/* Embedding apps may change this pointer to point to their favorite
Expand Down
2 changes: 0 additions & 2 deletions 2 Include/internal/pycore_code.h
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,6 @@ adaptive_counter_backoff(uint16_t counter) {
return adaptive_counter_bits(value, backoff);
}

extern uint32_t _Py_next_func_version;


/* Comparison bit masks. */

Expand Down
5 changes: 0 additions & 5 deletions 5 Include/internal/pycore_global_objects_fini_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions 5 Include/internal/pycore_global_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,8 @@ struct _Py_global_strings {
STRUCT_FOR_ID(after_in_child)
STRUCT_FOR_ID(after_in_parent)
STRUCT_FOR_ID(aggregate_class)
STRUCT_FOR_ID(alias)
STRUCT_FOR_ID(append)
STRUCT_FOR_ID(argdefs)
STRUCT_FOR_ID(args)
STRUCT_FOR_ID(arguments)
STRUCT_FOR_ID(argv)
STRUCT_FOR_ID(as_integer_ratio)
Expand Down Expand Up @@ -403,8 +401,6 @@ struct _Py_global_strings {
STRUCT_FOR_ID(errors)
STRUCT_FOR_ID(event)
STRUCT_FOR_ID(eventmask)
STRUCT_FOR_ID(exc_type)
STRUCT_FOR_ID(exc_value)
STRUCT_FOR_ID(excepthook)
STRUCT_FOR_ID(exception)
STRUCT_FOR_ID(existing_file_name)
Expand Down Expand Up @@ -720,7 +716,6 @@ struct _Py_global_strings {
STRUCT_FOR_ID(timetuple)
STRUCT_FOR_ID(top)
STRUCT_FOR_ID(trace_callback)
STRUCT_FOR_ID(traceback)
STRUCT_FOR_ID(trailers)
STRUCT_FOR_ID(translate)
STRUCT_FOR_ID(true)
Expand Down
1 change: 1 addition & 0 deletions 1 Include/internal/pycore_interp.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ struct _is {
_PyOptimizerObject *optimizer;
uint16_t optimizer_resume_threshold;
uint16_t optimizer_backedge_threshold;
uint32_t next_func_version;

_Py_Monitors monitors;
bool f_opcode_trace_set;
Expand Down
5 changes: 0 additions & 5 deletions 5 Include/internal/pycore_runtime_init_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 0 additions & 15 deletions 15 Include/internal/pycore_unicodeobject_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion 1 Lib/test/test_ctypes/test_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class struct_frozen(Structure):
("code", POINTER(c_ubyte)),
("size", c_int),
("is_package", c_int),
("get_code", POINTER(c_ubyte)), # Function ptr
]
FrozenTable = POINTER(struct_frozen)

Expand Down
1 change: 0 additions & 1 deletion 1 Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,6 @@ LIBRARY_OBJS_OMIT_FROZEN= \

LIBRARY_OBJS= \
$(LIBRARY_OBJS_OMIT_FROZEN) \
$(DEEPFREEZE_OBJS) \
Modules/getpath.o \
Python/frozen.o

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Turn off deep-freezing of code objects. Modules are still frozen, so that a
file system search is not needed for common modules.
7 changes: 4 additions & 3 deletions 7 Objects/codeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,9 +427,10 @@ init_code(PyCodeObject *co, struct _PyCodeConstructor *con)
co->co_framesize = nlocalsplus + con->stacksize + FRAME_SPECIALS_SIZE;
co->co_ncellvars = ncellvars;
co->co_nfreevars = nfreevars;
co->co_version = _Py_next_func_version;
if (_Py_next_func_version != 0) {
_Py_next_func_version++;
PyInterpreterState *interp = _PyInterpreterState_GET();
co->co_version = interp->next_func_version;
if (interp->next_func_version != 0) {
interp->next_func_version++;
}
co->_co_monitoring = NULL;
co->_co_instrumentation_version = 0;
Expand Down
9 changes: 3 additions & 6 deletions 9 Objects/funcobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

#include "Python.h"
#include "pycore_ceval.h" // _PyEval_BuiltinsFromGlobals()
#include "pycore_code.h" // _Py_next_func_version
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
#include "pycore_pyerrors.h" // _PyErr_Occurred()

Expand Down Expand Up @@ -252,11 +251,9 @@ When the function version is 0, the `CALL` bytecode is not specialized.
Code object versions
--------------------

So where to code objects get their `co_version`? There is a single
static global counter, `_Py_next_func_version`. This is initialized in
the generated (!) file `Python/deepfreeze/deepfreeze.c`, to 1 plus the
number of deep-frozen function objects in that file.
(In `_bootstrap_python.c` and `freeze_module.c` it is initialized to 1.)
So where to code objects get their `co_version`?
There is a per-interpreter counter, `next_func_version`.
This is initialized to 1 when the interpreter is created.

Code objects get a new `co_version` allocated from this counter upon
creation. Since code objects are nominally immutable, `co_version` can
Expand Down
2 changes: 0 additions & 2 deletions 2 Programs/_bootstrap_python.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
#include "Python/frozen_modules/zipimport.h"
/* End includes */

uint32_t _Py_next_func_version = 1;

/* Empty initializer for deepfrozen modules */
int _Py_Deepfreeze_Init(void)
{
Expand Down
2 changes: 0 additions & 2 deletions 2 Programs/_freeze_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
#include <unistd.h>
#endif

uint32_t _Py_next_func_version = 1;

/* Empty initializer for deepfrozen modules */
int _Py_Deepfreeze_Init(void)
{
Expand Down
58 changes: 29 additions & 29 deletions 58 Python/frozen.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,46 +101,46 @@ extern PyObject *_Py_get_frozen_only_toplevel(void);
/* End extern declarations */

static const struct _frozen bootstrap_modules[] = {
{"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap), false, GET_CODE(importlib__bootstrap)},
{"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external), false, GET_CODE(importlib__bootstrap_external)},
{"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport), false, GET_CODE(zipimport)},
{"_frozen_importlib", _Py_M__importlib__bootstrap, (int)sizeof(_Py_M__importlib__bootstrap), false},
{"_frozen_importlib_external", _Py_M__importlib__bootstrap_external, (int)sizeof(_Py_M__importlib__bootstrap_external), false},
{"zipimport", _Py_M__zipimport, (int)sizeof(_Py_M__zipimport), false},
{0, 0, 0} /* bootstrap sentinel */
};
static const struct _frozen stdlib_modules[] = {
/* stdlib - startup, without site (python -S) */
{"abc", _Py_M__abc, (int)sizeof(_Py_M__abc), false, GET_CODE(abc)},
{"codecs", _Py_M__codecs, (int)sizeof(_Py_M__codecs), false, GET_CODE(codecs)},
{"io", _Py_M__io, (int)sizeof(_Py_M__io), false, GET_CODE(io)},
{"abc", _Py_M__abc, (int)sizeof(_Py_M__abc), false},
{"codecs", _Py_M__codecs, (int)sizeof(_Py_M__codecs), false},
{"io", _Py_M__io, (int)sizeof(_Py_M__io), false},

/* stdlib - startup, with site */
{"_collections_abc", _Py_M___collections_abc, (int)sizeof(_Py_M___collections_abc), false, GET_CODE(_collections_abc)},
{"_sitebuiltins", _Py_M___sitebuiltins, (int)sizeof(_Py_M___sitebuiltins), false, GET_CODE(_sitebuiltins)},
{"genericpath", _Py_M__genericpath, (int)sizeof(_Py_M__genericpath), false, GET_CODE(genericpath)},
{"ntpath", _Py_M__ntpath, (int)sizeof(_Py_M__ntpath), false, GET_CODE(ntpath)},
{"posixpath", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false, GET_CODE(posixpath)},
{"os.path", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false, GET_CODE(posixpath)},
{"os", _Py_M__os, (int)sizeof(_Py_M__os), false, GET_CODE(os)},
{"site", _Py_M__site, (int)sizeof(_Py_M__site), false, GET_CODE(site)},
{"stat", _Py_M__stat, (int)sizeof(_Py_M__stat), false, GET_CODE(stat)},
{"_collections_abc", _Py_M___collections_abc, (int)sizeof(_Py_M___collections_abc), false},
{"_sitebuiltins", _Py_M___sitebuiltins, (int)sizeof(_Py_M___sitebuiltins), false},
{"genericpath", _Py_M__genericpath, (int)sizeof(_Py_M__genericpath), false},
{"ntpath", _Py_M__ntpath, (int)sizeof(_Py_M__ntpath), false},
{"posixpath", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false},
{"os.path", _Py_M__posixpath, (int)sizeof(_Py_M__posixpath), false},
{"os", _Py_M__os, (int)sizeof(_Py_M__os), false},
{"site", _Py_M__site, (int)sizeof(_Py_M__site), false},
{"stat", _Py_M__stat, (int)sizeof(_Py_M__stat), false},

/* runpy - run module with -m */
{"importlib.util", _Py_M__importlib_util, (int)sizeof(_Py_M__importlib_util), false, GET_CODE(importlib_util)},
{"importlib.machinery", _Py_M__importlib_machinery, (int)sizeof(_Py_M__importlib_machinery), false, GET_CODE(importlib_machinery)},
{"runpy", _Py_M__runpy, (int)sizeof(_Py_M__runpy), false, GET_CODE(runpy)},
{"importlib.util", _Py_M__importlib_util, (int)sizeof(_Py_M__importlib_util), false},
{"importlib.machinery", _Py_M__importlib_machinery, (int)sizeof(_Py_M__importlib_machinery), false},
{"runpy", _Py_M__runpy, (int)sizeof(_Py_M__runpy), false},
{0, 0, 0} /* stdlib sentinel */
};
static const struct _frozen test_modules[] = {
{"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)},
{"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)},
{"__phello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), true, GET_CODE(__hello__)},
{"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false, GET_CODE(__hello__)},
{"__phello__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), true, GET_CODE(__phello__)},
{"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), false, GET_CODE(__phello__)},
{"__phello__.ham", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), true, GET_CODE(__phello___ham)},
{"__phello__.ham.__init__", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), false, GET_CODE(__phello___ham)},
{"__phello__.ham.eggs", _Py_M____phello___ham_eggs, (int)sizeof(_Py_M____phello___ham_eggs), false, GET_CODE(__phello___ham_eggs)},
{"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam), false, GET_CODE(__phello___spam)},
{"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only), false, GET_CODE(frozen_only)},
{"__hello__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false},
{"__hello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false},
{"__phello_alias__", _Py_M____hello__, (int)sizeof(_Py_M____hello__), true},
{"__phello_alias__.spam", _Py_M____hello__, (int)sizeof(_Py_M____hello__), false},
{"__phello__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), true},
{"__phello__.__init__", _Py_M____phello__, (int)sizeof(_Py_M____phello__), false},
{"__phello__.ham", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), true},
{"__phello__.ham.__init__", _Py_M____phello___ham, (int)sizeof(_Py_M____phello___ham), false},
{"__phello__.ham.eggs", _Py_M____phello___ham_eggs, (int)sizeof(_Py_M____phello___ham_eggs), false},
{"__phello__.spam", _Py_M____phello___spam, (int)sizeof(_Py_M____phello___spam), false},
{"__hello_only__", _Py_M__frozen_only, (int)sizeof(_Py_M__frozen_only), false},
{0, 0, 0} /* test sentinel */
};
const struct _frozen *_PyImport_FrozenBootstrap = bootstrap_modules;
Expand Down
13 changes: 1 addition & 12 deletions 13 Python/import.c
Original file line number Diff line number Diff line change
Expand Up @@ -2006,7 +2006,6 @@ look_up_frozen(const char *name)
struct frozen_info {
PyObject *nameobj;
const char *data;
PyObject *(*get_code)(void);
Py_ssize_t size;
bool is_package;
bool is_alias;
Expand Down Expand Up @@ -2040,7 +2039,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info)
if (info != NULL) {
info->nameobj = nameobj; // borrowed
info->data = (const char *)p->code;
info->get_code = p->get_code;
info->size = p->size;
info->is_package = p->is_package;
if (p->size < 0) {
Expand All @@ -2052,10 +2050,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info)
info->is_alias = resolve_module_alias(name, _PyImport_FrozenAliases,
&info->origname);
}
if (p->code == NULL && p->size == 0 && p->get_code != NULL) {
/* It is only deepfrozen. */
return FROZEN_OKAY;
}
if (p->code == NULL) {
/* It is frozen but marked as un-importable. */
return FROZEN_EXCLUDED;
Expand All @@ -2070,11 +2064,6 @@ find_frozen(PyObject *nameobj, struct frozen_info *info)
static PyObject *
unmarshal_frozen_code(PyInterpreterState *interp, struct frozen_info *info)
{
if (info->get_code && _Py_IsMainInterpreter(interp)) {
PyObject *code = info->get_code();
assert(code != NULL);
return code;
}
PyObject *co = PyMarshal_ReadObjectFromString(info->data, info->size);
if (co == NULL) {
/* Does not contain executable code. */
Expand Down Expand Up @@ -3567,7 +3556,7 @@ _imp_get_frozen_object_impl(PyObject *module, PyObject *name,
if (info.nameobj == NULL) {
info.nameobj = name;
}
if (info.size == 0 && info.get_code == NULL) {
if (info.size == 0) {
/* Does not contain executable code. */
set_frozen_error(FROZEN_INVALID, name);
return NULL;
Expand Down
6 changes: 0 additions & 6 deletions 6 Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -829,11 +829,6 @@ pycore_interp_init(PyThreadState *tstate)
if (_PyStatus_EXCEPTION(status)) {
return status;
}
// Intern strings in deep-frozen modules first so that others
// can use it instead of creating a heap allocated string.
if (_Py_Deepfreeze_Init() < 0) {
return _PyStatus_ERR("failed to initialize deep-frozen modules");
}

status = pycore_init_types(interp);
if (_PyStatus_EXCEPTION(status)) {
Expand Down Expand Up @@ -1740,7 +1735,6 @@ finalize_interp_clear(PyThreadState *tstate)
_Py_HashRandomization_Fini();
_PyArg_Fini();
_Py_ClearFileSystemEncoding();
_Py_Deepfreeze_Fini();
_PyPerfTrampoline_Fini();
}

Expand Down
1 change: 1 addition & 0 deletions 1 Python/pystate.c
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,7 @@ init_interpreter(PyInterpreterState *interp,
interp->optimizer = &_PyOptimizer_Default;
interp->optimizer_backedge_threshold = _PyOptimizer_Default.backedge_threshold;
interp->optimizer_resume_threshold = _PyOptimizer_Default.backedge_threshold;
interp->next_func_version = 1;
if (interp != &runtime->_main_interpreter) {
/* Fix the self-referential, statically initialized fields. */
interp->dtoa = (struct _dtoa_state)_dtoa_state_INIT(interp);
Expand Down
Loading
Morty Proxy This is a proxified and sanitized view of the page, visit original site.