types/serializer: add HasAttrNode binary encoding for ? operator

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ibfb89151eb80ab1ae1d8878b6849d2c96a6a6964
This commit is contained in:
raf 2026-02-21 22:51:16 +03:00
commit f4135a5dca
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
2 changed files with 12 additions and 4 deletions

View file

@ -271,7 +271,14 @@ struct Deserializer::Impl {
case NodeType::SELECT: { case NodeType::SELECT: {
auto expr = read_node(); auto expr = read_node();
auto attr = read_node(); auto attr = read_node();
return std::make_shared<Node>(SelectNode(expr, attr, line)); uint8_t has_default = read_u8();
std::optional<std::shared_ptr<Node>> default_expr;
if (has_default) {
default_expr = read_node();
}
SelectNode select_node(expr, attr, line);
select_node.default_expr = default_expr;
return std::make_shared<Node>(std::move(select_node));
} }
case NodeType::HAS_ATTR: { case NodeType::HAS_ATTR: {
auto expr = read_node(); auto expr = read_node();

View file

@ -14,7 +14,7 @@
namespace nix_irc { namespace nix_irc {
constexpr uint32_t IR_MAGIC = 0x4E495258; constexpr uint32_t IR_MAGIC = 0x4E495258;
constexpr uint32_t IR_VERSION = 1; constexpr uint32_t IR_VERSION = 2;
enum class NodeType : uint8_t { enum class NodeType : uint8_t {
CONST_INT = 0x01, CONST_INT = 0x01,
@ -29,8 +29,8 @@ enum class NodeType : uint8_t {
UNARY_OP = 0x23, UNARY_OP = 0x23,
ATTRSET = 0x30, ATTRSET = 0x30,
SELECT = 0x31, SELECT = 0x31,
HAS_ATTR = 0x32, HAS_ATTR = 0x34,
WITH = 0x33, WITH = 0x32,
IF = 0x40, IF = 0x40,
LET = 0x50, LET = 0x50,
LETREC = 0x51, LETREC = 0x51,
@ -94,6 +94,7 @@ struct LambdaNode {
uint32_t arity = 1; uint32_t arity = 1;
std::shared_ptr<Node> body; std::shared_ptr<Node> body;
std::optional<std::string> param_name; std::optional<std::string> param_name;
bool strict_pattern = true;
uint32_t line = 0; uint32_t line = 0;
LambdaNode(uint32_t a, std::shared_ptr<Node> b, uint32_t l = 0); LambdaNode(uint32_t a, std::shared_ptr<Node> b, uint32_t l = 0);
}; };