[Laszlo-dev] RFC: Proposal for setter API change
André Bargull
andre.bargull at udo.edu
Thu Oct 2 13:22:55 PDT 2008
On 10/2/2008 8:57 PM, P T Withington wrote:
> On 2008-10-02, at 10:55EDT, André Bargull wrote:
>
>>>
>>> In the default event system, what you get if you don't write a
>>> custom setter, sends an event every time you call setAttribute. It
>>> does _not_ make any optimization to not send events if you happen to
>>> set an attribute to a value it already has.
>>>
>> A side note for the interested reader:
>> It's possible to turn on manually this optimization if you pass as the
>> third argument to "setAttribute()" ?true?, e.g.
>> foo.setAttribute("text", "hello world!", true)
>> (That way the setter is not called when the value did not change.)
>
> My head hurts trying to process that logic. Too many negatives.
>
> This seems like an incredibly dangerous optimization, because if you
> have a custom setter, how can the generic code know whether or not the
> value 'changed'? E.g., suppose the custom setter ensures your value is
> in a particular range or rounded to a particular granularity?
>
> When did setAttribute grow this featureXXXXXXXbug? I don't recall
> seeing an API review for this.
It's there since 4.0.5
>
> And, I wonder, does the compiler know about this featureXXXXXXXbug where
> it inlines calls to setAttribute?
Yes, it knows about this feature. There is even special code to compile
away this feature if you call setAttribute() with only two arguments.
>> When do you send the event?
>> 1. after setting the property
>> a) requires code analysis
>> b) likely to be more natural
>> c) property may be have any name -> problem...
>> 2. at the end of the setter
>> a) what happens if the user places return statement in the setter? [1]
>> b) or an error was thrown?
>>
>> When do you send no event?
>> 1. if you override a setter
>> a) because the super-setter should handle this,
>> b) but if the super-setter is not called? (by purpose or
>> unintentionally?)
>>
>
> The tag compiler could compile setters as follows (using pseudo-e4x and
> `` to mean compile-time substitution):
>
> function $lzc$set_`setter. at name` (`setter. at args`) {
> try {
> `setter.text()`
> } finally {
> if (`! setter.(@event == 'true')`) {
> if (this['on`setter. at name`'] && this.on`setter. at name`['ready']) {
> this.sendEvent('on`setter. at name`', this.`setter. at name`);
> }
> }
> }
> }
>
> Since <setter> is a brand new feature, IWBN to make this change in its
> semantics now.
>
How much performance does it cost to establish a try-finally block in
the runtimes?
And still open:
>> When do you send no event?
>> 1. if you override a setter
>> a) because the super-setter should handle this,
>> b) but if the super-setter is not called? (by purpose or
>> unintentionally?)
I think this is quite hard to handle. Maybe it's easier to just add the
possibility to auto-generate events. So for the time being, if
"events='true'" on a setter-tag, the event-sending code will be added by
the compiler. If "events='false'" or not specified, do nothing.
More information about the Laszlo-dev
mailing list