diff --git a/crates/derive-impl/src/pyclass.rs b/crates/derive-impl/src/pyclass.rs index f88fa059817..dfb02a3eda8 100644 --- a/crates/derive-impl/src/pyclass.rs +++ b/crates/derive-impl/src/pyclass.rs @@ -181,7 +181,7 @@ pub(crate) fn impl_pyclass_impl(attr: PunctuatedNestedMeta, item: Item) -> Resul }, parse_quote! { fn __extend_py_class( - ctx: &::rustpython_vm::Context, + ctx: &'static ::rustpython_vm::Context, class: &'static ::rustpython_vm::Py<::rustpython_vm::builtins::PyType>, ) { #getset_impl @@ -222,7 +222,7 @@ pub(crate) fn impl_pyclass_impl(attr: PunctuatedNestedMeta, item: Item) -> Resul const TP_FLAGS: ::rustpython_vm::types::PyTypeFlags = #flags; fn impl_extend_class( - ctx: &::rustpython_vm::Context, + ctx: &'static ::rustpython_vm::Context, class: &'static ::rustpython_vm::Py<::rustpython_vm::builtins::PyType>, ) { #impl_ty::__extend_py_class(ctx, class); @@ -284,7 +284,7 @@ pub(crate) fn impl_pyclass_impl(attr: PunctuatedNestedMeta, item: Item) -> Resul }, parse_quote! { fn __extend_py_class( - ctx: &::rustpython_vm::Context, + ctx: &'static ::rustpython_vm::Context, class: &'static ::rustpython_vm::Py<::rustpython_vm::builtins::PyType>, ) { #getset_impl diff --git a/crates/vm/src/builtins/asyncgenerator.rs b/crates/vm/src/builtins/asyncgenerator.rs index f5b85410eef..6b7cfea9c29 100644 --- a/crates/vm/src/builtins/asyncgenerator.rs +++ b/crates/vm/src/builtins/asyncgenerator.rs @@ -810,7 +810,7 @@ impl Drop for PyAsyncGen { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyAsyncGen::extend_class(ctx, ctx.types.async_generator); PyAsyncGenASend::extend_class(ctx, ctx.types.async_generator_asend); PyAsyncGenAThrow::extend_class(ctx, ctx.types.async_generator_athrow); diff --git a/crates/vm/src/builtins/bool.rs b/crates/vm/src/builtins/bool.rs index dff2e642b93..db37eee6ed1 100644 --- a/crates/vm/src/builtins/bool.rs +++ b/crates/vm/src/builtins/bool.rs @@ -182,7 +182,7 @@ impl Representable for PyBool { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyBool::extend_class(context, context.types.bool_type); } diff --git a/crates/vm/src/builtins/builtin_func.rs b/crates/vm/src/builtins/builtin_func.rs index 0dff221f166..f0f6bfee729 100644 --- a/crates/vm/src/builtins/builtin_func.rs +++ b/crates/vm/src/builtins/builtin_func.rs @@ -224,7 +224,7 @@ impl fmt::Debug for PyNativeMethod { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyNativeFunction::extend_class(context, context.types.builtin_function_or_method_type); } diff --git a/crates/vm/src/builtins/bytearray.rs b/crates/vm/src/builtins/bytearray.rs index 83143070e07..82a283ec429 100644 --- a/crates/vm/src/builtins/bytearray.rs +++ b/crates/vm/src/builtins/bytearray.rs @@ -67,7 +67,7 @@ impl PyPayload for PyByteArray { } /// Fill bytearray class methods dictionary. -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyByteArray::extend_class(context, context.types.bytearray_type); PyByteArrayIterator::extend_class(context, context.types.bytearray_iterator_type); } diff --git a/crates/vm/src/builtins/bytes.rs b/crates/vm/src/builtins/bytes.rs index 623885ec0fe..9e5d7d0ae51 100644 --- a/crates/vm/src/builtins/bytes.rs +++ b/crates/vm/src/builtins/bytes.rs @@ -86,7 +86,7 @@ impl PyPayload for PyBytes { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyBytes::extend_class(context, context.types.bytes_type); PyBytesIterator::extend_class(context, context.types.bytes_iterator_type); } diff --git a/crates/vm/src/builtins/capsule.rs b/crates/vm/src/builtins/capsule.rs index 7e263c4cde2..c9c7fd2849d 100644 --- a/crates/vm/src/builtins/capsule.rs +++ b/crates/vm/src/builtins/capsule.rs @@ -28,6 +28,6 @@ impl Representable for PyCapsule { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyCapsule::extend_class(context, context.types.capsule_type); } diff --git a/crates/vm/src/builtins/classmethod.rs b/crates/vm/src/builtins/classmethod.rs index 22df6f27475..3ec1085abc4 100644 --- a/crates/vm/src/builtins/classmethod.rs +++ b/crates/vm/src/builtins/classmethod.rs @@ -227,6 +227,6 @@ impl Representable for PyClassMethod { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyClassMethod::extend_class(context, context.types.classmethod_type); } diff --git a/crates/vm/src/builtins/code.rs b/crates/vm/src/builtins/code.rs index 126d0216546..3a9ccc35637 100644 --- a/crates/vm/src/builtins/code.rs +++ b/crates/vm/src/builtins/code.rs @@ -1275,6 +1275,6 @@ impl<'a> LineTableReader<'a> { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyCode::extend_class(ctx, ctx.types.code_type); } diff --git a/crates/vm/src/builtins/complex.rs b/crates/vm/src/builtins/complex.rs index ab656c974ee..84fd0c806c4 100644 --- a/crates/vm/src/builtins/complex.rs +++ b/crates/vm/src/builtins/complex.rs @@ -89,7 +89,7 @@ impl PyObjectRef { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyComplex::extend_class(context, context.types.complex_type); } diff --git a/crates/vm/src/builtins/coroutine.rs b/crates/vm/src/builtins/coroutine.rs index c8547b8a41f..5b29570b2f8 100644 --- a/crates/vm/src/builtins/coroutine.rs +++ b/crates/vm/src/builtins/coroutine.rs @@ -247,7 +247,7 @@ impl Drop for PyCoroutine { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyCoroutine::extend_class(ctx, ctx.types.coroutine_type); PyCoroutineWrapper::extend_class(ctx, ctx.types.coroutine_wrapper_type); } diff --git a/crates/vm/src/builtins/descriptor.rs b/crates/vm/src/builtins/descriptor.rs index e1b92746a0f..a7a3e89e42a 100644 --- a/crates/vm/src/builtins/descriptor.rs +++ b/crates/vm/src/builtins/descriptor.rs @@ -426,7 +426,7 @@ impl GetDescriptor for PyMemberDescriptor { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyMemberDescriptor::extend_class(ctx, ctx.types.member_descriptor_type); PyMethodDescriptor::extend_class(ctx, ctx.types.method_descriptor_type); PyWrapper::extend_class(ctx, ctx.types.wrapper_descriptor_type); diff --git a/crates/vm/src/builtins/dict.rs b/crates/vm/src/builtins/dict.rs index fa8f45e0505..0fc615e442e 100644 --- a/crates/vm/src/builtins/dict.rs +++ b/crates/vm/src/builtins/dict.rs @@ -1362,7 +1362,7 @@ fn set_inner_number_or(a: &PyObject, b: &PyObject, vm: &VirtualMachine) -> PyRes set_inner_number_op(a, b, |a, b| a.union(b, vm), vm) } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyDict::extend_class(context, context.types.dict_type); PyDictKeys::extend_class(context, context.types.dict_keys_type); PyDictKeyIterator::extend_class(context, context.types.dict_keyiterator_type); diff --git a/crates/vm/src/builtins/enumerate.rs b/crates/vm/src/builtins/enumerate.rs index 3cd8f4e734a..3cca47ce2d3 100644 --- a/crates/vm/src/builtins/enumerate.rs +++ b/crates/vm/src/builtins/enumerate.rs @@ -144,7 +144,7 @@ impl IterNext for PyReverseSequenceIterator { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyEnumerate::extend_class(context, context.types.enumerate_type); PyReverseSequenceIterator::extend_class(context, context.types.reverse_iter_type); } diff --git a/crates/vm/src/builtins/filter.rs b/crates/vm/src/builtins/filter.rs index 388fb8bb603..56d951f8a79 100644 --- a/crates/vm/src/builtins/filter.rs +++ b/crates/vm/src/builtins/filter.rs @@ -71,6 +71,6 @@ impl IterNext for PyFilter { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyFilter::extend_class(context, context.types.filter_type); } diff --git a/crates/vm/src/builtins/float.rs b/crates/vm/src/builtins/float.rs index 23d04d36998..7ff47328d34 100644 --- a/crates/vm/src/builtins/float.rs +++ b/crates/vm/src/builtins/float.rs @@ -480,6 +480,6 @@ pub(crate) fn get_value(obj: &PyObject) -> f64 { } #[rustfmt::skip] // to avoid line splitting -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyFloat::extend_class(context, context.types.float_type); } diff --git a/crates/vm/src/builtins/frame.rs b/crates/vm/src/builtins/frame.rs index 6f906e531d5..b3a90690eac 100644 --- a/crates/vm/src/builtins/frame.rs +++ b/crates/vm/src/builtins/frame.rs @@ -423,7 +423,7 @@ pub(crate) mod stack_analysis { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { Frame::extend_class(context, context.types.frame_type); } diff --git a/crates/vm/src/builtins/function.rs b/crates/vm/src/builtins/function.rs index 328628befe6..e0b7116553a 100644 --- a/crates/vm/src/builtins/function.rs +++ b/crates/vm/src/builtins/function.rs @@ -1219,7 +1219,7 @@ impl PyCell { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyFunction::extend_class(context, context.types.function_type); PyBoundMethod::extend_class(context, context.types.bound_method_type); PyCell::extend_class(context, context.types.cell_type); diff --git a/crates/vm/src/builtins/generator.rs b/crates/vm/src/builtins/generator.rs index cdbb2af440a..fd822e9fbfe 100644 --- a/crates/vm/src/builtins/generator.rs +++ b/crates/vm/src/builtins/generator.rs @@ -173,6 +173,6 @@ impl Drop for PyGenerator { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyGenerator::extend_class(ctx, ctx.types.generator_type); } diff --git a/crates/vm/src/builtins/genericalias.rs b/crates/vm/src/builtins/genericalias.rs index 678fca606ff..96da93dd8ef 100644 --- a/crates/vm/src/builtins/genericalias.rs +++ b/crates/vm/src/builtins/genericalias.rs @@ -739,7 +739,7 @@ pub fn subscript_generic(type_params: PyObjectRef, vm: &VirtualMachine) -> PyRes generic_alias_class.call((generic_type, args.to_pyobject(vm)), vm) } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyGenericAlias::extend_class(context, context.types.generic_alias_type); PyGenericAliasIterator::extend_class(context, context.types.generic_alias_iterator_type); } diff --git a/crates/vm/src/builtins/getset.rs b/crates/vm/src/builtins/getset.rs index 86f0524b12c..ff132fb7471 100644 --- a/crates/vm/src/builtins/getset.rs +++ b/crates/vm/src/builtins/getset.rs @@ -157,6 +157,6 @@ impl Representable for PyGetSet { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyGetSet::extend_class(context, context.types.getset_type); } diff --git a/crates/vm/src/builtins/int.rs b/crates/vm/src/builtins/int.rs index 788f450dfe6..d2d462b8f30 100644 --- a/crates/vm/src/builtins/int.rs +++ b/crates/vm/src/builtins/int.rs @@ -744,6 +744,6 @@ pub fn try_to_float(int: &BigInt, vm: &VirtualMachine) -> PyResult { .ok_or_else(|| vm.new_overflow_error("int too large to convert to float")) } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyInt::extend_class(context, context.types.int_type); } diff --git a/crates/vm/src/builtins/interpolation.rs b/crates/vm/src/builtins/interpolation.rs index 18fd10ba022..b429fb5b91c 100644 --- a/crates/vm/src/builtins/interpolation.rs +++ b/crates/vm/src/builtins/interpolation.rs @@ -224,6 +224,6 @@ impl Representable for PyInterpolation { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyInterpolation::extend_class(context, context.types.interpolation_type); } diff --git a/crates/vm/src/builtins/iter.rs b/crates/vm/src/builtins/iter.rs index b96fb68559a..f33b0e9bbbb 100644 --- a/crates/vm/src/builtins/iter.rs +++ b/crates/vm/src/builtins/iter.rs @@ -289,7 +289,7 @@ impl IterNext for PyCallableIterator { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PySequenceIterator::extend_class(context, context.types.iter_type); PyCallableIterator::extend_class(context, context.types.callable_iterator); } diff --git a/crates/vm/src/builtins/list.rs b/crates/vm/src/builtins/list.rs index 775a0d0c459..aa25af58e9b 100644 --- a/crates/vm/src/builtins/list.rs +++ b/crates/vm/src/builtins/list.rs @@ -696,7 +696,7 @@ impl IterNext for PyListReverseIterator { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { let list_type = &context.types.list_type; PyList::extend_class(context, list_type); diff --git a/crates/vm/src/builtins/map.rs b/crates/vm/src/builtins/map.rs index f83030824f1..d9a0e83b746 100644 --- a/crates/vm/src/builtins/map.rs +++ b/crates/vm/src/builtins/map.rs @@ -70,6 +70,6 @@ impl IterNext for PyMap { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyMap::extend_class(context, context.types.map_type); } diff --git a/crates/vm/src/builtins/mappingproxy.rs b/crates/vm/src/builtins/mappingproxy.rs index 7c852af081f..df9c61e0a58 100644 --- a/crates/vm/src/builtins/mappingproxy.rs +++ b/crates/vm/src/builtins/mappingproxy.rs @@ -293,6 +293,6 @@ impl Representable for PyMappingProxy { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyMappingProxy::extend_class(context, context.types.mappingproxy_type) } diff --git a/crates/vm/src/builtins/memory.rs b/crates/vm/src/builtins/memory.rs index f29753c1f84..a3403287dae 100644 --- a/crates/vm/src/builtins/memory.rs +++ b/crates/vm/src/builtins/memory.rs @@ -1127,7 +1127,7 @@ impl Representable for PyMemoryView { } } -pub(crate) fn init(ctx: &Context) { +pub(crate) fn init(ctx: &'static Context) { PyMemoryView::extend_class(ctx, ctx.types.memoryview_type); PyMemoryViewIterator::extend_class(ctx, ctx.types.memoryviewiterator_type); } diff --git a/crates/vm/src/builtins/module.rs b/crates/vm/src/builtins/module.rs index ad90970e7b9..0dc2b571eae 100644 --- a/crates/vm/src/builtins/module.rs +++ b/crates/vm/src/builtins/module.rs @@ -452,7 +452,7 @@ impl Representable for PyModule { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyModule::extend_class(context, context.types.module_type); } diff --git a/crates/vm/src/builtins/namespace.rs b/crates/vm/src/builtins/namespace.rs index 191fbd804b6..a32dda14586 100644 --- a/crates/vm/src/builtins/namespace.rs +++ b/crates/vm/src/builtins/namespace.rs @@ -175,6 +175,6 @@ impl Representable for PyNamespace { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyNamespace::extend_class(context, context.types.namespace_type); } diff --git a/crates/vm/src/builtins/object.rs b/crates/vm/src/builtins/object.rs index 10b500619eb..b6c7b263d77 100644 --- a/crates/vm/src/builtins/object.rs +++ b/crates/vm/src/builtins/object.rs @@ -560,7 +560,7 @@ pub fn object_set_dict(obj: PyObjectRef, dict: PyDictRef, vm: &VirtualMachine) - .map_err(|_| vm.new_attribute_error("This object has no __dict__")) } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { // Manually set init slot - derive macro doesn't generate extend_slots // for trait impl that overrides #[pyslot] method ctx.types diff --git a/crates/vm/src/builtins/property.rs b/crates/vm/src/builtins/property.rs index 8cc9ba92e92..6c53c4b4d98 100644 --- a/crates/vm/src/builtins/property.rs +++ b/crates/vm/src/builtins/property.rs @@ -395,7 +395,7 @@ impl Initializer for PyProperty { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyProperty::extend_class(context, context.types.property_type); // This is a bit unfortunate, but this instance attribute overlaps with the diff --git a/crates/vm/src/builtins/range.rs b/crates/vm/src/builtins/range.rs index 4b563de81f4..0d0b5ccdd5d 100644 --- a/crates/vm/src/builtins/range.rs +++ b/crates/vm/src/builtins/range.rs @@ -167,7 +167,7 @@ impl PyRange { // obj.downcast_ref::().unwrap().clone() // } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyRange::extend_class(context, context.types.range_type); PyLongRangeIterator::extend_class(context, context.types.long_range_iterator_type); PyRangeIterator::extend_class(context, context.types.range_iterator_type); diff --git a/crates/vm/src/builtins/set.rs b/crates/vm/src/builtins/set.rs index 11f952df78d..2b1e9c82e60 100644 --- a/crates/vm/src/builtins/set.rs +++ b/crates/vm/src/builtins/set.rs @@ -1421,7 +1421,7 @@ impl IterNext for PySetIterator { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PySet::extend_class(context, context.types.set_type); PyFrozenSet::extend_class(context, context.types.frozenset_type); PySetIterator::extend_class(context, context.types.set_iterator_type); diff --git a/crates/vm/src/builtins/singletons.rs b/crates/vm/src/builtins/singletons.rs index 169104efeb3..7102e8ebfa3 100644 --- a/crates/vm/src/builtins/singletons.rs +++ b/crates/vm/src/builtins/singletons.rs @@ -132,7 +132,7 @@ impl Representable for PyNotImplemented { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyNone::extend_class(context, context.types.none_type); PyNotImplemented::extend_class(context, context.types.not_implemented_type); } diff --git a/crates/vm/src/builtins/slice.rs b/crates/vm/src/builtins/slice.rs index 24c87aa1c11..4b3bec0530d 100644 --- a/crates/vm/src/builtins/slice.rs +++ b/crates/vm/src/builtins/slice.rs @@ -354,7 +354,7 @@ impl Representable for PyEllipsis { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PySlice::extend_class(ctx, ctx.types.slice_type); PyEllipsis::extend_class(ctx, ctx.types.ellipsis_type); } diff --git a/crates/vm/src/builtins/staticmethod.rs b/crates/vm/src/builtins/staticmethod.rs index fe0cc0a14e2..a06267650a2 100644 --- a/crates/vm/src/builtins/staticmethod.rs +++ b/crates/vm/src/builtins/staticmethod.rs @@ -197,6 +197,6 @@ impl Representable for PyStaticMethod { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyStaticMethod::extend_class(context, context.types.staticmethod_type); } diff --git a/crates/vm/src/builtins/str.rs b/crates/vm/src/builtins/str.rs index a9e8484dfcc..38102c18865 100644 --- a/crates/vm/src/builtins/str.rs +++ b/crates/vm/src/builtins/str.rs @@ -1761,7 +1761,7 @@ struct ReplaceArgs { count: isize, } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyStr::extend_class(ctx, ctx.types.str_type); PyStrIterator::extend_class(ctx, ctx.types.str_iterator_type); diff --git a/crates/vm/src/builtins/super.rs b/crates/vm/src/builtins/super.rs index 3d1ec715e48..4fb81b6e591 100644 --- a/crates/vm/src/builtins/super.rs +++ b/crates/vm/src/builtins/super.rs @@ -269,7 +269,7 @@ fn super_check(ty: PyTypeRef, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult ))) } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { let super_type = &context.types.super_type; PySuper::extend_class(context, super_type); diff --git a/crates/vm/src/builtins/template.rs b/crates/vm/src/builtins/template.rs index e9dd1e7adfb..3f03f9a227a 100644 --- a/crates/vm/src/builtins/template.rs +++ b/crates/vm/src/builtins/template.rs @@ -329,7 +329,7 @@ impl IterNext for PyTemplateIter { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyTemplate::extend_class(context, context.types.template_type); PyTemplateIter::extend_class(context, context.types.template_iter_type); } diff --git a/crates/vm/src/builtins/traceback.rs b/crates/vm/src/builtins/traceback.rs index 66d999b26b4..975e81bb7f4 100644 --- a/crates/vm/src/builtins/traceback.rs +++ b/crates/vm/src/builtins/traceback.rs @@ -119,7 +119,7 @@ impl PyTracebackRef { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyTraceback::extend_class(context, context.types.traceback_type); } diff --git a/crates/vm/src/builtins/tuple.rs b/crates/vm/src/builtins/tuple.rs index e0f88f08d22..046506f6f4d 100644 --- a/crates/vm/src/builtins/tuple.rs +++ b/crates/vm/src/builtins/tuple.rs @@ -583,7 +583,7 @@ impl IterNext for PyTupleIterator { } } -pub(crate) fn init(context: &Context) { +pub(crate) fn init(context: &'static Context) { PyTuple::extend_class(context, context.types.tuple_type); PyTupleIterator::extend_class(context, context.types.tuple_iterator_type); } diff --git a/crates/vm/src/builtins/type.rs b/crates/vm/src/builtins/type.rs index b3a3c206c68..d43bbd8fc3b 100644 --- a/crates/vm/src/builtins/type.rs +++ b/crates/vm/src/builtins/type.rs @@ -2103,7 +2103,7 @@ fn subtype_set_dict(obj: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) - * The magical type type */ -pub(crate) fn init(ctx: &Context) { +pub(crate) fn init(ctx: &'static Context) { PyType::extend_class(ctx, ctx.types.type_type); } diff --git a/crates/vm/src/builtins/union.rs b/crates/vm/src/builtins/union.rs index 03939422c0c..830465e49f5 100644 --- a/crates/vm/src/builtins/union.rs +++ b/crates/vm/src/builtins/union.rs @@ -540,7 +540,7 @@ impl Representable for PyUnion { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { let union_type = &context.types.union_type; PyUnion::extend_class(context, union_type); } diff --git a/crates/vm/src/builtins/weakproxy.rs b/crates/vm/src/builtins/weakproxy.rs index a03eb1fe7e7..2af620da7df 100644 --- a/crates/vm/src/builtins/weakproxy.rs +++ b/crates/vm/src/builtins/weakproxy.rs @@ -238,7 +238,7 @@ impl Representable for PyWeakProxy { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyWeakProxy::extend_class(context, context.types.weakproxy_type); } diff --git a/crates/vm/src/builtins/weakref.rs b/crates/vm/src/builtins/weakref.rs index 19f3f44f071..d3087eedb9e 100644 --- a/crates/vm/src/builtins/weakref.rs +++ b/crates/vm/src/builtins/weakref.rs @@ -153,6 +153,6 @@ impl Representable for PyWeak { } } -pub fn init(context: &Context) { +pub fn init(context: &'static Context) { PyWeak::extend_class(context, context.types.weakref_type); } diff --git a/crates/vm/src/builtins/zip.rs b/crates/vm/src/builtins/zip.rs index ee3ecb57b27..19c036e7951 100644 --- a/crates/vm/src/builtins/zip.rs +++ b/crates/vm/src/builtins/zip.rs @@ -113,6 +113,6 @@ impl IterNext for PyZip { } } -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { PyZip::extend_class(ctx, ctx.types.zip_type); } diff --git a/crates/vm/src/class.rs b/crates/vm/src/class.rs index 3075b59f0bb..2dc3060736f 100644 --- a/crates/vm/src/class.rs +++ b/crates/vm/src/class.rs @@ -131,7 +131,7 @@ pub trait PyClassDef { pub trait PyClassImpl: PyClassDef { const TP_FLAGS: PyTypeFlags = PyTypeFlags::DEFAULT; - fn extend_class(ctx: &Context, class: &'static Py) + fn extend_class(ctx: &'static Context, class: &'static Py) where Self: Sized, { @@ -188,11 +188,9 @@ pub trait PyClassImpl: PyClassDef { && object_new.is_some_and(|obj_new| slot_new as usize == obj_new as usize); if !is_inherited_from_object { - let bound_new = Context::genesis().slot_new_wrapper.build_bound_method( - ctx, - class.to_owned().into(), - class, - ); + let bound_new = + ctx.slot_new_wrapper + .build_bound_method(ctx, class.to_owned().into(), class); class.set_attr(identifier!(ctx, __new__), bound_new.into()); } } @@ -214,6 +212,9 @@ pub trait PyClassImpl: PyClassDef { { (*Self::static_cell().get_or_init(|| { let typ = Self::create_static_type(); + // SAFETY: Context is heap-allocated via PyRc and stored in a static cell + // (Context::genesis), so it lives for 'static. + let ctx: &'static Context = unsafe { &*(ctx as *const Context) }; Self::extend_class(ctx, unsafe { // typ will be saved in static_cell let r: &Py = &typ; @@ -225,7 +226,7 @@ pub trait PyClassImpl: PyClassDef { .to_owned() } - fn impl_extend_class(ctx: &Context, class: &'static Py); + fn impl_extend_class(ctx: &'static Context, class: &'static Py); const METHOD_DEFS: &'static [PyMethodDef]; fn extend_slots(slots: &mut PyTypeSlots); diff --git a/crates/vm/src/exceptions.rs b/crates/vm/src/exceptions.rs index 680a914889b..b72b89b4768 100644 --- a/crates/vm/src/exceptions.rs +++ b/crates/vm/src/exceptions.rs @@ -943,7 +943,7 @@ impl ExceptionZoo { clippy::redundant_clone, reason = "temporary workaround until errno/winerror handling is fixed" )] - pub fn extend(ctx: &Context) { + pub fn extend(ctx: &'static Context) { use self::types::*; let excs = &ctx.exceptions; diff --git a/crates/vm/src/stdlib/typing.rs b/crates/vm/src/stdlib/typing.rs index 2a1ed8e91a2..79064346e27 100644 --- a/crates/vm/src/stdlib/typing.rs +++ b/crates/vm/src/stdlib/typing.rs @@ -12,7 +12,7 @@ pub(crate) use decl::module_def; pub use decl::*; /// Initialize typing types (call extend_class) -pub fn init(ctx: &Context) { +pub fn init(ctx: &'static Context) { NoDefault::extend_class(ctx, ctx.types.typing_no_default_type); } diff --git a/crates/vm/src/types/zoo.rs b/crates/vm/src/types/zoo.rs index 07754d08340..a9999211680 100644 --- a/crates/vm/src/types/zoo.rs +++ b/crates/vm/src/types/zoo.rs @@ -216,7 +216,7 @@ impl TypeZoo { /// Fill attributes of builtin types. #[cold] - pub(crate) fn extend(context: &Context) { + pub(crate) fn extend(context: &'static Context) { // object must be initialized before type to set object.slots.init, // which type will inherit via inherit_slots() object::init(context); diff --git a/crates/vm/src/vm/context.rs b/crates/vm/src/vm/context.rs index 41d47ccfe0a..d864548ff08 100644 --- a/crates/vm/src/vm/context.rs +++ b/crates/vm/src/vm/context.rs @@ -285,7 +285,15 @@ impl Context { rustpython_common::static_cell! { static CONTEXT: PyRc; } - CONTEXT.get_or_init(|| PyRc::new(Self::init_genesis())) + CONTEXT.get_or_init(|| { + let ctx = PyRc::new(Self::init_genesis()); + // SAFETY: ctx is heap-allocated via PyRc and will be stored in + // the CONTEXT static cell, so the Context lives for 'static. + let ctx_ref: &'static Context = unsafe { &*PyRc::as_ptr(&ctx) }; + crate::types::TypeZoo::extend(ctx_ref); + crate::exceptions::ExceptionZoo::extend(ctx_ref); + ctx + }) } fn init_genesis() -> Self { diff --git a/crates/vm/src/vm/interpreter.rs b/crates/vm/src/vm/interpreter.rs index 2a664e39f9c..8e275d1ce9e 100644 --- a/crates/vm/src/vm/interpreter.rs +++ b/crates/vm/src/vm/interpreter.rs @@ -52,9 +52,6 @@ where let paths = getpath::init_path_config(&settings); let config = PyConfig::new(settings, paths); - crate::types::TypeZoo::extend(&ctx); - crate::exceptions::ExceptionZoo::extend(&ctx); - // Build module_defs map from builtin modules + additional modules let mut all_module_defs: BTreeMap<&'static str, &'static builtins::PyModuleDef> = crate::stdlib::builtin_module_defs(&ctx)