mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
...
This commit is contained in:
parent
41e70d4f98
commit
62024cb132
@ -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);
|
||||
}
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user