v8/test/cctest/test-smi-lexicographic-compare.cc
Simon Zünd c433112cca [array] Use CallCFunction3 for SmiLexicographicCompare
This CL changes the call-site of SmiLexicographicCompare to a fast
c call instead of a runtime call. The runtime function is not deleted
as it is still used in InnerArraySort.

The test is also moved from mjsunit to cctest, to make removal of the
runtime function easier in the future.

R=cbruni@chromium.org, jgruber@chromium.org

Bug: v8:7382
Change-Id: Ie961eeb094c13018e9ec28b68f7c444d7f889036
Reviewed-on: https://chromium-review.googlesource.com/1201587
Commit-Queue: Simon Zünd <szuend@google.com>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Reviewed-by: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#55642}
2018-09-05 10:13:25 +00:00

80 lines
1.9 KiB
C++

// 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 <set>
#include "src/objects-inl.h"
#include "src/v8.h"
#include "test/cctest/cctest.h"
namespace v8 {
namespace internal {
namespace {
void AddSigned(std::set<Smi*>& smis, int64_t x) {
if (!Smi::IsValid(x)) return;
smis.insert(Smi::FromInt(static_cast<int>(x)));
smis.insert(Smi::FromInt(static_cast<int>(-x)));
}
// Uses std::lexicographical_compare twice to convert the result to -1, 0 or 1.
int ExpectedCompareResult(Smi* a, Smi* b) {
std::string str_a = std::to_string(a->value());
std::string str_b = std::to_string(b->value());
bool expected_a_lt_b = std::lexicographical_compare(
str_a.begin(), str_a.end(), str_b.begin(), str_b.end());
bool expected_b_lt_a = std::lexicographical_compare(
str_b.begin(), str_b.end(), str_a.begin(), str_a.end());
if (!expected_a_lt_b && !expected_b_lt_a) {
return 0;
} else if (expected_a_lt_b) {
return -1;
} else {
CHECK(expected_b_lt_a);
return 1;
}
}
bool Test(Isolate* isolate, Smi* a, Smi* b) {
int actual = Smi::LexicographicCompare(isolate, a, b)->value();
int expected = ExpectedCompareResult(a, b);
return actual == expected;
}
} // namespace
TEST(TestSmiLexicographicCompare) {
Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate);
std::set<Smi*> smis;
for (int64_t xb = 1; xb <= Smi::kMaxValue; xb *= 10) {
for (int64_t xf = 0; xf <= 9; ++xf) {
for (int64_t xo = -1; xo <= 1; ++xo) {
AddSigned(smis, xb * xf + xo);
}
}
}
for (int64_t yb = 1; yb <= Smi::kMaxValue; yb *= 2) {
for (int64_t yo = -2; yo <= 2; ++yo) {
AddSigned(smis, yb + yo);
}
}
for (Smi* a : smis) {
for (Smi* b : smis) {
CHECK(Test(isolate, a, b));
}
}
}
} // namespace internal
} // namespace v8