Improving ECMAScript as a compilation target
Brendan Eich
brendan at mozilla.com
Tue May 5 00:26:13 PDT 2009
On May 5, 2009, at 12:09 AM, Brendan Eich wrote:
> "One user expectation, fed and watered by E4X, is that methods are
> not properties, or to avoid this JS oxymoron, that methods are not
> in the default property namespace:
> js> x = <room><width>12</width><length>16</length></room>
> <room>
> <width>12</width>
> <length>16</length>
> </room>
> js> x.length
> 16
> js> x.length()
> 1
[snip]
>> The other possibility, at least for invoke, is that the handler is
>> invoked whenever an attempt is made to call the value of an non-
>> existent property of obj.
>
> The general intention for catchalls is to call the action hook only
> when the property is missing.
This is certainly true of __noSuchMethod__ from SpiderMonkey, inspired
by doesNotUnderstand in Smalltalk (which spawned method_missing in
Ruby), but the E4X <room> snipped above shows a counter-example.
There, even though 'length' names a "property" (E4X is so strange that
the scare quotes are justified), we want to treat invocation of length
as different from a get followed by a call of the got value.
> The odd case is set, vs. add in the strawman (or first-set vs. every-
> set in the prose).
That's one obvious exception. I clarified in the wiki how has, get,
and invoke may also want to be called only for non-existent
properties. Or not, if you are implementing E4X.
Even delete might want to be called for non-existent properties, to
fake its boolean result based on existence of a peer property not yet
reified.
> There's a less common case of wanting every-get too, to filter
> results of and/or control access to existing properties.
This case we have had in SpiderMonkey's C API forever. It's generally
a hazard where careless embedders end up running every property get
through a class getter that does nothing useful and just slows down
the access. We have to work around it in TraceMonkey when JITting.
We'd like to break the API here, soon.
Not sure how much of a lesson this gives, but I suspect every-get is
going to be the uncommon case for catchall users.
Still, as noted for delete above, full virtualization might want
every- and first- forms of all of the hooks. Instead of the add/set
split I wrote up, we could drop add and split all the hooks in two,
burdening the uncommon case with the longer name (everySet and set;
blech). I'm resisting this, it feels overdesigned, besides making for
ugly names.
Comments from Caja, Web Sandbox, and other such folks are more than
welcome here.
/be
More information about the es-discuss
mailing list