types/serializer: add HasAttrNode binary encoding for ? operator
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: Ibfb89151eb80ab1ae1d8878b6849d2c96a6a6964
This commit is contained in:
parent
3441853eef
commit
f4135a5dca
2 changed files with 12 additions and 4 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue