@@ -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
13341334 // TODO: itemsize comparation also needed
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