/* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ /* Create an object with a JavaScript setter. */ var firstSetterCount; var o = { w:2, set x(v) { firstSetterCount++; } }; /* * Put the object in dictionary mode, so that JSObject::putProperty will * mutate its shapes instead of creating new ones. */ delete o.w; /* A stock watcher function. */ var watcherCount; function watcher(id, oldval, newval) { watcherCount++; return newval; } /* * Place a watchpoint on the property. The property's shape now has the * watchpoint setter, with the original setter saved in the watchpoint * structure. */ o.watch('x', watcher); /* * Replace the setter with a new setter. The shape should get updated to * refer to the new setter, and then the watchpoint setter should be * re-established. */ var secondSetterCount; Object.defineProperty(o, 'x', { set: function () { secondSetterCount++ } }); /* * Assign to the property. This should trigger the watchpoint and the new setter. */ watcherCount = firstSetterCount = secondSetterCount = 0; o.x = 3; assertEq(watcherCount, 1); assertEq(firstSetterCount, 0); assertEq(secondSetterCount, 1); reportCompare(true, true);