6013fdbac9
Make several changes to template object caching: * Key the cache on Script rather than SFI, so that entries stay alive even if the SFI dies (e.g. because its parent is code flushed) but can be resurrected (because other functions from the same script can recreate it) * With the above change, identify the required template object by comparing both function literal id and feedback slot id. * Change the cache from a linked list of CachedTemplateObjects into an ArrayList pointing directly to the template object JSArrays. * With CachedTemplateObjects being gone, store the function literal id and slot id directly on the JSArray behind private symbols. Fast path access to them in the case where the template object has the expected map, and look them up in a slow path if the map changed (e.g. because the template object was used as a prototype and transitioned to a dictionary map). Change-Id: Id715cb2fd38b9605b8e6ddf5e35336bb4f0300d2 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3900376 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Camillo Bruni <cbruni@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Cr-Commit-Position: refs/heads/main@{#83693}
21 lines
448 B
JavaScript
21 lines
448 B
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: --expose-gc
|
|
|
|
function get_template_object(x) {
|
|
return x;
|
|
}
|
|
function foo() {
|
|
return get_template_object``;
|
|
}
|
|
function bar() {
|
|
return get_template_object``;
|
|
}
|
|
foo();
|
|
gc();
|
|
var cached_bar = bar();
|
|
assertNotSame(foo() === cached_bar);
|
|
assertSame(bar(), cached_bar);
|