Skip to content

Commit 6ea5d58

Browse files
committed
Fix previous merge of objtype.rs.
Moved the tests to their more correct place of `tests/snippets/class.py`.
1 parent 23e0467 commit 6ea5d58

File tree

3 files changed

+50
-52
lines changed

3 files changed

+50
-52
lines changed

tests/snippets/class.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,49 @@ class B:
207207
# assert a == 3
208208
# A.b()
209209
# nested_scope()
210+
211+
212+
213+
# Multiple inheritance and mro tests.
214+
class A():
215+
def f(self):
216+
return 'a'
217+
218+
class B(A):
219+
def f(self):
220+
return 'b' + super().f()
221+
222+
class C(A):
223+
def f(self):
224+
return 'c' + super().f()
225+
226+
class D(B, C):
227+
def f(self):
228+
return 'd' + super().f()
229+
230+
assert D().f() == 'dbca', "Mro resolution using super failed."
231+
232+
233+
234+
class A():
235+
pass
236+
try:
237+
class B(A, A):
238+
pass
239+
except TypeError:
240+
pass
241+
else:
242+
assert False, "Managed to create a class with duplicate base classes."
243+
244+
245+
class A():
246+
pass
247+
class B(A):
248+
pass
249+
try:
250+
class C(A, B):
251+
pass
252+
except TypeError:
253+
pass
254+
else:
255+
assert False, "Managed to create a class without local type precedence."

tests/snippets/types_snippet.py

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -99,47 +99,3 @@ class C(B, BB):
9999

100100
assert type(Exception.args).__name__ == 'getset_descriptor'
101101
assert type(None).__bool__(None) is False
102-
103-
104-
class A():
105-
def f(self):
106-
return 'a'
107-
108-
class B(A):
109-
def f(self):
110-
return 'b' + super().f()
111-
112-
class C(A):
113-
def f(self):
114-
return 'c' + super().f()
115-
116-
class D(B, C):
117-
def f(self):
118-
return 'd' + super().f()
119-
120-
assert D().f() == 'dbca', "Mro resolution using super failed."
121-
122-
123-
124-
class A():
125-
pass
126-
try:
127-
class B(A, A):
128-
pass
129-
except TypeError:
130-
pass
131-
else:
132-
assert False, "Managed to create a class with duplicate base classes."
133-
134-
135-
class A():
136-
pass
137-
class B(A):
138-
pass
139-
try:
140-
class C(A, B):
141-
pass
142-
except TypeError:
143-
pass
144-
else:
145-
assert False, "Managed to create a class without local type precedence."

vm/src/obj/objtype.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -291,16 +291,14 @@ impl PyClassRef {
291291
}
292292
}
293293

294-
let typ = match new(metatype, name.as_str(), base.clone(), bases, attributes) {
294+
match new(metatype, name.as_str(), base.clone(), bases, attributes) {
295295
Ok(typ) => {
296296
typ.slots.borrow_mut().flags = base.slots.borrow().flags;
297+
vm.ctx.add_tp_new_wrapper(&typ);
297298
Ok(typ.into())
298299
}
299300
Err(string) => Err(vm.new_type_error(string)),
300-
}?;
301-
typ.slots.borrow_mut().flags = base.slots.borrow().flags;
302-
vm.ctx.add_tp_new_wrapper(&typ);
303-
Ok(typ.into())
301+
}
304302
}
305303

306304
#[pyslot]
@@ -437,9 +435,7 @@ impl PyClassRef {
437435
}
438436
}
439437

440-
fn take_next_base(mut bases: Vec<Vec<PyClassRef>>) -> Option<(PyClassRef, Vec<Vec<PyClassRef>>)> {
441-
let mut next = None;
442-
438+
fn take_next_base(mut bases: Vec<Vec<PyClassRef>>) -> (Option<PyClassRef>, Vec<Vec<PyClassRef>>) {
443439
bases = bases.into_iter().filter(|x| !x.is_empty()).collect();
444440

445441
for base in &bases {

0 commit comments

Comments
 (0)