Fix field visibility in objectHas for extended objects (#737)

This commit is contained in:
Marko Mikulicic 2024-06-10 22:26:12 +02:00 committed by GitHub
parent c159b34cd2
commit 94a40b2991
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 15 additions and 9 deletions

View File

@ -1224,7 +1224,10 @@ func builtinObjectHasEx(i *interpreter, objv value, fnamev value, includeHiddenV
return nil, err
}
h := withHiddenFromBool(includeHidden.value)
hasField := objectHasField(objectBinding(obj), string(fname.getRunes()), h)
hide, hasField := objectFieldsVisibility(obj)[string(fname.getRunes())]
hasField = hasField && (h == withHidden || hide != ast.ObjectFieldHidden)
return makeValueBoolean(hasField), nil
}

View File

@ -585,7 +585,7 @@ func (i *interpreter) rawevaluate(a ast.Node, tc tailCallStatus) (value, error)
if err != nil {
return nil, err
}
hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString(), withHidden)
hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString())
return makeValueBoolean(hasField), nil
case *ast.Function:

1
testdata/std.objectHasEx5.golden vendored Normal file
View File

@ -0,0 +1 @@
false

1
testdata/std.objectHasEx5.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.objectHasEx({"x":: null} + {"x": null}, "x", false)

View File

View File

@ -88,6 +88,8 @@
"format": "test blah 42",
"get": [
17,
42,
18,
42
],
"isArray": true,

View File

@ -26,6 +26,8 @@
get: [
std.get(o={a:: 17}, f="a"),
std.get(o={a:: 17}, f="a", default=42, inc_hidden=false),
std.get(o={a:: 17} + {a: 18}, f="a", default=42),
std.get(o={a:: 17} + {a: 18}, f="a", default=42, inc_hidden=false),
],
// isSomething

View File

@ -150,7 +150,7 @@ func (f *plusSuperUnboundField) evaluate(i *interpreter, sb selfBinding, origBin
return nil, err
}
if !objectHasField(sb.super(), fieldName, withHidden) {
if !objectHasField(sb.super(), fieldName) {
return right, nil
}

View File

@ -730,12 +730,9 @@ func objectIndex(i *interpreter, sb selfBinding, fieldName string) (value, error
return val, err
}
func objectHasField(sb selfBinding, fieldName string, h hidden) bool {
found, field, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName)
if !found || (h == withoutHidden && field.hide == ast.ObjectFieldHidden) {
return false
}
return true
func objectHasField(sb selfBinding, fieldName string) bool {
found, _, _, _, _ := findField(sb.self.uncached, sb.superDepth, fieldName)
return found
}
type fieldHideMap map[string]ast.ObjectFieldHide