Skip to content

Commit fbfecb1

Browse files
committed
Reduce rc ops from best_base
1 parent aa0353a commit fbfecb1

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

vm/src/builtins/type.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ impl PyType {
720720

721721
let base = best_base(&bases, vm)?;
722722

723-
(metatype, base, bases)
723+
(metatype, base.to_owned(), bases)
724724
};
725725

726726
let mut attributes = dict.to_attributes(vm);
@@ -1324,24 +1324,24 @@ fn calculate_meta_class(
13241324
Ok(winner)
13251325
}
13261326

1327-
fn solid_base(typ: &PyTypeRef, vm: &VirtualMachine) -> PyTypeRef {
1327+
fn solid_base<'a>(typ: &'a Py<PyType>, vm: &VirtualMachine) -> &'a Py<PyType> {
13281328
let base = if let Some(base) = &typ.base {
13291329
solid_base(base, vm)
13301330
} else {
1331-
vm.ctx.types.object_type.to_owned()
1331+
vm.ctx.types.object_type
13321332
};
13331333

1334-
// TODO: itemsize comparation also needed
1334+
// TODO: requires itemsize comparison too
13351335
if typ.basicsize() != base.basicsize() {
1336-
typ.clone()
1336+
typ
13371337
} else {
13381338
base
13391339
}
13401340
}
13411341

1342-
fn best_base(bases: &[PyTypeRef], vm: &VirtualMachine) -> PyResult<PyTypeRef> {
1343-
let mut base: Option<PyTypeRef> = None;
1344-
let mut winner: Option<PyTypeRef> = None;
1342+
fn best_base<'a>(bases: &'a [PyTypeRef], vm: &VirtualMachine) -> PyResult<&'a Py<PyType>> {
1343+
let mut base: Option<&Py<PyType>> = None;
1344+
let mut winner: Option<&Py<PyType>> = None;
13451345

13461346
for base_i in bases {
13471347
// if !base_i.fast_issubclass(vm.ctx.types.type_type) {
@@ -1358,13 +1358,13 @@ fn best_base(bases: &[PyTypeRef], vm: &VirtualMachine) -> PyResult<PyTypeRef> {
13581358

13591359
let candidate = solid_base(base_i, vm);
13601360
if winner.is_none() {
1361-
winner = Some(candidate.clone());
1362-
base = Some(base_i.clone());
1363-
} else if winner.as_ref().unwrap().fast_issubclass(&candidate) {
1361+
winner = Some(candidate);
1362+
base = Some(base_i.deref());
1363+
} else if winner.unwrap().fast_issubclass(candidate) {
13641364
// Do nothing
1365-
} else if candidate.fast_issubclass(winner.as_ref().unwrap()) {
1366-
winner = Some(candidate.clone());
1367-
base = Some(base_i.clone());
1365+
} else if candidate.fast_issubclass(winner.unwrap()) {
1366+
winner = Some(candidate);
1367+
base = Some(base_i.deref());
13681368
} else {
13691369
return Err(
13701370
vm.new_type_error("multiple bases have instance layout conflict".to_string())

0 commit comments

Comments
 (0)