Skip to content

Commit 90ecfbe

Browse files
committed
Update to Nix 2.13.2
1 parent fbc8490 commit 90ecfbe

File tree

4 files changed

+31
-27
lines changed

4 files changed

+31
-27
lines changed

default.nix

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
{
2-
pkgs ? (import <nixpkgs> {}).pkgs
2+
nixpkgs ? fetchTarball {
3+
url = "https://github.com/NixOS/nixpkgs/archive/1badc6db75d797f53c77d18d89c4eb8616d205cc.tar.gz";
4+
sha256 = "0rwrlfgwhb839r1vs08vbs80l99c2m7n7vvjb80kihvb3fy10wkb";
5+
},
6+
pkgs ? (import nixpkgs {}).pkgs
37
}:
48

59
with pkgs;

src/eval.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ static PyObject *_eval(const char *expression, PyObject *vars) {
2525
if (!staticEnv) {
2626
return nullptr;
2727
}
28+
auto staticEnvPointer = std::make_shared<nix::StaticEnv>(*staticEnv);
2829

29-
auto e = state.parseExprFromString(expression, ".", *staticEnv);
30+
auto e = state.parseExprFromString(expression, ".", staticEnvPointer);
3031
nix::Value v;
3132
e->eval(state, *env, v);
3233

@@ -40,6 +41,8 @@ PyObject *eval(PyObject *self, PyObject *args, PyObject *keywds) {
4041
const char *expression = nullptr;
4142
PyObject *vars = nullptr;
4243

44+
nix::initLibStore();
45+
4346
const char *kwlist[] = {"expression", "vars", nullptr};
4447

4548
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|O!",

src/nix-to-python.cc

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ PyObject *nixToPythonObject(nix::EvalState &state, nix::Value &v,
2222
copyContext(v, context);
2323
return PyUnicode_FromString(v.string.s);
2424

25-
case nix::nPath:
26-
return PyUnicode_FromString(state.copyPathToStore(context, v.path).c_str());
25+
case nix::nPath: {
26+
auto p = state.copyPathToStore(context, v.path).to_string();
27+
return PyUnicode_FromStringAndSize(p.data(), p.length());
28+
}
2729

2830
case nix::nNull:
2931
Py_RETURN_NONE;
@@ -36,19 +38,13 @@ PyObject *nixToPythonObject(nix::EvalState &state, nix::Value &v,
3638
return (PyObject *)nullptr;
3739
}
3840

39-
nix::StringSet names;
40-
4141
for (auto &j : *v.attrs) {
42-
names.insert(j.name);
43-
}
44-
for (auto &j : names) {
45-
nix::Attr &a(*v.attrs->find(state.symbols.create(j)));
46-
47-
auto value = nixToPythonObject(state, *a.value, context);
42+
const std::string & name = state.symbols[j.name];
43+
auto value = nixToPythonObject(state, *j.value, context);
4844
if (!value) {
4945
return nullptr;
5046
}
51-
PyDict_SetItemString(dict.get(), j.c_str(), value);
47+
PyDict_SetItemString(dict.get(), name.c_str(), value);
5248
}
5349
return dict.release();
5450
} else {

src/python-to-nix.cc

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,16 @@ nix::Value *pythonToNixValue(nix::EvalState &state, PyObject *obj) {
7070
auto v = state.allocValue();
7171

7272
if (obj == Py_True && obj == Py_False) {
73-
nix::mkBool(*v, obj == Py_True);
73+
v->mkBool(obj == Py_True);
7474
} else if (obj == Py_None) {
75-
nix::mkNull(*v);
75+
v->mkNull();
7676
} else if (PyBytes_Check(obj)) {
7777
auto str = checkNullByte(PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj));
7878
if (!str) {
7979
return nullptr;
8080
}
8181

82-
nix::mkString(*v, str);
82+
v->mkString(str);
8383
} else if (PyUnicode_Check(obj)) {
8484
Py_ssize_t size;
8585
const char *utf8 = PyUnicode_AsUTF8AndSize(obj, &size);
@@ -88,13 +88,13 @@ nix::Value *pythonToNixValue(nix::EvalState &state, PyObject *obj) {
8888
return nullptr;
8989
}
9090

91-
nix::mkString(*v, utf8);
91+
v->mkString(utf8);
9292
} else if (PyFloat_Check(obj)) {
93-
nix::mkFloat(*v, PyFloat_AS_DOUBLE(obj));
93+
v->mkFloat(PyFloat_AS_DOUBLE(obj));
9494
} else if (PyLong_Check(obj)) {
95-
nix::mkInt(*v, PyLong_AsLong(obj));
95+
v->mkInt(PyLong_AsLong(obj));
9696
} else if (PyList_Check(obj)) {
97-
state.mkList(*v, PyList_GET_SIZE(obj));
97+
v->mkList(PyList_GET_SIZE(obj));
9898
for (Py_ssize_t i = 0; i < PyList_GET_SIZE(obj); i++) {
9999
auto val = pythonToNixValue(state, PyList_GET_ITEM(obj, i));
100100
if (!val) {
@@ -103,7 +103,7 @@ nix::Value *pythonToNixValue(nix::EvalState &state, PyObject *obj) {
103103
v->listElems()[i] = val;
104104
}
105105
} else if (PyTuple_Check(obj)) {
106-
state.mkList(*v, PyTuple_GET_SIZE(obj));
106+
v->mkList(PyTuple_GET_SIZE(obj));
107107
for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(obj); i++) {
108108
auto val = pythonToNixValue(state, PyTuple_GET_ITEM(obj, i));
109109
if (!val) {
@@ -116,11 +116,12 @@ nix::Value *pythonToNixValue(nix::EvalState &state, PyObject *obj) {
116116
if (!attrs) {
117117
return nullptr;
118118
}
119-
state.mkAttrs(*v, attrs->size());
120-
for (auto &attr : *attrs) {
121-
v->attrs->push_back(nix::Attr(attr.first, attr.second));
119+
auto attrsValue = attrs.value();
120+
auto bindings = state.buildBindings(attrsValue.size());
121+
for (auto &attr : attrsValue) {
122+
bindings.insert(attr.first, attr.second);
122123
}
123-
v->attrs->sort();
124+
v->mkAttrs(bindings);
124125
}
125126
return v;
126127
}
@@ -133,7 +134,7 @@ std::optional<nix::StaticEnv> pythonToNixEnv(nix::EvalState &state,
133134
*env = &state.allocEnv(vars ? PyDict_Size(vars) : 0);
134135
(*env)->up = &state.baseEnv;
135136

136-
nix::StaticEnv staticEnv(false, &state.staticBaseEnv);
137+
nix::StaticEnv staticEnv(false, state.staticBaseEnv.get());
137138

138139
if (!vars) {
139140
return staticEnv;
@@ -150,7 +151,7 @@ std::optional<nix::StaticEnv> pythonToNixEnv(nix::EvalState &state,
150151
if (!attrVal) {
151152
return {};
152153
}
153-
staticEnv.vars[state.symbols.create(name)] = displ;
154+
staticEnv.vars.emplace_back(state.symbols.create(name), displ);
154155
(*env)->values[displ++] = attrVal;
155156
}
156157

0 commit comments

Comments
 (0)