From 64e0c78b6ff93bb068087c765356cd635a27c63d Mon Sep 17 00:00:00 2001 From: Tunahan Karlibas Date: Mon, 9 Sep 2019 08:25:22 +0300 Subject: [PATCH] Implement __init_subclass__ --- vm/src/builtins.rs | 10 +++++++++- vm/src/function.rs | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index 99627549ff..9f50892bdf 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -17,7 +17,7 @@ use crate::obj::objdict::PyDictRef; use crate::obj::objint::{self, PyIntRef}; use crate::obj::objiter; use crate::obj::objstr::{PyString, PyStringRef}; -use crate::obj::objtype::{self, PyClassRef}; +use crate::obj::objtype::{self, PyClass, PyClassRef}; #[cfg(feature = "rustpython-compiler")] use rustpython_compiler::compile; @@ -944,5 +944,13 @@ pub fn builtin_build_class_( vec![name_obj, bases, namespace.into_object()], )?; cells.set_item("__class__", class.clone(), vm)?; + + for base_class in class.clone().downcast::().unwrap().mro.clone() { + if let Ok(initter) = vm.get_attribute(base_class.into_object(), "__init_subclass__") { + let args: Args = Args::new(vec![class.clone()]); + vm.invoke(&initter, PyFuncArgs::from((&args, &kwargs)))?; + break; + } + } Ok(class) } diff --git a/vm/src/function.rs b/vm/src/function.rs index 9874309fce..25983ed076 100644 --- a/vm/src/function.rs +++ b/vm/src/function.rs @@ -290,6 +290,9 @@ impl Args { pub fn into_vec(self) -> Vec { self.0 } + pub fn new(args: Vec) -> Self { + Self(args) + } } impl Args> {