MCPcopy Index your code
hub / github.com/RustPython/RustPython / best_base

Function best_base

crates/vm/src/builtins/type.rs:2887–2920  ·  view source on GitHub ↗
(bases: &'a [PyTypeRef], vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

2885}
2886
2887fn best_base<'a>(bases: &'a [PyTypeRef], vm: &VirtualMachine) -> PyResult<&'a Py<PyType>> {
2888 let mut base: Option<&Py<PyType>> = None;
2889 let mut winner: Option<&Py<PyType>> = None;
2890
2891 for base_i in bases {
2892 // if !base_i.fast_issubclass(vm.ctx.types.type_type) {
2893 // println!("base_i type : {}", base_i.name());
2894 // return Err(vm.new_type_error("best must be types".into()));
2895 // }
2896
2897 if !base_i.slots.flags.has_feature(PyTypeFlags::BASETYPE) {
2898 return Err(vm.new_type_error(format!(
2899 "type '{}' is not an acceptable base type",
2900 base_i.slot_name()
2901 )));
2902 }
2903
2904 let candidate = solid_base(base_i, vm);
2905 if winner.is_none() {
2906 winner = Some(candidate);
2907 base = Some(base_i.deref());
2908 } else if winner.unwrap().fast_issubclass(candidate) {
2909 // Do nothing
2910 } else if candidate.fast_issubclass(winner.unwrap()) {
2911 winner = Some(candidate);
2912 base = Some(base_i.deref());
2913 } else {
2914 return Err(vm.new_type_error("multiple bases have instance layout conflict"));
2915 }
2916 }
2917
2918 debug_assert!(base.is_some());
2919 Ok(base.unwrap())
2920}
2921
2922/// Apply Python name mangling for private attributes.
2923/// `__x` becomes `_ClassName__x` if inside a class.

Callers 1

slot_newMethod · 0.85

Calls 8

solid_baseFunction · 0.85
has_featureMethod · 0.80
fast_issubclassMethod · 0.80
ErrClass · 0.50
SomeClass · 0.50
is_noneMethod · 0.45
derefMethod · 0.45
unwrapMethod · 0.45

Tested by

no test coverage detected