<div class="gmail_quote">2011/6/19 David Bruant <span dir="ltr"><<a href="mailto:david.bruant@labri.fr">david.bruant@labri.fr</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<u></u>

  
    
  
  <div text="#000000" bgcolor="#ffffff">With the current fixed properties proposal, here is what happens in
    the engine at an Object.defineProperty(o, name, pd) call:<br>
    ----<br>
    if("name" has already been observed as non-configurable){<br>
      [[DefineOwnProperty]] (name, pd) on the fixed properties record //
    ES5.1 - 8.12.9<br>
      // This call includes invariant checking code<br>
    }<br>
    else{<br>
      resPd = ToPropertydescriptor(call o's defineProperty trap with [o,
    name, pd]);<br>
      if(!resPd.configurable){<br>
        add "name" to fixed properties record with resPd as property
    descriptor<br>
      }<br>
    }<br>
    ----<br>
    <br>
    What about doing the following:<br>
    ----<br>
    // (Calling the trap in all cases)<br>
    resPd = ToPropertyDescriptor(call o's defineProperty trap with [o,
    name, pd]); <br>
    <br>
    if("name" has already been observed as non-configurable){<br>
      [[DefineOwnProperty]] (name, resPd) on the non-configurable
    properties record // ES5.1 - 8.12.9<br>
      // This call includes the exact same invariant checking code<br>
    <br>
    }<br>
    else{<br>
      if(!resPd.configurable){<br>
        add "name" to non-configurable properties record with resPd as
    property descriptor<br>
      }  <br>
    }<br>
    ----<br>
    <br>
    The same amount of engine code is called and we have the genericity
    of calling the defineProperty trap every single time.<br></div></blockquote><div><br></div><div>The updated strawman is already more akin to your proposed second implementation. The way I currently think about a Proxy's [[DefineOwnProperty]] method with support for fixed properties is as follows:</div>
<div><br></div><div>[[DefineOwnProperty]] (P, Desc, Throw)</div><div><div>1. Let handler be the value of the [[Handler]] internal property of O.</div><div>2. Let defineProperty be the result of calling the [[Get]] internal method of handler with argument “defineProperty”.</div>
<div>3. If defineProperty is undefined, throw a TypeError exception.</div><div>4. If IsCallable(defineProperty) is false, throw a TypeError exception.</div><div>5. Let trapResult be the result of calling the [[Call]] internal method of defineProperty providing handler as the this value, P as the first argument and Desc as the second argument.</div>
</div><div>6. If ToBoolean(trapResult) is false, reject.</div><div>7. Let desc be ToPropertyDescriptor(trapResult)</div><div>8. If [[GetOwnProperty]](P) is not undefined, or desc.[[Configurable]] is false</div><div>  a. return [[DefineOwnProperty]](P, desc, Throw) (as per ES5 8.12.9)</div>
<div>9. return true</div></div>