Skip to content

Commit f7cf348

Browse files
committed
fix: allow double dealloc for now(which only occur in drop Frame
1 parent 02d7dcf commit f7cf348

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

vm/src/intern.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use crate::{
22
builtins::{PyStr, PyStrInterned, PyTypeRef},
33
common::lock::PyRwLock,
44
convert::ToPyObject,
5-
AsObject, Py, PyExact, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, VirtualMachine, object::gc::GcObjPtr,
5+
object::gc::GcObjPtr,
6+
AsObject, Py, PyExact, PyObject, PyObjectRef, PyPayload, PyRef, PyRefExact, VirtualMachine,
67
};
78
use std::{
89
borrow::{Borrow, ToOwned},

vm/src/object/core.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1083,7 +1083,17 @@ impl PyObject {
10831083
// sanity check
10841084
#[cfg(feature = "gc")]
10851085
{
1086-
debug_assert!(!ptr.as_ref().header().is_dealloc());
1086+
if ptr.as_ref().header().is_dealloc() {
1087+
// it seems dropping a Frame results in double dropping a object
1088+
error!("is_leaked: {}", ptr.as_ref().header().is_leaked());
1089+
error!(
1090+
"Dropping a already deallocated object!: {:?}",
1091+
PyObjectRef { ptr }
1092+
);
1093+
error!("{:?}", ptr.as_ref().0.header());
1094+
error!("Current backtrace: {:?}", backtrace::Backtrace::new());
1095+
}
1096+
// debug_assert!(!ptr.as_ref().header().is_dealloc());
10871097

10881098
if !ptr.as_ref().header().check_set_drop_dealloc() {
10891099
return;

vm/src/object/gc/collector_sync.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ impl CcSync {
153153
}
154154
pub fn increment(&self, obj: GcObjRef) {
155155
if obj.header().is_leaked() {
156-
// by define a leaked object's rc should not change?
157156
return;
158157
}
159158
obj.header().do_pausing();
@@ -169,13 +168,13 @@ impl CcSync {
169168
// a leaked object should always keep
170169
return GcStatus::ShouldKeep;
171170
}
171+
172+
// acquire exclusive access to obj's header
173+
#[cfg(feature = "threading")]
174+
let _lock = obj.header().exclusive.lock();
172175
// prevent RAII Drop to drop below zero
173176
if obj.header().rc() > 0 {
174177
obj.header().do_pausing();
175-
// acquire exclusive access to obj's header
176-
#[cfg(feature = "threading")]
177-
let _lock = obj.header().exclusive.lock();
178-
179178
let rc = obj.header().dec();
180179
if rc == 0 {
181180
self.release(obj)

0 commit comments

Comments
 (0)