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 return nil, err
} }
h := withHiddenFromBool(includeHidden.value) 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 return makeValueBoolean(hasField), nil
} }

View File

@ -585,7 +585,7 @@ func (i *interpreter) rawevaluate(a ast.Node, tc tailCallStatus) (value, error)
if err != nil { if err != nil {
return nil, err return nil, err
} }
hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString(), withHidden) hasField := objectHasField(i.stack.getSelfBinding().super(), indexStr.getGoString())
return makeValueBoolean(hasField), nil return makeValueBoolean(hasField), nil
case *ast.Function: 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", "format": "test blah 42",
"get": [ "get": [
17, 17,
42,
18,
42 42
], ],
"isArray": true, "isArray": true,

View File

@ -26,6 +26,8 @@
get: [ get: [
std.get(o={a:: 17}, f="a"), std.get(o={a:: 17}, f="a"),
std.get(o={a:: 17}, f="a", default=42, inc_hidden=false), 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 // isSomething

View File

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

View File

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