mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
update gc
Update ref.h up
This commit is contained in:
parent
6ea82f01fd
commit
16ef631bfd
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@ -47,7 +47,7 @@ jobs:
|
||||
build_dir: web
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: github.event_name == 'push'
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
path: output
|
||||
|
17
src/obj.h
17
src/obj.h
@ -87,6 +87,9 @@ public:
|
||||
virtual ~BaseIter() = default;
|
||||
};
|
||||
|
||||
template <typename, typename=void> struct is_container_gc : std::false_type {};
|
||||
template <typename T> struct is_container_gc<T, std::void_t<decltype(T::_mark)>> : std::true_type {};
|
||||
|
||||
struct GCHeader {
|
||||
bool enabled; // whether this object is managed by GC
|
||||
bool marked; // whether this object is marked
|
||||
@ -135,7 +138,7 @@ struct Py_ : PyObject {
|
||||
|
||||
void mark() override {
|
||||
PyObject::mark();
|
||||
// extra mark for `T`
|
||||
if constexpr (is_container_gc<T>::value) _value._mark();
|
||||
}
|
||||
};
|
||||
|
||||
@ -177,15 +180,9 @@ union BitsCvt {
|
||||
template <typename, typename=void> struct is_py_class : std::false_type {};
|
||||
template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : std::true_type {};
|
||||
|
||||
template<typename T>
|
||||
void _check_py_class(VM* vm, PyObject* var);
|
||||
|
||||
template<typename T>
|
||||
T py_pointer_cast(VM* vm, PyObject* var);
|
||||
|
||||
template<typename T>
|
||||
T py_value_cast(VM* vm, PyObject* var);
|
||||
|
||||
template<typename T> void _check_py_class(VM*, PyObject*);
|
||||
template<typename T> T py_pointer_cast(VM*, PyObject*);
|
||||
template<typename T> T py_value_cast(VM*, PyObject*);
|
||||
struct Discarded { };
|
||||
|
||||
template<typename __T>
|
||||
|
@ -755,6 +755,11 @@ inline void add_module_random(VM* vm){
|
||||
vm->_exec(code, mod);
|
||||
}
|
||||
|
||||
inline void add_module_gc(VM* vm){
|
||||
PyObject* mod = vm->new_module("gc");
|
||||
vm->bind_func<0>(mod, "collect", CPP_LAMBDA(VAR(vm->gc_collect())));
|
||||
}
|
||||
|
||||
inline void VM::post_init(){
|
||||
init_builtins(this);
|
||||
add_module_sys(this);
|
||||
@ -767,6 +772,7 @@ inline void VM::post_init(){
|
||||
add_module_io(this);
|
||||
add_module_os(this);
|
||||
add_module_c(this);
|
||||
add_module_gc(this);
|
||||
|
||||
for(const char* name: {"this", "functools", "collections", "heapq", "bisect"}){
|
||||
_lazy_modules[name] = kPythonLibs[name];
|
||||
|
@ -99,9 +99,7 @@ struct IndexRef : BaseRef {
|
||||
}
|
||||
|
||||
void set(VM* vm, Frame* frame, PyObject* val) const{
|
||||
Args args(3);
|
||||
args[0] = obj; args[1] = index; args[2] = std::move(val);
|
||||
vm->fast_call(__setitem__, std::move(args));
|
||||
vm->fast_call(__setitem__, Args{obj, index, val});
|
||||
}
|
||||
|
||||
void del(VM* vm, Frame* frame) const{
|
||||
|
11
src/vm.h
11
src/vm.h
@ -144,6 +144,11 @@ public:
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
i64 gc_collect(){
|
||||
heap.collect(this);
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
PyObject* gcnew(Type type, T&& val){
|
||||
PyObject* obj = new Py_<std::decay_t<T>>(type, std::forward<T>(val));
|
||||
@ -931,4 +936,10 @@ inline PyObject* VM::_exec(){
|
||||
}
|
||||
}
|
||||
|
||||
inline std::vector<PyObject*> ManagedHeap::get_roots(VM *vm) {
|
||||
std::vector<PyObject*> roots;
|
||||
// ...
|
||||
return roots;
|
||||
}
|
||||
|
||||
} // namespace pkpy
|
Loading…
x
Reference in New Issue
Block a user