Reason for revert:
This still breaks: https://build.chromium.org/p/client.v8/builders/V8%20Linux64%20GC%20Stress%20-%20custom%20snapshot/builds/1296/steps/Mjsunit/logs/load-proxy
Test: mjsunit/strong/load-proxy
Flags: --stress-opt --always-opt
Command: out/Debug/d8 --test --random-seed=
2021532800 --stress-opt --always-opt --nohard-abort --nodead-code-elimination --nofold-constants --enable-slow-asserts --debug-code --verify-heap --harmony-proxies --strong-mode test/mjsunit/strong/load-proxy.js --gc-interval=500 --stress-compaction --concurrent-recompilation-queue-length=64 --concurrent-recompilation-delay=500 --concurrent-recompilation
Run #1
Exit code: -11
Result: CRASH
Expected outcomes: PASS
Duration: 00:00:553
Run #2
Exit code: -11
Result: CRASH
Expected outcomes: PASS
Duration: 00:00:520
Run #3
Exit code: -11
Result: CRASH
Expected outcomes: PASS
Duration: 00:00:572
Original issue's description:
> Remove serializer-specific hash table size heuristic.
>
> The heuristic can cause weird behavior when bootstrapping.
> The memory savings is not worth this hassle.
>
> Committed: https://crrev.com/
fc80f29a582b758d14aae864232624ca45e47ddc
> Cr-Commit-Position: refs/heads/master@{#30019}
TBR=ulan@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Review URL: https://codereview.chromium.org/
1268413002
Cr-Commit-Position: refs/heads/master@{#30024}
base::ElapsedTimer timer;
timer.Start();
Isolate::Scope isolate_scope(isolate);
+ internal_isolate->set_creating_default_snapshot(true);
internal_isolate->Init(NULL);
Persistent<Context> context;
i::Snapshot::Metadata metadata;
{
HandleScope handle_scope(isolate);
Local<Context> new_context = Context::New(isolate);
+ internal_isolate->set_creating_default_snapshot(false);
context.Reset(isolate, new_context);
if (custom_source != NULL) {
metadata.set_embeds_script(true);
InstallNativeFunctions();
auto function_cache =
- ObjectHashTable::New(isolate(), ApiNatives::kInitialFunctionCacheSize,
- USE_CUSTOM_MINIMUM_CAPACITY);
+ 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
V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \
V(PromiseRejectCallback, promise_reject_callback, NULL) \
V(const v8::StartupData*, snapshot_blob, NULL) \
+ V(bool, creating_default_snapshot, false) \
ISOLATE_INIT_SIMULATOR_LIST(V)
#define THREAD_LOCAL_TOP_ACCESSOR(type, name) \
}
+int HashTableBase::ComputeCapacityForSerialization(int at_least_space_for) {
+ const int kMinCapacity = 1;
+ int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for);
+ return Max(capacity, kMinCapacity);
+}
+
+
template <typename Derived, typename Shape, typename Key>
int HashTable<Derived, Shape, Key>::FindEntry(Key key) {
return FindEntry(GetIsolate(), key);
int capacity = (capacity_option == USE_CUSTOM_MINIMUM_CAPACITY)
? at_least_space_for
- : ComputeCapacity(at_least_space_for);
+ : isolate->creating_default_snapshot()
+ ? ComputeCapacityForSerialization(at_least_space_for)
+ : ComputeCapacity(at_least_space_for);
if (capacity > HashTable::kMaxCapacity) {
v8::internal::Heap::FatalProcessOutOfMemory("invalid table size", true);
}
// number of elements. May be more than HashTable::kMaxCapacity.
static inline int ComputeCapacity(int at_least_space_for);
+ // Use a different heuristic to compute capacity when serializing.
+ static inline int ComputeCapacityForSerialization(int at_least_space_for);
+
// Tells whether k is a real key. The hole and undefined are not allowed
// as keys and can be used to indicate missing or deleted elements.
bool IsKey(Object* k) {