From 8fb17e8f3febf3cfa56f5ce34f8d28cc0b2b4618 Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Mon, 8 Apr 2024 23:08:46 +0800 Subject: [PATCH] libnixt: allow eval decoded expression (#388) --- libnixt/meson.build | 7 +++- libnixt/tools/meson.build | 1 - .../{nixt-decode/Main.cpp => nixt-decode.cpp} | 32 +++++++++++++++++-- libnixt/tools/nixt-decode/meson.build | 5 --- 4 files changed, 36 insertions(+), 9 deletions(-) delete mode 100644 libnixt/tools/meson.build rename libnixt/tools/{nixt-decode/Main.cpp => nixt-decode.cpp} (50%) delete mode 100644 libnixt/tools/nixt-decode/meson.build diff --git a/libnixt/meson.build b/libnixt/meson.build index 78f02d79c..6b3460257 100644 --- a/libnixt/meson.build +++ b/libnixt/meson.build @@ -40,7 +40,12 @@ libnixt_test_exe = executable( dependencies: [ gtest_main, nixt ] ) -subdir('tools') +nixt_decode = executable( + 'nixt-decode', + 'tools/nixt-decode.cpp', + dependencies: [ nixt ], + install: true +) test( 'unit/libnixt', diff --git a/libnixt/tools/meson.build b/libnixt/tools/meson.build deleted file mode 100644 index cd4b50ae0..000000000 --- a/libnixt/tools/meson.build +++ /dev/null @@ -1 +0,0 @@ -subdir('nixt-decode') diff --git a/libnixt/tools/nixt-decode/Main.cpp b/libnixt/tools/nixt-decode.cpp similarity index 50% rename from libnixt/tools/nixt-decode/Main.cpp rename to libnixt/tools/nixt-decode.cpp index 8345486df..d2485e427 100644 --- a/libnixt/tools/nixt-decode/Main.cpp +++ b/libnixt/tools/nixt-decode.cpp @@ -3,7 +3,24 @@ #include "nixt/InitEval.h" #include "nixt/PtrPool.h" -int main() { +namespace { + +// --eval, -e +// Should we perform eval? +bool Eval = false; + +void parseArgs(int Argc, const char *Argv[]) { + for (int I = 0; I < Argc; I++) { + std::string_view Arg(Argv[I]); + if (Arg == "--eval" || Arg == "-e") + Eval = true; + } +} + +} // namespace + +int main(int Argc, const char *Argv[]) { + parseArgs(Argc, Argv); nixt::initEval(); std::unique_ptr State( new nix::EvalState{{}, nix::openStore("dummy://")}); @@ -24,7 +41,18 @@ int main() { auto *AST = nixt::deserializeHookable(Data, Ctx, Pool, VMap, EMap); - AST->show(State->symbols, std::cout); + if (Eval) { + try { + AST->bindVars(*State, State->staticBaseEnv); + nix::Value V; + State->eval(AST, V); + V.print(State->symbols, std::cout); + } catch (nix::BaseError &E) { + std::cerr << E.what() << "\n"; + } + } else { + AST->show(State->symbols, std::cout); + } return 0; } diff --git a/libnixt/tools/nixt-decode/meson.build b/libnixt/tools/nixt-decode/meson.build deleted file mode 100644 index 4f066f78e..000000000 --- a/libnixt/tools/nixt-decode/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -executable('nixt-decode', - 'Main.cpp', - install: true, - dependencies: [ nixt ] -)