Skip to content

Commit

Permalink
capturing stack for exceptions that have been caught and rethrown via…
Browse files Browse the repository at this point in the history
… exception_ptr; refactoring
  • Loading branch information
alabuzhev committed Sep 9, 2017
1 parent 72cd832 commit 242fe72
Show file tree
Hide file tree
Showing 49 changed files with 799 additions and 1,117 deletions.
377 changes: 103 additions & 274 deletions far/PluginA.cpp

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions far/blob_builder.hpp
Expand Up @@ -55,23 +55,23 @@ class blob_builder
return *this;
}

blob_view get() const
bytes_view get() const
{
if (m_Data.empty() || (m_Signature && m_Data.size() == 1))
{
return {};
return { nullptr, 0 };
}

if (m_CodePage == CP_UNICODE)
{
return make_blob_view(m_Data.data(), m_Data.size() * sizeof(wchar_t));
return bytes_view(m_Data.data(), m_Data.size() * sizeof(wchar_t));
}

if (m_Buffer.empty())
{
m_Buffer = encoding::get_bytes(m_CodePage, m_Data);
}
return make_blob_view(m_Buffer.data(), m_Buffer.size());
return bytes_view(m_Buffer.data(), m_Buffer.size());
}

private:
Expand Down
2 changes: 1 addition & 1 deletion far/cddrv.cpp
Expand Up @@ -405,7 +405,7 @@ UINT FAR_GetDriveType(const string& RootDir, DWORD Detect)
else
{
constexpr auto UncDevicePrefix = L"\\\\.\\"_sv;
VolumePath.insert(0, UncDevicePrefix.data(), UncDevicePrefix.size());
VolumePath.insert(0, UncDevicePrefix.raw_data(), UncDevicePrefix.size());
}

if(const auto Device = os::fs::file(VolumePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, nullptr, OPEN_EXISTING))
Expand Down
6 changes: 6 additions & 0 deletions far/changelog
@@ -1,3 +1,9 @@
drkns 09.09.2017 22:00:37 +0100 - build 5026

1. Записываем стек и для тех исключений, которые были пойманы и переброшены через exception_ptr.

2. Рефакторинг.

drkns 09.09.2017 17:32:31 +0100 - build 5025

1. 0003485: Exception при попытке просмотра некорректного? hlf
Expand Down
4 changes: 2 additions & 2 deletions far/clipboard.cpp
Expand Up @@ -282,7 +282,7 @@ bool clipboard::SetText(const string_view& Str)
if (!Clear())
return false;

auto hData = os::memory::global::copy(Str.data(), Str.size());
auto hData = os::memory::global::copy(Str.raw_data(), Str.size());
if (!hData)
return false;

Expand Down Expand Up @@ -402,7 +402,7 @@ bool clipboard::GetHDROPAsText(string& data) const
{
for (const auto& i: enum_substrings(StartA))
{
append(data, encoding::ansi::get_chars(i.data(), i.size()), L"\r\n"_sv);
append(data, encoding::ansi::get_chars(i), L"\r\n"_sv);
}
}

Expand Down
2 changes: 1 addition & 1 deletion far/common.hpp
Expand Up @@ -58,7 +58,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "common/enum_substrings.hpp"
#include "common/string_utils.hpp"
#include "common/zip_view.hpp"
#include "common/blob_view.hpp"
#include "common/bytes_view.hpp"
#include "common/singleton.hpp"

// TODO: clean up & split
Expand Down
66 changes: 40 additions & 26 deletions far/common/blob_view.hpp → far/common/bytes_view.hpp
@@ -1,9 +1,9 @@
#ifndef BLOB_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
#define BLOB_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
#ifndef BYTES_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
#define BYTES_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
#pragma once

