Skip to content

Commit 26d4580

Browse files
authored
fix(ecmascript): Trace and sweep ExecutableHeapData function expressions (#881)
1 parent c85e2cc commit 26d4580

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

nova_vm/src/engine/bytecode/executable.rs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,26 @@ pub(crate) struct FunctionExpression<'a> {
8181

8282
bindable_handle!(FunctionExpression);
8383

84+
impl HeapMarkAndSweep for FunctionExpression<'static> {
85+
fn mark_values(&self, queues: &mut WorkQueues) {
86+
let Self {
87+
expression: _,
88+
identifier: _,
89+
compiled_bytecode,
90+
} = self;
91+
compiled_bytecode.mark_values(queues);
92+
}
93+
94+
fn sweep_values(&mut self, compactions: &CompactionLists) {
95+
let Self {
96+
expression: _,
97+
identifier: _,
98+
compiled_bytecode,
99+
} = self;
100+
compiled_bytecode.sweep_values(compactions);
101+
}
102+
}
103+
84104
#[derive(Debug, Clone)]
85105
pub(crate) struct ArrowFunctionExpression {
86106
pub(crate) expression: SendableRef<ast::ArrowFunctionExpression<'static>>,
@@ -504,16 +524,15 @@ impl HeapMarkAndSweep for ExecutableHeapData<'static> {
504524
caches,
505525
constants,
506526
shapes,
507-
function_expressions: _,
527+
function_expressions,
508528
arrow_function_expressions: _,
509529
class_initializer_bytecodes,
510530
} = self;
511531
constants.mark_values(queues);
512532
caches.mark_values(queues);
513533
shapes.mark_values(queues);
514-
for ele in class_initializer_bytecodes {
515-
ele.0.mark_values(queues);
516-
}
534+
function_expressions.mark_values(queues);
535+
class_initializer_bytecodes.mark_values(queues);
517536
}
518537

519538
fn sweep_values(&mut self, compactions: &CompactionLists) {
@@ -522,16 +541,15 @@ impl HeapMarkAndSweep for ExecutableHeapData<'static> {
522541
caches,
523542
constants,
524543
shapes,
525-
function_expressions: _,
544+
function_expressions,
526545
arrow_function_expressions: _,
527546
class_initializer_bytecodes,
528547
} = self;
529548
constants.sweep_values(compactions);
530549
caches.sweep_values(compactions);
531550
shapes.sweep_values(compactions);
532-
for ele in class_initializer_bytecodes {
533-
ele.0.sweep_values(compactions);
534-
}
551+
function_expressions.sweep_values(compactions);
552+
class_initializer_bytecodes.sweep_values(compactions);
535553
}
536554
}
537555

nova_vm/src/heap/heap_bits.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,36 @@ where
13201320
}
13211321
}
13221322

1323+
macro_rules! trivially_sweepable {
1324+
($self:ty) => {
1325+
impl crate::heap::heap_bits::HeapMarkAndSweep for $self {
1326+
#[inline]
1327+
fn mark_values(&self, _: &mut crate::heap::heap_bits::WorkQueues) {}
1328+
1329+
#[inline]
1330+
fn sweep_values(&mut self, _: &crate::heap::heap_bits::CompactionLists) {}
1331+
}
1332+
};
1333+
}
1334+
pub(crate) use trivially_sweepable;
1335+
1336+
trivially_sweepable!(());
1337+
trivially_sweepable!(bool);
1338+
trivially_sweepable!(i8);
1339+
trivially_sweepable!(u8);
1340+
trivially_sweepable!(i16);
1341+
trivially_sweepable!(u16);
1342+
trivially_sweepable!(i32);
1343+
trivially_sweepable!(u32);
1344+
trivially_sweepable!(i64);
1345+
trivially_sweepable!(u64);
1346+
trivially_sweepable!(isize);
1347+
trivially_sweepable!(usize);
1348+
#[cfg(feature = "proposal-float16array")]
1349+
trivially_sweepable!(f16);
1350+
trivially_sweepable!(f32);
1351+
trivially_sweepable!(f64);
1352+
13231353
impl<T> HeapMarkAndSweep for (T,)
13241354
where
13251355
T: HeapMarkAndSweep,

0 commit comments

Comments
 (0)