Commit b76c27bf authored by Tobias Tebbi's avatar Tobias Tebbi Committed by Commit Bot

[torque] fix bug in Stack::DeleteRange

This bug does not affect the Torque run on tip-of-tree, but surfaced
in https://crrev.com/c/1196693.
The logic in Stack::DeleteRange was completely wrong and does not work
if the number of moved elements is bigger than the number of deleted
elements.

Change-Id: I5433b3b06e2e54646104493e9bc5e77b9763a521
Reviewed-on: https://chromium-review.googlesource.com/c/1282103Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56676}
parent 66afdda6
...@@ -214,9 +214,9 @@ class Stack { ...@@ -214,9 +214,9 @@ class Stack {
// Delete the slots in {range}, moving higher slots to fill the gap. // Delete the slots in {range}, moving higher slots to fill the gap.
void DeleteRange(StackRange range) { void DeleteRange(StackRange range) {
DCHECK_LE(range.end(), AboveTop()); DCHECK_LE(range.end(), AboveTop());
for (BottomOffset i = range.begin(); if (range.Size() == 0) return;
i < std::min(range.end(), AboveTop() - range.Size()); ++i) { for (BottomOffset i = range.end(); i < AboveTop(); ++i) {
elements_[i.offset] = std::move(elements_[i.offset + range.Size()]); elements_[i.offset - range.Size()] = std::move(elements_[i.offset]);
} }
elements_.resize(elements_.size() - range.Size()); elements_.resize(elements_.size() - range.Size());
} }
......
...@@ -198,6 +198,7 @@ v8_source_set("unittests_sources") { ...@@ -198,6 +198,7 @@ v8_source_set("unittests_sources") {
"test-utils.cc", "test-utils.cc",
"test-utils.h", "test-utils.h",
"torque/earley-parser-unittest.cc", "torque/earley-parser-unittest.cc",
"torque/torque-unittest.cc",
"unicode-unittest.cc", "unicode-unittest.cc",
"utils-unittest.cc", "utils-unittest.cc",
"value-serializer-unittest.cc", "value-serializer-unittest.cc",
......
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/torque/utils.h"
#include "test/unittests/test-utils.h"
namespace v8 {
namespace internal {
namespace torque {
TEST(Torque, StackDeleteRange) {
Stack<int> stack = {1, 2, 3, 4, 5, 6, 7};
stack.DeleteRange(StackRange{BottomOffset{2}, BottomOffset{4}});
Stack<int> result = {1, 2, 5, 6, 7};
ASSERT_TRUE(stack == result);
}
} // namespace torque
} // namespace internal
} // namespace v8
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment