The refactoring design is the following,
1. Remove JSObject::put hook
2. Add JSObject::attemptToSetOwnProperty, which only does [[Put]]’s own setter part. It does not involve any [[Prototype]] traversing etc.
3. Define non-virtual JSObject::put method, which does traversing and static-property initialization too.
4. (2) is only called when the structure has some flags. This flag must be correctly maintained by structure transition.
5. (2) correctly set PutPropertySlot’s status
6. Even (2) is invoked, we still see cacheable status through PutPropertySlot. Each attemptToSetOwnProperty implementation should take care of maintaining it.