aboutsummaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
Diffstat (limited to 'boot')
-rw-r--r--boot/evaluator.cc93
-rw-r--r--boot/result.cc6
-rw-r--r--boot/symbol.cc12
3 files changed, 54 insertions, 57 deletions
diff --git a/boot/evaluator.cc b/boot/evaluator.cc
index 56ba270..afa72db 100644
--- a/boot/evaluator.cc
+++ b/boot/evaluator.cc
@@ -231,6 +231,10 @@ namespace elna::boot
{
return constant_value{ std::nullptr_t{} };
}
+ else if (is_string_type(decoration))
+ {
+ return constant_value{ static_cast<literal<std::string>&>(subject).value };
+ }
return std::nullopt;
}
@@ -356,72 +360,59 @@ namespace elna::boot
std::optional<constant_value> evaluator::evaluate_unary(unary_expression& subject)
{
- if (subject.operation() == unary_operator::reference)
- {
- if (auto *designator = subject.operand().is_designator())
- {
- if (auto *named = designator->is_named())
- {
- return constant_value{ global_address{ .name = named->name } };
- }
- }
- return std::nullopt;
- }
auto operand = evaluate(subject.operand());
if (!operand)
{
return std::nullopt;
}
- if (subject.operation() == unary_operator::minus)
+ switch (subject.operation())
{
- return std::visit([](auto&& value) -> std::optional<constant_value> {
- using T = std::decay_t<decltype(value)>;
+ using enum unary_operator;
+ case minus:
+ return std::visit([](auto&& value) -> std::optional<constant_value> {
+ using T = std::decay_t<decltype(value)>;
- if constexpr (std::is_same_v<T, integer_literal>)
- {
- if (auto result = value.neg())
+ if constexpr (std::is_same_v<T, integer_literal>)
+ {
+ if (auto result = value.neg())
+ {
+ return constant_value{ result.value() };
+ }
+ return std::nullopt;
+ }
+ if constexpr (std::is_same_v<T, double>)
{
- return constant_value{ result.value() };
+ return constant_value{ -value };
}
return std::nullopt;
- }
- if constexpr (std::is_same_v<T, double>)
- {
- return constant_value{ -value };
- }
- return std::nullopt;
- }, operand.value());
- }
- if (subject.operation() == unary_operator::logical_negation)
- {
- return std::visit([](const auto& value) -> std::optional<constant_value> {
- using T = std::decay_t<decltype(value)>;
+ }, operand.value());
+ case logical_negation:
+ return std::visit([](const auto& value) -> std::optional<constant_value> {
+ using T = std::decay_t<decltype(value)>;
- if constexpr (std::is_same_v<T, bool>)
- {
- return constant_value{ !value };
- }
- return std::nullopt;
- }, operand.value());
- }
- if (subject.operation() == unary_operator::bitwise_negation)
- {
- return std::visit([](const auto& value) -> std::optional<constant_value> {
- using T = std::decay_t<decltype(value)>;
+ if constexpr (std::is_same_v<T, bool>)
+ {
+ return constant_value{ !value };
+ }
+ return std::nullopt;
+ }, operand.value());
+ case bitwise_negation:
+ return std::visit([](const auto& value) -> std::optional<constant_value> {
+ using T = std::decay_t<decltype(value)>;
- if constexpr (std::is_same_v<T, integer_literal>)
- {
- return constant_value{ ~value };
- }
+ if constexpr (std::is_same_v<T, integer_literal>)
+ {
+ return constant_value{ ~value };
+ }
+ return std::nullopt;
+ }, operand.value());
+ case plus:
+ return operand;
+ case negation:
+ case reference:
return std::nullopt;
- }, operand.value());
}
- if (subject.operation() == unary_operator::plus)
- {
- return operand;
- }
- return std::nullopt;
}
template<typename T>
diff --git a/boot/result.cc b/boot/result.cc
index f769625..b56046b 100644
--- a/boot/result.cc
+++ b/boot/result.cc
@@ -443,12 +443,6 @@ std::size_t std::hash<elna::boot::identifier>::operator()(
return std::hash<std::string>{}(key.name());
}
-std::size_t std::hash<elna::boot::global_address>::operator()(
- const elna::boot::global_address& key) const noexcept
-{
- return std::hash<std::string>{}(key.name);
-}
-
std::size_t std::hash<elna::boot::constant_aggregate<std::vector>>::operator()(
const elna::boot::constant_aggregate<std::vector>& key) const noexcept
{
diff --git a/boot/symbol.cc b/boot/symbol.cc
index a51ee01..6172621 100644
--- a/boot/symbol.cc
+++ b/boot/symbol.cc
@@ -456,6 +456,18 @@ namespace elna::boot
|| checked.get<enumeration_type>() != nullptr;
}
+ bool is_string_type(const type& checked)
+ {
+ if (auto slice = checked.get<slice_type>())
+ {
+ if (auto base = resolve_aliases(slice->base).get<constant_type>())
+ {
+ return is_primitive_type(resolve_aliases(base->unqualified), "Char");
+ }
+ }
+ return false;
+ }
+
type get_range_base_type(const type& range)
{
if (auto array = range.get<array_type>())