diff --git a/internal/command/jsonplan/plan.go b/internal/command/jsonplan/plan.go index 53fe8ec01..c68cfe802 100644 --- a/internal/command/jsonplan/plan.go +++ b/internal/command/jsonplan/plan.go @@ -597,7 +597,7 @@ func unknownAsBool(val cty.Value) cty.Value { // Omit all of the "false"s for known values for more compact // serialization if !vAsBool.RawEquals(cty.False) { - vals[k.AsString()] = unknownAsBool(v) + vals[k.AsString()] = vAsBool } } // The above transform may have changed the types of some of the diff --git a/internal/command/jsonplan/plan_test.go b/internal/command/jsonplan/plan_test.go index cf23187e5..3c640cf6d 100644 --- a/internal/command/jsonplan/plan_test.go +++ b/internal/command/jsonplan/plan_test.go @@ -304,3 +304,59 @@ func TestEncodePaths(t *testing.T) { }) } } + +func deepObjectValue(depth int) cty.Value { + v := cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("a"), + "b": cty.NumberIntVal(2), + "c": cty.True, + "d": cty.UnknownVal(cty.String), + }) + + result := v + + for i := 0; i < depth; i++ { + result = cty.ObjectVal(map[string]cty.Value{ + "a": result, + "b": result, + "c": result, + }) + } + + return result +} + +func BenchmarkUnknownAsBool_2(b *testing.B) { + value := deepObjectValue(2) + for n := 0; n < b.N; n++ { + unknownAsBool(value) + } +} + +func BenchmarkUnknownAsBool_3(b *testing.B) { + value := deepObjectValue(3) + for n := 0; n < b.N; n++ { + unknownAsBool(value) + } +} + +func BenchmarkUnknownAsBool_5(b *testing.B) { + value := deepObjectValue(5) + for n := 0; n < b.N; n++ { + unknownAsBool(value) + } +} + +func BenchmarkUnknownAsBool_7(b *testing.B) { + value := deepObjectValue(7) + for n := 0; n < b.N; n++ { + unknownAsBool(value) + } +} + +func BenchmarkUnknownAsBool_9(b *testing.B) { + value := deepObjectValue(9) + for n := 0; n < b.N; n++ { + unknownAsBool(value) + } +}