diff options
Diffstat (limited to 'deps/v8/src')
-rw-r--r-- | deps/v8/src/api-natives.cc | 46 | ||||
-rw-r--r-- | deps/v8/src/api-natives.h | 2 | ||||
-rw-r--r-- | deps/v8/src/bootstrapper.cc | 4 | ||||
-rw-r--r-- | deps/v8/src/contexts.h | 2 | ||||
-rw-r--r-- | deps/v8/src/type-info.cc | 3 |
5 files changed, 30 insertions, 27 deletions
diff --git a/deps/v8/src/api-natives.cc b/deps/v8/src/api-natives.cc index ed434caa00..11f20efe86 100644 --- a/deps/v8/src/api-natives.cc +++ b/deps/v8/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>(); } diff --git a/deps/v8/src/api-natives.h b/deps/v8/src/api-natives.h index 9f97b5d018..224c78a6ad 100644 --- a/deps/v8/src/api-natives.h +++ b/deps/v8/src/api-natives.h @@ -12,6 +12,8 @@ namespace internal { class ApiNatives { public: + static const int kInitialFunctionCacheSize = 256; + MUST_USE_RESULT static MaybeHandle<JSFunction> InstantiateFunction( Handle<FunctionTemplateInfo> data); diff --git a/deps/v8/src/bootstrapper.cc b/deps/v8/src/bootstrapper.cc index 31d6e3e00c..2592bb7330 100644 --- a/deps/v8/src/bootstrapper.cc +++ b/deps/v8/src/bootstrapper.cc @@ -2059,7 +2059,9 @@ bool Genesis::InstallNatives() { InstallNativeFunctions(); - native_context()->set_function_cache(heap()->empty_fixed_array()); + auto function_cache = + ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize); + native_context()->set_function_cache(*function_cache); // Store the map for the string prototype after the natives has been compiled // and the String function has been set up. diff --git a/deps/v8/src/contexts.h b/deps/v8/src/contexts.h index f932c60092..3d34e0ec77 100644 --- a/deps/v8/src/contexts.h +++ b/deps/v8/src/contexts.h @@ -138,7 +138,7 @@ enum BindingFlags { V(MAKE_MESSAGE_FUN_INDEX, JSFunction, make_message_fun) \ V(GET_STACK_TRACE_LINE_INDEX, JSFunction, get_stack_trace_line_fun) \ V(CONFIGURE_GLOBAL_INDEX, JSFunction, configure_global_fun) \ - V(FUNCTION_CACHE_INDEX, FixedArray, function_cache) \ + V(FUNCTION_CACHE_INDEX, ObjectHashTable, function_cache) \ V(JSFUNCTION_RESULT_CACHES_INDEX, FixedArray, jsfunction_result_caches) \ V(NORMALIZED_MAP_CACHE_INDEX, Object, normalized_map_cache) \ V(RUNTIME_CONTEXT_INDEX, Context, runtime_context) \ diff --git a/deps/v8/src/type-info.cc b/deps/v8/src/type-info.cc index 01943414a7..96bd0ed0e3 100644 --- a/deps/v8/src/type-info.cc +++ b/deps/v8/src/type-info.cc @@ -437,6 +437,9 @@ bool TypeFeedbackOracle::CanRetainOtherContext(Map* map, } constructor = map->constructor(); if (constructor->IsNull()) return false; + // If the constructor is not null or a JSFunction, we have to conservatively + // assume that it may retain a native context. + if (!constructor->IsJSFunction()) return true; JSFunction* function = JSFunction::cast(constructor); return CanRetainOtherContext(function, native_context); } |