mirror of
				https://github.com/pocketpy/pocketpy
				synced 2025-10-26 22:40:17 +00:00 
			
		
		
		
	
		
			
				
	
	
	
		
			915 B
		
	
	
	
	
	
	
	
			
		
		
	
	
			915 B
		
	
	
	
	
	
	
	
| icon | label | order | 
|---|---|---|
| dot | Miscellaneous | 0 | 
The scope lock of gc
Sometimes you need to use the following code to prevent the gc from collecting objects.
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.
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.
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);
}