mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
move DiverseList and DiverseStack to swift/Basic, out of IRGen.
Swift SVN r2784
This commit is contained in:
70
lib/Basic/DiverseStack.cpp
Normal file
70
lib/Basic/DiverseStack.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
//===--- DiverseStack.cpp - Out-of-line code for the heterogenous stack ---===//
|
||||
//
|
||||
// This source file is part of the Swift.org open source project
|
||||
//
|
||||
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
|
||||
// Licensed under Apache License v2.0 with Runtime Library Exception
|
||||
//
|
||||
// See http://swift.org/LICENSE.txt for license information
|
||||
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the small amount of code for the heterogenous
|
||||
// stack and list classes.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "swift/Basic/DiverseList.h"
|
||||
#include "swift/Basic/DiverseStack.h"
|
||||
using namespace swift;
|
||||
|
||||
void DiverseStackBase::pushNewStorageSlow(std::size_t needed) {
|
||||
bool wasInline = isAllocatedInline();
|
||||
|
||||
std::size_t capacity = End - Allocated;
|
||||
std::size_t requiredCapacity = capacity + needed;
|
||||
do {
|
||||
capacity = 2 * capacity + 16;
|
||||
} while (capacity < requiredCapacity);
|
||||
|
||||
assert(capacity % 16 == 0 && "not allocating multiple of alignment");
|
||||
|
||||
char *oldAllocation = Allocated;
|
||||
char *oldBegin = Begin;
|
||||
std::size_t oldSize = (std::size_t) (End - oldBegin);
|
||||
|
||||
Allocated = new char[capacity];
|
||||
End = Allocated + capacity;
|
||||
Begin = End - oldSize;
|
||||
std::memcpy(Begin, oldBegin, oldSize);
|
||||
|
||||
Begin -= needed;
|
||||
|
||||
if (!wasInline) delete[] oldAllocation;
|
||||
}
|
||||
|
||||
char *DiverseListBase::addNewStorageSlow(std::size_t needed) {
|
||||
bool wasInline = isAllocatedInline();
|
||||
|
||||
std::size_t capacity = EndOfAllocation - Begin;
|
||||
std::size_t requiredCapacity = capacity + needed;
|
||||
do {
|
||||
capacity = 2 * capacity + 16;
|
||||
} while (capacity < requiredCapacity);
|
||||
|
||||
assert(capacity % 16 == 0 && "not allocating multiple of alignment");
|
||||
|
||||
char *oldBegin = Begin;
|
||||
char *oldEnd = End;
|
||||
std::size_t oldSize = (std::size_t) (oldEnd - oldBegin);
|
||||
|
||||
Begin = new char[capacity];
|
||||
EndOfAllocation = Begin + capacity;
|
||||
End = Begin + oldSize + needed;
|
||||
std::memcpy(Begin, oldBegin, oldSize);
|
||||
|
||||
if (!wasInline) delete[] oldBegin;
|
||||
|
||||
return Begin + oldSize;
|
||||
}
|
||||
Reference in New Issue
Block a user