(bases: &'a [PyTypeRef], vm: &VirtualMachine)
| 2885 | } |
| 2886 | |
| 2887 | fn 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. |
no test coverage detected