diff --git a/crates/vm/src/builtins/mod.rs b/crates/vm/src/builtins/mod.rs
index c40f09bde..e9ca1f8b4 100644
--- a/crates/vm/src/builtins/mod.rs
+++ b/crates/vm/src/builtins/mod.rs
@@ -92,7 +92,7 @@ pub(crate) mod zip;
pub use zip::PyZip;
#[path = "union.rs"]
pub(crate) mod union_;
-pub use union_::PyUnion;
+pub use union_::{PyUnion, make_union};
pub(crate) mod descriptor;
pub use float::try_to_bigint as try_f64_to_bigint;
diff --git a/crates/vm/src/stdlib/_abc.rs b/crates/vm/src/stdlib/_abc.rs
new file mode 100644
index 000000000..06b403206
--- /dev/null
+++ b/crates/vm/src/stdlib/_abc.rs
@@ -0,0 +1,498 @@
+//! Implementation of the `_abc` module.
+//!
+//! This module provides the C implementation of Abstract Base Classes (ABCs)
+//! as defined in PEP 3119.
+
+pub(crate) use _abc::make_module;
+
+#[pymodule]
+mod _abc {
+ use crate::{
+ AsObject, PyObject, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
+ builtins::{PyFrozenSet, PyList, PySet, PyStr, PyTupleRef, PyTypeRef, PyWeak},
+ common::lock::PyRwLock,
+ convert::ToPyObject,
+ protocol::PyIterReturn,
+ types::Constructor,
+ };
+ use std::sync::atomic::{AtomicU64, Ordering};
+
+ // Global invalidation counter
+ static ABC_INVALIDATION_COUNTER: AtomicU64 = AtomicU64::new(0);
+
+ fn get_invalidation_counter() -> u64 {
+ ABC_INVALIDATION_COUNTER.load(Ordering::SeqCst)
+ }
+
+ fn increment_invalidation_counter() {
+ ABC_INVALIDATION_COUNTER.fetch_add(1, Ordering::SeqCst);
+ }
+
+ /// Internal state held by ABC machinery.
+ #[pyattr]
+ #[pyclass(name = "_abc_data", module = "_abc")]
+ #[derive(Debug, PyPayload)]
+ struct AbcData {
+ // WeakRef sets for registry and caches
+ registry: PyRwLock