Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Unified Diff: src/api-natives.cc

Issue 988283003: use a hash table for the function cache as blink is leaking functiontemplates (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/api-natives.h ('k') | src/bootstrapper.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api-natives.cc
diff --git a/src/api-natives.cc b/src/api-natives.cc
index 44b09dffba387bc60d355a763b484554a949ccd1..e7924533ac25bd2a27de3b96116f9a7d2ca7361d 100644
--- a/src/api-natives.cc
+++ b/src/api-natives.cc
@@ -207,36 +207,33 @@ MaybeHandle<JSObject> InstantiateObject(Isolate* isolate,
}
-void InstallInCache(Isolate* isolate, int serial_number,
- Handle<JSFunction> function) {
+void CacheFunction(Isolate* isolate, Handle<Smi> serial_number,
+ Handle<JSFunction> function) {
auto cache = isolate->function_cache();
- if (cache->length() <= serial_number) {
- int new_size;
- if (isolate->next_serial_number() < 50) {
- new_size = 100;
- } else {
- new_size = 3 * isolate->next_serial_number() / 2;
- }
- cache = FixedArray::CopySize(cache, new_size);
- isolate->native_context()->set_function_cache(*cache);
- }
- cache->set(serial_number, *function);
+ auto new_cache = ObjectHashTable::Put(cache, serial_number, function);
+ isolate->native_context()->set_function_cache(*new_cache);
+}
+
+
+void UncacheFunction(Isolate* isolate, Handle<Smi> serial_number) {
+ auto cache = isolate->function_cache();
+ bool was_present = false;
+ auto new_cache = ObjectHashTable::Remove(cache, serial_number, &was_present);
+ DCHECK(was_present);
+ isolate->native_context()->set_function_cache(*new_cache);
}
MaybeHandle<JSFunction> InstantiateFunction(Isolate* isolate,
Handle<FunctionTemplateInfo> data,
Handle<Name> name) {
- int serial_number = Smi::cast(data->serial_number())->value();
+ auto serial_number = handle(Smi::cast(data->serial_number()), isolate);
// Probe cache.
if (!data->do_not_cache()) {
auto cache = isolate->function_cache();
- // Fast case: see if the function has already been instantiated
- if (serial_number < cache->length()) {
- Handle<Object> element = FixedArray::get(cache, serial_number);
- if (element->IsJSFunction()) {
- return Handle<JSFunction>::cast(element);
- }
+ Object* element = cache->Lookup(serial_number);
+ if (element->IsJSFunction()) {
+ return handle(JSFunction::cast(element), isolate);
}
}
// Enter a new scope. Recursion could otherwise create a lot of handles.
@@ -279,15 +276,14 @@ MaybeHandle<JSFunction> InstantiateFunction(Isolate* isolate,
function->shared()->set_name(*name);
}
if (!data->do_not_cache()) {
- // Cache the function to limit recursion.
- InstallInCache(isolate, serial_number, function);
+ // Cache the function.
+ CacheFunction(isolate, serial_number, function);
}
auto result = ConfigureInstance(isolate, function, data);
if (result.is_null()) {
- // uncache on error.
+ // Uncache on error.
if (!data->do_not_cache()) {
- auto cache = isolate->function_cache();
- cache->set(serial_number, isolate->heap()->undefined_value());
+ UncacheFunction(isolate, serial_number);
}
return MaybeHandle<JSFunction>();
}
« no previous file with comments | « src/api-natives.h ('k') | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698