Skip to content

Commit

Permalink
libnixt: omit AST header in Deserialize
Browse files Browse the repository at this point in the history
  • Loading branch information
inclyc committed Mar 14, 2024
1 parent 3a8fc1f commit 330850a
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 36 deletions.
22 changes: 20 additions & 2 deletions libnixt/include/nixt/Deserialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,37 @@
#include "HookExpr.h"
#include "PtrPool.h"

#include <nix/input-accessor.hh>
#include <nix/nixexpr.hh>

#include <string_view>

namespace nixt {

/// \brief API Wrapper around nix::
///
/// Paths related to this context is very unstable.
struct DeserializeContext {
PtrPool<nix::Expr> &Pool;
nix::SymbolTable &STable;
nix::PosTable &PTable;

/// Path resolution
const nix::SourcePath BasePath;
const nix::ref<nix::InputAccessor> RootFS;

const nix::Pos::Origin &Origin;
};

/// \brief Stable API wrapper around official nix.
///
/// Because of "lazy-trees", these APIs have always breaked among nix updates,
/// the function wraps the context with a "stable" class `nix::EvalState`.
DeserializeContext getDeserializeContext(nix::EvalState &State,
std::string_view BasePath,
const nix::Pos::Origin &Origin);

nix::Expr *deserializeHookable(std::string_view &Data, DeserializeContext &Ctx,
ValueMap &VMap, EnvMap &EMap);
PtrPool<nix::Expr> &Pool, ValueMap &VMap,
EnvMap &EMap);

} // namespace nixt
54 changes: 23 additions & 31 deletions libnixt/lib/ASTReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,19 @@

#include <bc/Read.h>

#include <memory>
#include <nix/eval.hh>
#include <nix/fs-input-accessor.hh>

namespace nixt {

using namespace nixbc;
using bc::readBytecode;

nix::Expr *ASTDeserializer::eatHookable(std::string_view &Data, ValueMap &VMap,
EnvMap &EMap) {
auto Kind = eat<ExprKind>(Data);
switch (Kind) {
auto Hdr = eat<NodeHeader>(Data);
switch (Hdr.Kind) {
case EK_Int: {
auto Handle = eat<std::uintptr_t>(Data);
return Ctx.Pool.record(
new HookExprInt(eatExprInt(Data), VMap, EMap, Handle));
return Pool.record(
new HookExprInt(eatExprInt(Data), VMap, EMap, Hdr.Handle));
}
default:
break;
Expand All @@ -41,32 +39,26 @@ nix::ExprInt ASTDeserializer::eatExprInt(std::string_view &Data) {
return {eat<NixInt>(Data)};
}

nix::Expr *deserializeHookable(std::string_view &Data, DeserializeContext &Ctx,
ValueMap &VMap, EnvMap &EMap) {
FileHeader Hdr;
readBytecode(Data, Hdr);
assert(Hdr.Magic == FileHeader::MagicValue && "Invalid magic value");
assert(Hdr.Version == 1 && "Invalid version value");
DeserializeContext getDeserializeContext(nix::EvalState &State,
std::string_view BasePath,
const nix::Pos::Origin &Origin) {
auto Base = State.rootPath(nix::CanonPath(BasePath));
const nix::ref<nix::InputAccessor> RootFS = State.rootFS;

// Deserialize "Origin"
Origin::OriginKind Kind;
readBytecode(Data, Kind);
nix::Pos::Origin O;
switch (Kind) {
case Origin::OK_Path: {
OriginPath Path;
readBytecode(Data, Path);
// TODO
break;
}
case Origin::OK_None:
case Origin::OK_Stdin:
case Origin::OK_String:
break;
}
// Filling the context.
// These are required for constructing evaluable nix ASTs
return {.STable = State.symbols,
.PTable = State.positions,
.BasePath = Base,
.RootFS = RootFS,
.Origin = Origin};
}

nix::Expr *deserializeHookable(std::string_view &Data, DeserializeContext &Ctx,
PtrPool<nix::Expr> &Pool, ValueMap &VMap,
EnvMap &EMap) {
// Deserialize "Hookable"
ASTDeserializer D(Ctx, O);
ASTDeserializer D(Ctx, Pool);
return D.eatHookable(Data, VMap, EMap);
}

Expand Down
6 changes: 3 additions & 3 deletions libnixt/lib/ASTReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ namespace nixt {

class ASTDeserializer {
DeserializeContext &Ctx;
[[maybe_unused]] nix::Pos::Origin &Origin;
PtrPool<nix::Expr> &Pool;

template <class T> T eat(std::string_view &Data) { return bc::eat<T>(Data); }

public:
ASTDeserializer(DeserializeContext &Ctx, nix::Pos::Origin &Origin)
: Ctx(Ctx), Origin(Origin) {}
ASTDeserializer(DeserializeContext &Ctx, PtrPool<nix::Expr> &Pool)
: Ctx(Ctx), Pool(Pool) {}

nix::Expr *eatHookable(std::string_view &Data, ValueMap &VMap, EnvMap &EMap);

Expand Down

0 comments on commit 330850a

Please sign in to comment.