Brandon Benvie (2013-07-19T18:05:33.000Z)
On 7/19/2013 9:52 AM, Allen Wirfs-Brock wrote:
>> Even if you could, I highly doubt that proxy performance will ever be
>> up for the task, at least not for an implementation cost that isn't
>> much higher than the special casing.
> Like I said, I don't see how this is a performance issue for Symbols exotic objects because the MOP operations are never important for them.

Indeed, a largely self-hosted implementation of Symbol could look like:


const UNDEFINED = () => {};
const TRUE = () => true;
const FALSE = () => false;
const NULL = () => null;
const ARRAY = () => [];

const symbolHandler = {
   getOwnPropertyDescriptor: UNDEFINED,
   getOwnPropertyNames: ARRAY,
   getPrototypeOf: NULL,
   setPrototypeOf: FALSE,
   defineProperty: FALSE,
   deleteProperty: TRUE,
   freeze: TRUE,
   seal: TRUE,
   preventExtensions: TRUE,
   isFrozen: TRUE,
   isSealed: TRUE,
   isExtensible: FALSE,
   has: FALSE,
   hasOwn: FALSE,
   get: UNDEFINED
   set: FALSE,
   enumerate: ARRAY,
   keys: ARRAY,
};

function Symbol(name){
   const symbol = new Proxy({}, symbolHandler);
   %MarkAsSymbol(symbol, name);
   return symbol;
}


It's rare (and pointless) to perform MOP operations on a Symbol because 
they're inert. There's no need to optimize those. The optimization that 
has to happen is deciding when something is a symbol for the purposes of 
property lookup.
domenic at domenicdenicola.com (2013-07-24T00:14:21.247Z)
On 7/19/2013 9:52 AM, Allen Wirfs-Brock wrote:
>> Even if you could, I highly doubt that proxy performance will ever be
>> up for the task, at least not for an implementation cost that isn't
>> much higher than the special casing.
>
> Like I said, I don't see how this is a performance issue for Symbols exotic objects because the MOP operations are never important for them.

Indeed, a largely self-hosted implementation of Symbol could look like:

```js
const UNDEFINED = () => {};

const TRUE = () => true;

const FALSE = () => false;

const NULL = () => null;

const ARRAY = () => [];

const symbolHandler = {
   getOwnPropertyDescriptor: UNDEFINED,
   getOwnPropertyNames: ARRAY,
   getPrototypeOf: NULL,
   setPrototypeOf: FALSE,
   defineProperty: FALSE,
   deleteProperty: TRUE,
   freeze: TRUE,
   seal: TRUE,
   preventExtensions: TRUE,
   isFrozen: TRUE,
   isSealed: TRUE,
   isExtensible: FALSE,
   has: FALSE,
   hasOwn: FALSE,
   get: UNDEFINED
   set: FALSE,
   enumerate: ARRAY,
   keys: ARRAY,
};

function Symbol(name){
   const symbol = new Proxy({}, symbolHandler);
   %MarkAsSymbol(symbol, name);
   return symbol;
}
```

It's rare (and pointless) to perform MOP operations on a Symbol because 
they're inert. There's no need to optimize those. The optimization that 
has to happen is deciding when something is a symbol for the purposes of 
property lookup.