From 62024cb132d556e253f4d2796d74cd47953125ea Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Wed, 6 Dec 2023 13:06:36 +0800 Subject: [PATCH] ... --- docs/quick-start/misc.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/quick-start/misc.md b/docs/quick-start/misc.md index 687b2e9b..ddd5f19e 100644 --- a/docs/quick-start/misc.md +++ b/docs/quick-start/misc.md @@ -1,6 +1,6 @@ --- icon: dot -label: 'Misc' +label: 'Miscellaneous' order: 0 --- @@ -9,15 +9,32 @@ order: 0 Sometimes you need to use the following code to prevent the gc from collecting objects. ```cpp -auto _lock = vm->heap.gc_scope_lock() +auto _lock = vm->heap.gc_scope_lock(); ``` The scope lock is required if you create a PyObject and then try to run python-level bytecodes. For example, you create a temporary object on the stack and then call `vm->py_str`. +```cpp +void some_func(VM* vm){ + PyObject* obj = VAR(List(5)); + // unsafe + PyObject obj_string = vm->py_str(obj); +} +``` + Because users can have an overload of `__str__`, the call process is unsafe. When the vm is running python-level bytecodes, gc may start and delete your temporary object. The scope lock prevents this from happening. + +```cpp +void some_func(VM* vm){ + PyObject* obj = VAR(List(5)); + // safe + auto _lock = vm->heap.gc_scope_lock(); + PyObject obj_string = vm->py_str(obj); +} +```