From 212e6bb0927ed3f49e7432a807f9e8514f7a07f7 Mon Sep 17 00:00:00 2001 From: Marcel Laverdet Date: Sun, 29 Jul 2018 10:37:56 -0600 Subject: [PATCH] deps: cherry-pick 22116dd from upstream V8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: https://github.com/v8/v8/commit/22116dd6c884c026225e56dd8e442a660193e729 Original commit message: [snapshot] fix resetting function code. Unconditionally setting the JSFunction code to that of the SFI may skip initializing the feedback vector. R=leszeks@chromium.org Bug: v8:7857 Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng Change-Id: I65d4bf32493be4cade2eaf3d665d44f93e80f809 Reviewed-on: https://chromium-review.googlesource.com/1107618 Commit-Queue: Yang Guo Reviewed-by: Leszek Swirski Cr-Commit-Position: refs/heads/master@{#53881} PR-URL: https://github.com/nodejs/node/pull/21992 Reviewed-By: Tiancheng "Timothy" Gu Reviewed-By: Michaƫl Zasso Reviewed-By: Franziska Hinkelmann Reviewed-By: Gus Caplan --- common.gypi | 2 +- deps/v8/src/api.cc | 7 ++-- deps/v8/src/snapshot/partial-serializer.cc | 2 +- deps/v8/test/cctest/test-serialize.cc | 41 ++++++++++++++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/common.gypi b/common.gypi index e124482f0e22e6..d90161aafd236a 100644 --- a/common.gypi +++ b/common.gypi @@ -29,7 +29,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.25', + 'v8_embedder_string': '-node.26', # Enable disassembler for `--print-code` v8 options 'v8_enable_disassembler': 1, diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc index 6799af22f99f9e..4e34a6541c70d2 100644 --- a/deps/v8/src/api.cc +++ b/deps/v8/src/api.cc @@ -766,8 +766,11 @@ StartupData SnapshotCreator::CreateBlob( // Complete in-object slack tracking for all functions. fun->CompleteInobjectSlackTrackingIfActive(); - // Also, clear out feedback vectors. - fun->feedback_cell()->set_value(isolate->heap()->undefined_value()); + // Also, clear out feedback vectors, or any optimized code. + if (fun->has_feedback_vector()) { + fun->feedback_cell()->set_value(isolate->heap()->undefined_value()); + fun->set_code(isolate->builtins()->builtin(i::Builtins::kCompileLazy)); + } } // Clear out re-compilable data from all shared function infos. Any diff --git a/deps/v8/src/snapshot/partial-serializer.cc b/deps/v8/src/snapshot/partial-serializer.cc index 8b4c9d8d922406..5624ba98879666 100644 --- a/deps/v8/src/snapshot/partial-serializer.cc +++ b/deps/v8/src/snapshot/partial-serializer.cc @@ -105,7 +105,7 @@ void PartialSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code, // Unconditionally reset the JSFunction to its SFI's code, since we can't // serialize optimized code anyway. JSFunction* closure = JSFunction::cast(obj); - closure->set_code(closure->shared()->GetCode()); + if (closure->is_compiled()) closure->set_code(closure->shared()->GetCode()); } CheckRehashability(obj); diff --git a/deps/v8/test/cctest/test-serialize.cc b/deps/v8/test/cctest/test-serialize.cc index 453cb108818568..c26a7e734811a0 100644 --- a/deps/v8/test/cctest/test-serialize.cc +++ b/deps/v8/test/cctest/test-serialize.cc @@ -2640,6 +2640,47 @@ TEST(SnapshotCreatorNoExternalReferencesDefault) { delete[] blob.data; } +v8::StartupData CreateCustomSnapshotArrayJoinWithKeep() { + v8::SnapshotCreator creator; + v8::Isolate* isolate = creator.GetIsolate(); + { + v8::HandleScope handle_scope(isolate); + { + v8::Local context = v8::Context::New(isolate); + v8::Context::Scope context_scope(context); + CompileRun( + "[].join('');\n" + "function g() { return String([1,2,3]); }\n"); + ExpectString("g()", "1,2,3"); + creator.SetDefaultContext(context); + } + } + return creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kKeep); +} + +TEST(SnapshotCreatorArrayJoinWithKeep) { + DisableAlwaysOpt(); + v8::StartupData blob = CreateCustomSnapshotArrayJoinWithKeep(); + + // Deserialize with an incomplete list of external references. + { + v8::Isolate::CreateParams params; + params.snapshot_blob = &blob; + params.array_buffer_allocator = CcTest::array_buffer_allocator(); + // Test-appropriate equivalent of v8::Isolate::New. + v8::Isolate* isolate = TestIsolate::New(params); + { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + v8::Local context = v8::Context::New(isolate); + v8::Context::Scope context_scope(context); + ExpectString("g()", "1,2,3"); + } + isolate->Dispose(); + } + delete[] blob.data; +} + TEST(SnapshotCreatorNoExternalReferencesCustomFail1) { DisableAlwaysOpt(); v8::StartupData blob = CreateSnapshotWithDefaultAndCustom();