summaryrefslogtreecommitdiff
path: root/deps/v8/src
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src')
-rw-r--r--deps/v8/src/api-natives.cc46
-rw-r--r--deps/v8/src/api-natives.h2
-rw-r--r--deps/v8/src/bootstrapper.cc4
-rw-r--r--deps/v8/src/contexts.h2
-rw-r--r--deps/v8/src/type-info.cc3
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);
}