/*
blob_view.hpp
bytes_view.hpp
*/
/*
Copyright © 2016 Far Group
Expand Down Expand Up @@ -32,21 +32,46 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

using blob_view = range<const char*>;
class bytes_view: public range<const char*>
{
public:
bytes_view(const void* Data, size_t Size):
range<const char*>(reinterpret_cast<const char*>(Data), reinterpret_cast<const char*>(Data) + Size)
{
}

template<typename T>
explicit bytes_view(T& Object):
bytes_view(&Object, sizeof(Object))
{
static_assert(std::is_trivially_copyable<T>::value);
}
};

class writable_blob_view: public range<char*>
class bytes: public range<char*>
{
public:
NONCOPYABLE(writable_blob_view);
writable_blob_view() = default;
writable_blob_view(void* Data, size_t Size): range<char*>(reinterpret_cast<char*>(Data), reinterpret_cast<char*>(Data) + Size) {}
~writable_blob_view()
NONCOPYABLE(bytes);
MOVABLE(bytes);

bytes() = default;

bytes(void* Data, size_t Size): range<char*>(reinterpret_cast<char*>(Data), reinterpret_cast<char*>(Data) + Size) {}

template<typename T>
explicit bytes(T& Object):
bytes(&Object, sizeof(Object))
{
if (m_Allocated)
static_assert(std::is_trivially_copyable<T>::value);
}

~bytes()
{
if (*m_Allocated)
delete[] static_cast<const char*>(data());
}

writable_blob_view& operator=(const blob_view& rhs)
auto& operator=(const bytes_view& rhs)
{
if (data())
{
Expand All @@ -56,25 +81,14 @@ class writable_blob_view: public range<char*>
else
{
static_cast<range<char*>&>(*this) = make_range(new char[rhs.size()], rhs.size());
m_Allocated = true;
*m_Allocated = true;
}
memcpy(data(), rhs.data(), size());
return *this;
}

private:
bool m_Allocated{};
movable<bool> m_Allocated{ false };
};

inline auto make_blob_view(const void* Object, size_t Size)
{
return make_range(reinterpret_cast<const char*>(Object), Size);
}

template<typename T>
auto make_blob_view(const T& Object)
{
static_assert(std::is_pod<T>::value);
return make_blob_view(&Object, sizeof Object);
}

#endif // BLOB_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
#endif // BYTES_VIEW_HPP_3707377A_7C4B_4B2E_89EC_6411A1988FB3
10 changes: 5 additions & 5 deletions far/common/string_utils.hpp
Expand Up @@ -51,7 +51,7 @@ class null_terminated_t
{
public:
explicit null_terminated_t(const basic_string_view<T>& Str):
m_Terminated(Str.data()[Str.size()] == 0)
m_Terminated(!Str.raw_data()[Str.size()])
{
if (m_Terminated)
placement::construct(m_View, Str);
Expand All @@ -69,7 +69,7 @@ class null_terminated_t

auto data() const
{
return m_Terminated? m_View.data() : m_Str.data();
return m_Terminated? m_View.raw_data() : m_Str.data();
}

auto size() const
Expand All @@ -95,7 +95,7 @@ namespace detail
inline void append_one(string& Str, wchar_t Arg, size_t) { Str += Arg; }
inline void append_one(string& Str, const wchar_t* Arg, size_t Size) { Str.append(Arg, Size); }
inline void append_one(string& Str, const string& Arg, size_t) { Str += Arg; }
inline void append_one(string& Str, const string_view& Arg, size_t) { Str.append(Arg.data(), Arg.size()); }
inline void append_one(string& Str, const string_view& Arg, size_t) { Str.append(Arg.raw_data(), Arg.size()); }

inline void append_impl(string&, const size_t*) {}

Expand Down Expand Up @@ -284,12 +284,12 @@ inline bool equal(const string_view& Str1, const string_view& Str2)

inline bool starts_with(const string_view& Str, const string_view& Prefix)
{
return Str.size() >= Prefix.size() && equal({ Str.data(), Prefix.size() }, Prefix);
return Str.size() >= Prefix.size() && equal({ Str.raw_data(), Prefix.size() }, Prefix);
}

inline bool ends_with(const string_view& Str, const string_view& Suffix)
{
return Str.size() >= Suffix.size() && equal({ Str.data() + Str.size() - Suffix.size(), Suffix.size() }, Suffix);
return Str.size() >= Suffix.size() && equal({ Str.raw_data() + Str.size() - Suffix.size(), Suffix.size() }, Suffix);
}

inline bool contains(const string_view& Str, const string_view& Token)
Expand Down
36 changes: 31 additions & 5 deletions far/common/string_view.hpp
Expand Up @@ -56,8 +56,34 @@ class basic_string_view: public range<const T*>
{
}

constexpr basic_string_view substr(size_t Pos = 0, size_t Count = std::basic_string<T>::npos) const
{
return { this->raw_data() + Pos, std::min(Count, this->size() - Pos) };
}

/*
ISO/IEC N4659 24.4.2.4 771
"Note: Unlike basic_string::data() and string literals, data() may return a pointer to a buffer that
is not null-terminated. Therefore it is typically a mistake to pass data() to a function that takes just a
const charT* and expects a null-terminated string."
- Another splendid design decision from the committee.
If it's "typically a mistake", why didn't you give some other, "less-similar-to-basic_string::data()" name?
For now, our implementation intentionally does not provide data() member function -
we heavily rely on the platform API which requires C strings in about 99% of the cases and it's too easy to make a mistake
and "rescue the Princess, her dog, her entire wardrobe & everything she has ever eaten...".
Hopefully we will thin out C strings numbers enough by the time we switch to a C++17-conformant compiler.
*/
constexpr auto data() const = delete;
constexpr auto raw_data() const
{
return range<const T*>::data();
}

