Skip to content

Commit 098141b

Browse files
committed
Fix ABC instance checks when __class__ is missing
Match the CPython 3.14.8 fallback to the actual instance type while preserving other attribute errors. Assisted-by: OpenAI Codex:model identifier unavailable
1 parent 4018e31 commit 098141b

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

‎crates/vm/src/stdlib/_abc.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,9 @@ mod _abc {
272272
let impl_data = get_impl(&cls, vm)?;
273273

274274
// Get instance.__class__
275-
let subclass = instance.get_attr("__class__", vm)?;
275+
let subclass = vm
276+
.get_attribute_opt(&instance, "__class__")?
277+
.unwrap_or_else(|| instance.class().to_owned().into());
276278

277279
// Check cache
278280
if in_weak_set(&impl_data.cache, &subclass, vm)? {

‎extra_tests/snippets/stdlib_abc.py‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,28 @@ class SubConcrete(Concrete):
3636
assert isinstance(Concrete(), CustomInterface)
3737
assert isinstance(SubConcrete(), CustomInterface)
3838
assert not isinstance((), CustomInterface)
39+
40+
41+
class NoClassAttribute:
42+
@property
43+
def __class__(self):
44+
raise AttributeError("no class attribute")
45+
46+
47+
instance = NoClassAttribute()
48+
assert not isinstance(instance, CustomInterface)
49+
CustomInterface.register(NoClassAttribute)
50+
assert isinstance(instance, CustomInterface)
51+
52+
class_error = RuntimeError("class lookup failed")
53+
54+
55+
class BrokenClassAttribute:
56+
@property
57+
def __class__(self):
58+
raise class_error
59+
60+
61+
with assert_raises(RuntimeError) as caught:
62+
isinstance(BrokenClassAttribute(), CustomInterface)
63+
assert caught.exception is class_error

0 commit comments

Comments
 (0)