Здравствуйте.
В пункте 8.7.2 PutValue представлено два алгоритма: один основной, второй, если на шаге 4.a. первого получаем значение HasPrimitiveBase(V) === true - то для назначения свойства используется второй алгоритм.
Как я понимаю, во второй алгоритм мы попадаем, если пытаемся задать свойство объекту, которое у него есть и primitive type (Boolean, String, Number), как указано на предыдущей странице спецификации.
Если свойство можно записать, то мы попадаем на шаг 3. Где получаем Property Descriptor свойства. А так как мы хотим изменить свойство, которое есть у объекта и примитивного типа, то мы и должны, как я полагаю получить data descriptor. Но на следующем шаге, если мы получили data descriptor, то мы вообще либо Exception выкидываем, либо просто выходим из программы не назначая свойства.
По аналогии с предыдущим пунктом спецификации 8.7.1 GetValue, где в пункте 4 второго алгоритма, если это data descriptor, то мы возвращаем значение return desc.[[value]], так же и здесь, наверное, надо назначать свойство через desc.[[value]] = W, а мы выдаем ошибку и выходим.
Так же можете пояснить 1 шаг второго алгоритма, что значит toObject(base). В моем примере, как я понимаю, base это примитивное значение. Допустим было myObj.m = 33, то base будет равно 33, и что в таком случае значит 1. Let Obj be ToObject( 33 ) ?
Можно ещё привести небольшой код, с пояснением, в каком случае эти пункты работают, я так понимаю, когда мы пишем:
var myO = {};
myO.myName = 33;
/*
Здесь вступает в работу пункт 3 первого алгоритма из PutValue, так как свойства несуществует, то IsUnresolveableReference должна дать true, и так как у нас не strict mode, то мы выполняем 3.b
А дальше, если пишем:
*/
myO.myName = 55;
/*
То уже должен вступить пункт 4 в дело, и тут я перестаю понимать, что к чему.
*/