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: {
auto expr = 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: {
auto expr = read_node();

View file

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