mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 07:18:39 +09:00
import FIREFOX_52_6_0esr_RELEASE from mozilla-esr52 hg repo
This commit is contained in:
commit
dcd9973243
150858 changed files with 23884658 additions and 0 deletions
313
mfbt/tests/TestArrayUtils.cpp
Normal file
313
mfbt/tests/TestArrayUtils.cpp
Normal file
|
|
@ -0,0 +1,313 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/Assertions.h"
|
||||
|
||||
using mozilla::IsInRange;
|
||||
|
||||
static void
|
||||
TestIsInRangeNonClass()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
int* intBegin = nullptr;
|
||||
int* intEnd = intBegin + 1;
|
||||
int* intEnd2 = intBegin + 2;
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, intBegin, intEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, intEnd, intEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intBegin, intBegin, intEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(intEnd, intBegin, intEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intBegin, intBegin, intEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intEnd, intBegin, intEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(intEnd2, intBegin, intEnd2));
|
||||
|
||||
uintptr_t uintBegin = uintptr_t(intBegin);
|
||||
uintptr_t uintEnd = uintptr_t(intEnd);
|
||||
uintptr_t uintEnd2 = uintptr_t(intEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, uintBegin, uintEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, uintEnd, uintEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intBegin, uintBegin, uintEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(intEnd, uintBegin, uintEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intBegin, uintBegin, uintEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(intEnd, uintBegin, uintEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(intEnd2, uintBegin, uintEnd2));
|
||||
}
|
||||
|
||||
static void
|
||||
TestIsInRangeVoid()
|
||||
{
|
||||
int* intBegin = nullptr;
|
||||
int* intEnd = intBegin + 1;
|
||||
int* intEnd2 = intBegin + 2;
|
||||
|
||||
void* voidBegin = intBegin;
|
||||
void* voidEnd = intEnd;
|
||||
void* voidEnd2 = intEnd2;
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, intBegin, intEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd, intBegin, intEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, voidBegin, voidEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd, voidBegin, voidEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, intBegin, intEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidEnd, intBegin, intEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd2, intBegin, intEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, voidBegin, voidEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidEnd, voidBegin, voidEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd2, voidBegin, voidEnd2));
|
||||
|
||||
uintptr_t uintBegin = uintptr_t(intBegin);
|
||||
uintptr_t uintEnd = uintptr_t(intEnd);
|
||||
uintptr_t uintEnd2 = uintptr_t(intEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, uintBegin, uintEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd, uintBegin, uintEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidBegin, uintBegin, uintEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(voidEnd, uintBegin, uintEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(voidEnd2, uintBegin, uintEnd2));
|
||||
}
|
||||
|
||||
struct Base { int mX; };
|
||||
|
||||
static void
|
||||
TestIsInRangeClass()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
Base* baseBegin = nullptr;
|
||||
Base* baseEnd = baseBegin + 1;
|
||||
Base* baseEnd2 = baseBegin + 2;
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, baseBegin, baseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, baseEnd, baseEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, baseBegin, baseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, baseBegin, baseEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, baseBegin, baseEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, baseBegin, baseEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, baseBegin, baseEnd2));
|
||||
|
||||
uintptr_t ubaseBegin = uintptr_t(baseBegin);
|
||||
uintptr_t ubaseEnd = uintptr_t(baseEnd);
|
||||
uintptr_t ubaseEnd2 = uintptr_t(baseEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, ubaseBegin, ubaseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, ubaseEnd, ubaseEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, ubaseBegin, ubaseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, ubaseBegin, ubaseEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, ubaseBegin, ubaseEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, ubaseBegin, ubaseEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, ubaseBegin, ubaseEnd2));
|
||||
}
|
||||
|
||||
struct EmptyBase {};
|
||||
|
||||
static void
|
||||
TestIsInRangeEmptyClass()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
EmptyBase* baseBegin = nullptr;
|
||||
EmptyBase* baseEnd = baseBegin + 1;
|
||||
EmptyBase* baseEnd2 = baseBegin + 2;
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, baseBegin, baseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, baseEnd, baseEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, baseBegin, baseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, baseBegin, baseEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, baseBegin, baseEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, baseBegin, baseEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, baseBegin, baseEnd2));
|
||||
|
||||
uintptr_t ubaseBegin = uintptr_t(baseBegin);
|
||||
uintptr_t ubaseEnd = uintptr_t(baseEnd);
|
||||
uintptr_t ubaseEnd2 = uintptr_t(baseEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, ubaseBegin, ubaseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, ubaseEnd, ubaseEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, ubaseBegin, ubaseEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, ubaseBegin, ubaseEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, ubaseBegin, ubaseEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, ubaseBegin, ubaseEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, ubaseBegin, ubaseEnd2));
|
||||
}
|
||||
|
||||
struct Derived : Base {};
|
||||
|
||||
static void
|
||||
TestIsInRangeClassDerived()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
Derived* derivedBegin = nullptr;
|
||||
Derived* derivedEnd = derivedBegin + 1;
|
||||
Derived* derivedEnd2 = derivedBegin + 2;
|
||||
|
||||
Base* baseBegin = static_cast<Base*>(derivedBegin);
|
||||
Base* baseEnd = static_cast<Base*>(derivedEnd);
|
||||
Base* baseEnd2 = static_cast<Base*>(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, derivedEnd, derivedEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, derivedBegin, derivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, derivedBegin, derivedEnd2));
|
||||
|
||||
uintptr_t uderivedBegin = uintptr_t(derivedBegin);
|
||||
uintptr_t uderivedEnd = uintptr_t(derivedEnd);
|
||||
uintptr_t uderivedEnd2 = uintptr_t(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd, uderivedBegin, uderivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEnd, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd2, uderivedBegin, uderivedEnd2));
|
||||
}
|
||||
|
||||
struct DerivedEmpty : EmptyBase {};
|
||||
|
||||
static void
|
||||
TestIsInRangeClassDerivedEmpty()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
DerivedEmpty* derivedEmptyBegin = nullptr;
|
||||
DerivedEmpty* derivedEmptyEnd = derivedEmptyBegin + 1;
|
||||
DerivedEmpty* derivedEmptyEnd2 = derivedEmptyBegin + 2;
|
||||
|
||||
EmptyBase* baseBegin = static_cast<EmptyBase*>(derivedEmptyBegin);
|
||||
EmptyBase* baseEnd = static_cast<EmptyBase*>(derivedEmptyEnd);
|
||||
EmptyBase* baseEnd2 = static_cast<EmptyBase*>(derivedEmptyEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, derivedEmptyBegin, derivedEmptyEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, derivedEmptyEnd, derivedEmptyEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedEmptyBegin, derivedEmptyEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, derivedEmptyBegin, derivedEmptyEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedEmptyBegin, derivedEmptyEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, derivedEmptyBegin, derivedEmptyEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, derivedEmptyBegin, derivedEmptyEnd2));
|
||||
|
||||
uintptr_t uderivedEmptyBegin = uintptr_t(derivedEmptyBegin);
|
||||
uintptr_t uderivedEmptyEnd = uintptr_t(derivedEmptyEnd);
|
||||
uintptr_t uderivedEmptyEnd2 = uintptr_t(derivedEmptyEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEmptyBegin, uderivedEmptyBegin,
|
||||
uderivedEmptyEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEmptyEnd, uderivedEmptyBegin,
|
||||
uderivedEmptyEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEmptyBegin, uderivedEmptyBegin,
|
||||
uderivedEmptyEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEmptyEnd, uderivedEmptyBegin,
|
||||
uderivedEmptyEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEmptyEnd2, uderivedEmptyBegin,
|
||||
uderivedEmptyEnd2));
|
||||
}
|
||||
|
||||
struct ExtraDerived : Base { int y; };
|
||||
|
||||
static void
|
||||
TestIsInRangeClassExtraDerived()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
ExtraDerived* derivedBegin = nullptr;
|
||||
ExtraDerived* derivedEnd = derivedBegin + 1;
|
||||
ExtraDerived* derivedEnd2 = derivedBegin + 2;
|
||||
|
||||
Base* baseBegin = static_cast<Base*>(derivedBegin);
|
||||
Base* baseEnd = static_cast<Base*>(derivedEnd);
|
||||
Base* baseEnd2 = static_cast<Base*>(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, derivedEnd, derivedEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, derivedBegin, derivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, derivedBegin, derivedEnd2));
|
||||
|
||||
uintptr_t uderivedBegin = uintptr_t(derivedBegin);
|
||||
uintptr_t uderivedEnd = uintptr_t(derivedEnd);
|
||||
uintptr_t uderivedEnd2 = uintptr_t(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd, uderivedBegin, uderivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEnd, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd2, uderivedBegin, uderivedEnd2));
|
||||
}
|
||||
|
||||
struct ExtraDerivedEmpty : EmptyBase { int y; };
|
||||
|
||||
static void
|
||||
TestIsInRangeClassExtraDerivedEmpty()
|
||||
{
|
||||
void* nul = nullptr;
|
||||
ExtraDerivedEmpty* derivedBegin = nullptr;
|
||||
ExtraDerivedEmpty* derivedEnd = derivedBegin + 1;
|
||||
ExtraDerivedEmpty* derivedEnd2 = derivedBegin + 2;
|
||||
|
||||
EmptyBase* baseBegin = static_cast<EmptyBase*>(derivedBegin);
|
||||
EmptyBase* baseEnd = static_cast<EmptyBase*>(derivedEnd);
|
||||
EmptyBase* baseEnd2 = static_cast<EmptyBase*>(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(nul, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(nul, derivedEnd, derivedEnd2));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd, derivedBegin, derivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseBegin, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(baseEnd, derivedBegin, derivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(baseEnd2, derivedBegin, derivedEnd2));
|
||||
|
||||
uintptr_t uderivedBegin = uintptr_t(derivedBegin);
|
||||
uintptr_t uderivedEnd = uintptr_t(derivedEnd);
|
||||
uintptr_t uderivedEnd2 = uintptr_t(derivedEnd2);
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd, uderivedBegin, uderivedEnd));
|
||||
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedBegin, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(IsInRange(derivedEnd, uderivedBegin, uderivedEnd2));
|
||||
MOZ_RELEASE_ASSERT(!IsInRange(derivedEnd2, uderivedBegin, uderivedEnd2));
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
TestIsInRangeNonClass();
|
||||
TestIsInRangeVoid();
|
||||
TestIsInRangeClass();
|
||||
TestIsInRangeEmptyClass();
|
||||
TestIsInRangeClassDerived();
|
||||
TestIsInRangeClassDerivedEmpty();
|
||||
TestIsInRangeClassExtraDerived();
|
||||
TestIsInRangeClassExtraDerivedEmpty();
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue