govendor fetch github.com/hashicorp/hcl2/...
This includes a number of upstream fixes, but in particular fixes a race on evaluating the same splat expression concurrently for multiple separate EvalContexts.
This commit is contained in:
parent
d236a9e4cd
commit
d9a26bae26
|
@ -2,6 +2,7 @@ package hclsyntax
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/hashicorp/hcl2/hcl"
|
"github.com/hashicorp/hcl2/hcl"
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
@ -1169,7 +1170,7 @@ func (e *SplatExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) {
|
||||||
// both to tuples/lists and to other values, and in the latter case
|
// both to tuples/lists and to other values, and in the latter case
|
||||||
// the value will be treated as an implicit single-value list. We'll
|
// the value will be treated as an implicit single-value list. We'll
|
||||||
// deal with that here first.
|
// deal with that here first.
|
||||||
if !(sourceVal.Type().IsTupleType() || sourceVal.Type().IsListType()) {
|
if !(sourceVal.Type().IsTupleType() || sourceVal.Type().IsListType() || sourceVal.Type().IsSetType()) {
|
||||||
sourceVal = cty.ListVal([]cty.Value{sourceVal})
|
sourceVal = cty.ListVal([]cty.Value{sourceVal})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1226,13 +1227,24 @@ func (e *SplatExpr) StartRange() hcl.Range {
|
||||||
// assigns it a value.
|
// assigns it a value.
|
||||||
type AnonSymbolExpr struct {
|
type AnonSymbolExpr struct {
|
||||||
SrcRange hcl.Range
|
SrcRange hcl.Range
|
||||||
values map[*hcl.EvalContext]cty.Value
|
|
||||||
|
// values and its associated lock are used to isolate concurrent
|
||||||
|
// evaluations of a symbol from one another. It is the calling application's
|
||||||
|
// responsibility to ensure that the same splat expression is not evalauted
|
||||||
|
// concurrently within the _same_ EvalContext, but it is fine and safe to
|
||||||
|
// do cuncurrent evaluations with distinct EvalContexts.
|
||||||
|
values map[*hcl.EvalContext]cty.Value
|
||||||
|
valuesLock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *AnonSymbolExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) {
|
func (e *AnonSymbolExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) {
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
return cty.DynamicVal, nil
|
return cty.DynamicVal, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.valuesLock.RLock()
|
||||||
|
defer e.valuesLock.RUnlock()
|
||||||
|
|
||||||
val, exists := e.values[ctx]
|
val, exists := e.values[ctx]
|
||||||
if !exists {
|
if !exists {
|
||||||
return cty.DynamicVal, nil
|
return cty.DynamicVal, nil
|
||||||
|
@ -1243,6 +1255,9 @@ func (e *AnonSymbolExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics
|
||||||
// setValue sets a temporary local value for the expression when evaluated
|
// setValue sets a temporary local value for the expression when evaluated
|
||||||
// in the given context, which must be non-nil.
|
// in the given context, which must be non-nil.
|
||||||
func (e *AnonSymbolExpr) setValue(ctx *hcl.EvalContext, val cty.Value) {
|
func (e *AnonSymbolExpr) setValue(ctx *hcl.EvalContext, val cty.Value) {
|
||||||
|
e.valuesLock.Lock()
|
||||||
|
defer e.valuesLock.Unlock()
|
||||||
|
|
||||||
if e.values == nil {
|
if e.values == nil {
|
||||||
e.values = make(map[*hcl.EvalContext]cty.Value)
|
e.values = make(map[*hcl.EvalContext]cty.Value)
|
||||||
}
|
}
|
||||||
|
@ -1253,6 +1268,9 @@ func (e *AnonSymbolExpr) setValue(ctx *hcl.EvalContext, val cty.Value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *AnonSymbolExpr) clearValue(ctx *hcl.EvalContext) {
|
func (e *AnonSymbolExpr) clearValue(ctx *hcl.EvalContext) {
|
||||||
|
e.valuesLock.Lock()
|
||||||
|
defer e.valuesLock.Unlock()
|
||||||
|
|
||||||
if e.values == nil {
|
if e.values == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,9 @@ func spaceAfterToken(subject, before, after *Token) bool {
|
||||||
// No extra spaces within templates
|
// No extra spaces within templates
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
case after.Type == hclsyntax.TokenOBrack && (subject.Type == hclsyntax.TokenIdent || subject.Type == hclsyntax.TokenNumberLit || tokenBracketChange(subject) < 0):
|
||||||
|
return false
|
||||||
|
|
||||||
case subject.Type == hclsyntax.TokenMinus:
|
case subject.Type == hclsyntax.TokenMinus:
|
||||||
// Since a minus can either be subtraction or negation, and the latter
|
// Since a minus can either be subtraction or negation, and the latter
|
||||||
// should _not_ have a space after it, we need to use some heuristics
|
// should _not_ have a space after it, we need to use some heuristics
|
||||||
|
|
|
@ -1891,68 +1891,68 @@
|
||||||
{
|
{
|
||||||
"checksumSHA1": "dJPromzLdd492RQjE/09klKRXGs=",
|
"checksumSHA1": "dJPromzLdd492RQjE/09klKRXGs=",
|
||||||
"path": "github.com/hashicorp/hcl2/ext/dynblock",
|
"path": "github.com/hashicorp/hcl2/ext/dynblock",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "IAfC0Xri1iCRgbbiDBgs6ue8/Ic=",
|
"checksumSHA1": "IAfC0Xri1iCRgbbiDBgs6ue8/Ic=",
|
||||||
"path": "github.com/hashicorp/hcl2/ext/typeexpr",
|
"path": "github.com/hashicorp/hcl2/ext/typeexpr",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "BRJaQcKriVKEirVC7YxBxPufQF0=",
|
"checksumSHA1": "BRJaQcKriVKEirVC7YxBxPufQF0=",
|
||||||
"path": "github.com/hashicorp/hcl2/gohcl",
|
"path": "github.com/hashicorp/hcl2/gohcl",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "v1JCFNvhLqF3ErYcxkJJPboKO8c=",
|
"checksumSHA1": "v1JCFNvhLqF3ErYcxkJJPboKO8c=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcl",
|
"path": "github.com/hashicorp/hcl2/hcl",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "ekhg+MJLLGkJQdh/tZ4A3EZwpNY=",
|
"checksumSHA1": "6H/LBmIYL/dNjKvlbB2hAsxm2rw=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcl/hclsyntax",
|
"path": "github.com/hashicorp/hcl2/hcl/hclsyntax",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "G40fCmu1bSWXv4Hw5JXwEUTVThk=",
|
"checksumSHA1": "G40fCmu1bSWXv4Hw5JXwEUTVThk=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcl/json",
|
"path": "github.com/hashicorp/hcl2/hcl/json",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "c3Lb2st15sopmoLrjLQp+XyaZjE=",
|
"checksumSHA1": "c3Lb2st15sopmoLrjLQp+XyaZjE=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcldec",
|
"path": "github.com/hashicorp/hcl2/hcldec",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "sySYF9Ew71VS/LfrG+s/0jK+1VQ=",
|
"checksumSHA1": "sySYF9Ew71VS/LfrG+s/0jK+1VQ=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcled",
|
"path": "github.com/hashicorp/hcl2/hcled",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "IzmftuG99BqNhbFGhxZaGwtiMtM=",
|
"checksumSHA1": "IzmftuG99BqNhbFGhxZaGwtiMtM=",
|
||||||
"path": "github.com/hashicorp/hcl2/hclparse",
|
"path": "github.com/hashicorp/hcl2/hclparse",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "v5qx2XghQ+EtvFLa4a0Efjiwt9I=",
|
"checksumSHA1": "v5qx2XghQ+EtvFLa4a0Efjiwt9I=",
|
||||||
"path": "github.com/hashicorp/hcl2/hcltest",
|
"path": "github.com/hashicorp/hcl2/hcltest",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "9UCSLRG+TEAsNKOZJUaJj/7d6r8=",
|
"checksumSHA1": "C82otWNczU2S3azjxsjdGH9zW+Y=",
|
||||||
"path": "github.com/hashicorp/hcl2/hclwrite",
|
"path": "github.com/hashicorp/hcl2/hclwrite",
|
||||||
"revision": "bbbd0ef30d601e5ecf89e492d0842170f144db85",
|
"revision": "81d22773002de532651a19acb91b4e1fe2b44cb2",
|
||||||
"revisionTime": "2018-05-22T22:06:42Z"
|
"revisionTime": "2018-05-23T23:56:29Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "M09yxoBoCEtG7EcHR8aEWLzMMJc=",
|
"checksumSHA1": "M09yxoBoCEtG7EcHR8aEWLzMMJc=",
|
||||||
|
|
Loading…
Reference in New Issue