private:
static size_t length(const T* Str) { auto Ptr = Str; while (*Ptr) ++Ptr; return Ptr - Str; }
static auto length(const char* Str) { return strlen(Str); }
static auto length(const wchar_t* Str) { return wcslen(Str); }
};

constexpr auto operator "" _sv(const char* Data, size_t Size) noexcept { return basic_string_view<char>(Data, Size); }
Expand All @@ -68,23 +94,23 @@ auto operator+(const std::basic_string<T>& Lhs, const basic_string_view<T>& Rhs)
{
std::basic_string<T> Result;
Result.reserve(Lhs.size() + Rhs.size());
return Result.append(Lhs).append(Rhs.data(), Rhs.size());
return Result.append(Lhs).append(Rhs.raw_data(), Rhs.size());
}

template<typename T>
auto operator+(const basic_string_view<T>& Lhs, const std::basic_string<T>& Rhs)
{
std::basic_string<T> Result;
Result.reserve(Lhs.size() + Rhs.size());
return Result.append(Lhs.data(), Lhs.size()).append(Rhs);
return Result.append(Lhs.raw_data(), Lhs.size()).append(Rhs);
}

template<typename T>
auto operator+(const basic_string_view<T>& Lhs, const basic_string_view<T>& Rhs)
{
std::basic_string<T> Result;
Result.reserve(Lhs.size() + Rhs.size());
return Result.append(Lhs.data(), Lhs.size()).append(Rhs.data(), Rhs.size());
return Result.append(Lhs.raw_data(), Lhs.size()).append(Rhs.raw_data(), Rhs.size());
}

template<typename T>
Expand All @@ -108,7 +134,7 @@ bool operator==(const std::basic_string<T>& Lhs, const basic_string_view<T>& Rhs
template<typename T>
std::basic_string<T> make_string(const basic_string_view<T>& View)
{
return { View.data(), View.size() };
return { View.raw_data(), View.size() };
}

template<typename T>
Expand Down
8 changes: 2 additions & 6 deletions far/config.cpp
Expand Up @@ -219,19 +219,15 @@ void Options::TreeSettings()
{
DialogBuilder Builder(lng::MConfigTreeTitle, L"TreeSettings");

DialogItemEx *TemplateEdit;

Builder.AddCheckbox(lng::MConfigTreeAutoChange, Tree.AutoChangeFolder);

TemplateEdit = Builder.AddIntEditField(Tree.MinTreeCount, 3);
auto TemplateEdit = Builder.AddIntEditField(Tree.MinTreeCount, 3);
Builder.AddTextBefore(TemplateEdit, lng::MConfigTreeLabelMinFolder);

#if defined(TREEFILE_PROJECT)
DialogItemEx *Checkbox;

Builder.AddSeparator(lng::MConfigTreeLabel1);

Checkbox = Builder.AddCheckbox(lng::MConfigTreeLabelLocalDisk, Tree.LocalDisk);
auto Checkbox = Builder.AddCheckbox(lng::MConfigTreeLabelLocalDisk, Tree.LocalDisk);
TemplateEdit = Builder.AddEditField(Tree.strLocalDisk, 44);
TemplateEdit->Indent(4);
Builder.LinkFlags(Checkbox, TemplateEdit, DIF_DISABLE);
Expand Down

0 comments on commit 242fe72

Please sign in to comment.