From 591b119591391d8f7f9ed054e9d3795cc61399dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Barzowski?= Date: Fri, 10 May 2019 12:59:38 +0200 Subject: [PATCH] Perform lookups from obj locals with right sb When object fields are evaluated the locals from the object are added to the environment. These locals should have the same environment as the field, in particular they should be at the same inheritance level. Instead they were evaluated as if they were on the level from which original field lookup was performed, resulting in subtle and hard to debug issues. --- testdata/obj_local_right_level.golden | 3 +++ testdata/obj_local_right_level.jsonnet | 6 ++++++ testdata/obj_local_right_level2.golden | 4 ++++ testdata/obj_local_right_level2.jsonnet | 7 +++++++ testdata/obj_local_right_level3.golden | 4 ++++ testdata/obj_local_right_level3.jsonnet | 9 +++++++++ value.go | 2 +- 7 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 testdata/obj_local_right_level.golden create mode 100644 testdata/obj_local_right_level.jsonnet create mode 100644 testdata/obj_local_right_level2.golden create mode 100644 testdata/obj_local_right_level2.jsonnet create mode 100644 testdata/obj_local_right_level3.golden create mode 100644 testdata/obj_local_right_level3.jsonnet diff --git a/testdata/obj_local_right_level.golden b/testdata/obj_local_right_level.golden new file mode 100644 index 0000000..59e290c --- /dev/null +++ b/testdata/obj_local_right_level.golden @@ -0,0 +1,3 @@ +{ + "bar": 1 +} diff --git a/testdata/obj_local_right_level.jsonnet b/testdata/obj_local_right_level.jsonnet new file mode 100644 index 0000000..d641a27 --- /dev/null +++ b/testdata/obj_local_right_level.jsonnet @@ -0,0 +1,6 @@ +{ + bar: 0 +} + { + local foo = super.bar + 1, + bar: foo +} + {} + {} + {} \ No newline at end of file diff --git a/testdata/obj_local_right_level2.golden b/testdata/obj_local_right_level2.golden new file mode 100644 index 0000000..350fead --- /dev/null +++ b/testdata/obj_local_right_level2.golden @@ -0,0 +1,4 @@ +{ + "answer": "right", + "bar": "right" +} diff --git a/testdata/obj_local_right_level2.jsonnet b/testdata/obj_local_right_level2.jsonnet new file mode 100644 index 0000000..2531fe5 --- /dev/null +++ b/testdata/obj_local_right_level2.jsonnet @@ -0,0 +1,7 @@ +{ + local foo = self.bar, + bar: "wrong", + answer: foo +} + { + bar: "right" +} \ No newline at end of file diff --git a/testdata/obj_local_right_level3.golden b/testdata/obj_local_right_level3.golden new file mode 100644 index 0000000..9e01204 --- /dev/null +++ b/testdata/obj_local_right_level3.golden @@ -0,0 +1,4 @@ +{ + "answer": "right", + "bar": "wrong2" +} diff --git a/testdata/obj_local_right_level3.jsonnet b/testdata/obj_local_right_level3.jsonnet new file mode 100644 index 0000000..b1465f9 --- /dev/null +++ b/testdata/obj_local_right_level3.jsonnet @@ -0,0 +1,9 @@ +{ + bar: "right", +} + { + local foo = super.bar, + bar: "wrong1", + answer: foo, +} + { + bar: "wrong2" +} \ No newline at end of file diff --git a/value.go b/value.go index 068f4a8..81c865c 100644 --- a/value.go +++ b/value.go @@ -648,7 +648,7 @@ func objectIndex(i *interpreter, trace TraceElement, sb selfBinding, fieldName s } fieldSelfBinding := selfBinding{self: sb.self, superDepth: foundAt} - fieldUpValues := prepareFieldUpvalues(sb, upValues, locals) + fieldUpValues := prepareFieldUpvalues(fieldSelfBinding, upValues, locals) return field.field.evaluate(i, trace, fieldSelfBinding, fieldUpValues, fieldName) }