managarm / frigg Goto Github PK
View Code? Open in Web Editor NEWLightweight C++ utilities and algorithms for system programming
License: MIT License
Lightweight C++ utilities and algorithms for system programming
License: MIT License
Currently, if unwrap
fails, it simply triggers an assertion failure, which provides no indication as to what happened.
xinit
uses %h
during startup in some print statement. I haven't been able to identify which, what or when. The following is logged in E9.
mlibc: Unknown printf terminator '104'
While this behavior is probably fine, it would be desirable to be able to chain expecteds for monadic operations.
For an example of such see Haskell's Either
-- Module : Data.Either
-- Copyright : (c) The University of Glasgow 2001
-- License : BSD-style (see the file libraries/base/LICENSE)
-- | @since 4.4.0.0
instance Monad (Either e) where
Left l >>= _ = Left l
Right r >>= k = k r
In essence, this means that >>=
propagates error and does not evaluate k
(type: a -> Either e b
) unless the Either
is a Right
(success case)
EDIT: similarly, there's no way to implicitly convert to a different expected result of same error (one would have to do if (!e) { {co_}return e.error(); }
)
(In formatting.hpp, do_printf_chars)
case 'c': FRG_ASSERT(!opts.fill_zeros); FRG_ASSERT(!opts.left_justify); FRG_ASSERT(!opts.alt_conversion); ---->FRG_ASSERT(szmod == printf_size_mod::default_size);
Fails when running Python 3.8
While running nyancat
on Managarm, the following assertion failure message is printed continuously:
../../../src/mlibc/subprojects/frigg/include/frg/formatting.hpp:231: Assertion 'padding == ' '' failed!
Relevant code snippet for context:
template<typename P, typename T>
void print_float(P &formatter, T number, int width = 0, int precision = 6,
char padding = ' ', bool left_justify = false, bool use_capitals = false,
bool group_thousands = false, locale_options locale_opts = {}) {
(void)group_thousands;
FRG_DEBUG_ASSERT(padding == ' '); // <-- This assert fails
bool has_sign = false;
if (number < 0) {
formatter.append('-');
has_sign = true;
}
bool inf = __builtin_isinf(number), nan = __builtin_isnan(number);
if (inf || nan) {
auto total_length = 3 + has_sign;
auto pad_length = width > total_length ? width - total_length : 0;
if (!left_justify) {
while (pad_length > 0) {
formatter.append(padding);
pad_length--;
}
}
if (inf)
formatter.append(use_capitals ? "INF" : "inf");
else
formatter.append(use_capitals ? "NAN" : "nan");
if (left_justify) {
while (pad_length > 0) {
formatter.append(padding);
pad_length--;
}
}
return;
}
The old frigg
had a nice priority queue based on binary heaps (source code). Import it into this repository.
The following program fails to compile:
#include <frg/array.hpp>
class ConstArrayTest
{
public:
const int *data() const
{
return arr_.data();
}
private:
frg::array<int, 5> arr_;
};
ConstArrayTest<int> t;
include/frg/array.hpp:74:30: error: invalid conversion from ‘const value_type*’ {aka ‘const int*’} to ‘int*’ [-fpermissive]
74 | return &_stor[0];
| ~~~~~^
| |
| const value_type* {aka const int*}
This seems to be because in array.hpp
the return type of array::data() const
is marked constexpr
but not const
(constexpr
makes the pointer type const
, but not the pointed-to value).
constexpr T* data() const noexcept {
// ^
// |
// should be constexpr const T*!
return &_stor[0];
}
I'm not sure why it works when templated, though.
// compiles no problem
template <typename T>
class ConstArrayTest
{
public:
const T *data() const
{
return arr_.data();
}
private:
frg::array<T, 5> arr_;
};
ConstArrayTest<int> t;
Both examples compile with the GNU implementation of the C++ Standard Library, which does declare the return type const
:
_GLIBCXX17_CONSTEXPR const_pointer
data() const noexcept
{ return _AT_Type::_S_ptr(_M_elems); }
Currently, this makes downstream CI fail: https://github.com/managarm/managarm/runs/6953595720
%g
, %G
, %e
, %E
are unimplemented, which breaks Xash3D.
While testing out the fixes for #14, I ran into the following problem
../../../src/mlibc/subprojects/frigg/include/frg/printf.hpp:57: Assertion 'opts->arg_pos <= vsp->num_args' failed!
Tested with the --help
commands of:
mount
,fdisk
,choom
,findmnt
,flock
,getopt
,mountpoint
,renice
,umount
,agetty
,cfdisk
,losetup
,sfdisk
,zramctl
.Certain basic_string operations (such as comparisons) can be implemented in terms of basic_string_view: e.g.:
bool operator==(const basic_string &other) const {
return basic_string_view<Char>{_buffer, _length} == basic_string_view<Char>{other._buffer, other._length};
}
We could also add a convenience basic_string::view()
method that does the view construction.
Doing this will allow us to more easily prevent bugs like the one fixed by 264af2d.
The following applications from util-linux
use $
while printing their help message.
mount
,fdisk
,choom
,findmnt
,flock
,getopt
,mountpoint
,renice
,umount
,agetty
,cfdisk
,losetup
,sfdisk
,zramctl
.The following is logged in E9 for all of them.
mlibc: Unknown printf terminator '36'
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.