49 lines
1.5 KiB
JavaScript
49 lines
1.5 KiB
JavaScript
|
// Copyright 2022 the V8 project authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
//
|
||
|
// Flags: --allow-natives-syntax --expose-gc
|
||
|
// Flags: --no-sparkplug --no-maglev --no-turbofan
|
||
|
// Flags: --lazy --flush-bytecode
|
||
|
|
||
|
// Helper that, given a template object, simply returns it.
|
||
|
function get_template_object(obj) {
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
function foo_factory() {
|
||
|
// The SFI for foo is held by the bytecode array of foo_factory, so will be
|
||
|
// collected if foo_factory's bytecode is flushed.
|
||
|
return function foo() {
|
||
|
return get_template_object``
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Create foo in another function to avoid it leaking on the global object or
|
||
|
// top-level script locals, and accidentally being kept alive.
|
||
|
function get_foo_template_object() {
|
||
|
let foo = foo_factory();
|
||
|
return foo();
|
||
|
}
|
||
|
|
||
|
assertTrue(isLazy(foo_factory));
|
||
|
|
||
|
let inital_template_object = get_foo_template_object();
|
||
|
assertEquals(inital_template_object, get_foo_template_object(),
|
||
|
"Template object identity should be preserved");
|
||
|
|
||
|
// Force a flush of foo_factory, so that the SharedFunctionInfo of foo can be
|
||
|
// collected.
|
||
|
%ForceFlush(foo_factory);
|
||
|
assertTrue(isLazy(foo_factory));
|
||
|
|
||
|
// Do a few more GCs to allow weak maps to be cleared.
|
||
|
gc();
|
||
|
gc();
|
||
|
gc();
|
||
|
|
||
|
// Flushing foo_factory and GCing foo should not affect the persisted reference
|
||
|
// identity of the template object inside foo.
|
||
|
assertSame(inital_template_object, get_foo_template_object(),
|
||
|
"Template object identity should be preserved");
|