blueloveTH 1 an în urmă
părinte
comite
3edbe7cdf5
2 a modificat fișierele cu 11 adăugiri și 0 ștergeri
  1. 2 0
      include/pocketpy/vm.h
  2. 9 0
      src/vm.cpp

+ 2 - 0
include/pocketpy/vm.h

@@ -48,6 +48,8 @@ struct PyTypeInfo{
 
         Vt(): _dtor(nullptr), _gc_mark(nullptr) {}
 
+        operator bool() const { return _dtor || _gc_mark; }
+
         template<typename T>
         inline static Vt get(){
             static_assert(std::is_same_v<T, std::decay_t<T>>);

+ 9 - 0
src/vm.cpp

@@ -212,6 +212,15 @@ namespace pkpy{
             Str error = _S("type ", base_info.name.escape(), " is not `subclass_enabled`");
             throw std::runtime_error(error.c_str());
         }
+        if(base_info.vt){
+            if(vt){
+                Str error = _S("type ", base_info.name.escape(), " has a custom vtable, cannot override");
+                throw std::runtime_error(error.c_str());
+            }else{
+                // promote base vt to its subclass
+                vt = base_info.vt;
+            }
+        }
         _all_types.emplace_back(obj, base, mod, name, subclass_enabled, vt);
         return obj;
     }