internal/core/eval: use env from fieldSet

Part of moving closedness restructuring.

Change-Id: I787efd65d253546ced89e667737bbf07a299eb8d
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/7981
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
diff --git a/internal/core/eval/closed.go b/internal/core/eval/closed.go
index 786ebfa..61ab1b3 100644
--- a/internal/core/eval/closed.go
+++ b/internal/core/eval/closed.go
@@ -733,7 +733,7 @@
 		}
 
 		for _, b := range o.bulk {
-			if b.check.Match(ctx, f) {
+			if b.check.Match(ctx, o.env, f) {
 				return true, false
 			}
 		}
diff --git a/internal/core/eval/eval.go b/internal/core/eval/eval.go
index 4e86611..7f307cf 100644
--- a/internal/core/eval/eval.go
+++ b/internal/core/eval/eval.go
@@ -1669,7 +1669,7 @@
 			n.aStruct = s
 			n.aStructID = closeID
 			n.dynamicFields = append(n.dynamicFields, envDynamic{childEnv, x, closeID, nil})
-			opt.AddDynamic(ctx, childEnv, x)
+			opt.AddDynamic(ctx, x)
 
 		case *adt.ForClause:
 			n.forClauses = append(n.forClauses, envYield{childEnv, x, closeID, nil})
diff --git a/internal/core/eval/optionals.go b/internal/core/eval/optionals.go
index 86c9227..4c6ae98 100644
--- a/internal/core/eval/optionals.go
+++ b/internal/core/eval/optionals.go
@@ -93,7 +93,7 @@
 		return true
 	}
 	for _, b := range o.bulk {
-		if b.check.Match(c, f) {
+		if b.check.Match(c, o.env, f) {
 			return true
 		}
 	}
@@ -133,7 +133,7 @@
 		if matched && f.additional {
 			continue
 		}
-		if f.check.Match(c, arc.Label) {
+		if f.check.Match(c, o.env, arc.Label) {
 			matched = true
 			if f.expr != nil {
 				arc.AddConjunct(adt.MakeConjunct(&bulkEnv, f.expr, o.id))
@@ -178,9 +178,9 @@
 	o.fields[p].optional = append(o.fields[p].optional, x)
 }
 
-func (o *fieldSet) AddDynamic(c *adt.OpContext, env *adt.Environment, x *adt.DynamicField) {
+func (o *fieldSet) AddDynamic(c *adt.OpContext, x *adt.DynamicField) {
 	// not in bulk: count as regular field?
-	o.bulk = append(o.bulk, bulkField{dynamicMatcher{env, x.Key}, nil, false})
+	o.bulk = append(o.bulk, bulkField{dynamicMatcher{x.Key}, nil, false})
 }
 
 func (o *fieldSet) AddBulk(c *adt.OpContext, x *adt.BulkOptionalField) {
@@ -218,12 +218,12 @@
 }
 
 type fieldMatcher interface {
-	Match(c *adt.OpContext, f adt.Feature) bool
+	Match(c *adt.OpContext, env *adt.Environment, f adt.Feature) bool
 }
 
 type typeMatcher adt.Kind
 
-func (m typeMatcher) Match(c *adt.OpContext, f adt.Feature) bool {
+func (m typeMatcher) Match(c *adt.OpContext, env *adt.Environment, f adt.Feature) bool {
 	switch f.Typ() {
 	case adt.StringLabel:
 		return adt.Kind(m)&adt.StringKind != 0
@@ -235,15 +235,14 @@
 }
 
 type dynamicMatcher struct {
-	env  *adt.Environment
 	expr adt.Expr
 }
 
-func (m dynamicMatcher) Match(c *adt.OpContext, f adt.Feature) bool {
+func (m dynamicMatcher) Match(c *adt.OpContext, env *adt.Environment, f adt.Feature) bool {
 	if !f.IsRegular() || !f.IsString() {
 		return false
 	}
-	v, ok := c.Evaluate(m.env, m.expr)
+	v, ok := c.Evaluate(env, m.expr)
 	if !ok {
 		return false
 	}
@@ -257,7 +256,7 @@
 
 type patternMatcher adt.Conjunct
 
-func (m patternMatcher) Match(c *adt.OpContext, f adt.Feature) bool {
+func (m patternMatcher) Match(c *adt.OpContext, env *adt.Environment, f adt.Feature) bool {
 	v := adt.Vertex{}
 	v.AddConjunct(adt.Conjunct(m))
 	label := f.ToValue(c)