Compares value with expected and replaces it with new value if values matches. If new value is not null and object is frozen, it must be frozen or permanent object.
the old value
the expected value
the new value
if the value is not frozen or a permanent object