[Laszlo-dev] [REVISED] For Review: Change 20080728-ptw-G Summary: Implement <setter>
André Bargull
a.bargull at intensis.de
Tue Jul 29 11:08:29 PDT 2008
>
>> And it's also currently not possible in swf9 at all, see point (iii).
>
> That's too bad. Possibly a reason for ruling it out. If this is
> really not used anywhere in code, I suppose now is as good a time as
> any to disallow it.
But at least this is only a restriction from our parser, e.g. you also
can't call the super-method in bracket notation:
> <class name="base">
> <method name="dostuff" >
> Debug.write("base.dostuff");
> </method>
> </class>
>
> <class name="sub" extends="base">
> <method name="dostuff" >
> super['dostuff']();
> Debug.write("sub.dostuff");
> </method>
> </class>
compile error:
> |LPP-5587.lzx:36:11: Syntax error: the token "function dostuff ( ) {
> #beginContent #pragma 'methodName=dostuff' #pragma 'withThis' super ["
> was not expected at this position.|
On 7/29/2008 5:04 PM, P T Withington wrote:
> On 2008-07-29, at 10:21EDT, André Bargull wrote:
>
>> Do we want to allow non-literal attribute names for the
>> "super.setAttribute(..)" call? I'm just thinking about js2-setters
>> and our (possible) future plans to compile away the
>> "setAttribute"-mechanism with real js2-setters. I just want to
>> prevent that users make any non-sense with the
>> "super.setAttribute"-stuff, so that we may need to provide any scary
>> backward compatibility thing in the future. At least we should state
>> that this is not supported and may change in future versions..
>
> Hm. This is a good point. We could just make this an error, I don't
> know if it is used anywhere already. Although I think in theory you
> could still do this in JS2 because there is `intrisic::set(id, value)`
> and I would think you should be able to say:
>
> super[id] = value;
>
> to invoke a super setter method at runtime. Although, from your notes
> below, apparently as3 does not allow this.
>
>> And it's also currently not possible in swf9 at all, see point (iii).
>
> That's too bad. Possibly a reason for ruling it out. If this is
> really not used anywhere in code, I suppose now is as good a time as
> any to disallow it.
>
>> Next problem I hit: what about "Function#call" and "Function#apply"?
>> swf8 gave a runtime error, swf9 a compile error. Point (i)
>
> Ouch. I guess I save myself a lot of trouble if I don't allow any of
> these crazy things. Surely this pattern is not used in any existing
> code.
>
>> And what is the expected behaviour when I attempt to call a
>> non-existing super-setter? swf9 emits a (native) runtime-error, the
>> swf8 error was less "informative" (apart from the line number info).
>> Point (ii)
>
> I think that's the best we can do. This is no different than calling
> super in any other case where there is no super method.
>
>> Otherwise approved!
>>
>>
>> (i) using "call" or "apply"
>>> <setter name="foo" args="newfoo">
>>> Debug.info("sub.set foo: %s", newfoo);
>>> super.setAttribute.apply(this, ["foo", newfoo]);
>>> //super.setAttribute.call(this, "foo", newfoo);
>>> </setter>
>> swf8 compilation - runtime error:
>>> ERROR @LPP-5587.lzx#21: undefined object does not have a property
>>> 'apply'
>> swf9 compilation - compile error:
>>> |LPP-5587.lzx:22:5: Syntax error: the token "[" was not expected at
>>> this position.
>>> Was expecting one of: (, .|
>>
>>
>> (ii) using "super.setAttribute" without super-setter
>>> <class name="sub" extends="base">
>>> <attribute name="bar" value="false" type="boolean" />
>>> <setter name="bar" args="newbar" >
>>> Debug.info("sub.set bar: %s", newbar);
>>> super.setAttribute("bar", newbar);
>>> </setter>
>>> </class>
>> swf8 compilation - runtime error:
>>> ERROR @LPP-5587.lzx#26: undefined object does not have a property
>>> 'call'
>> swf9 compilation - runtime error in swf9.
>>> ReferenceError: Error #1070: Method $lzc$set_bar not found in
>>> .$lzc$class_base
>>
>>
>> (iii) non literal for attribute name:
>>
>>> <class name="sub" extends="base">
>>> <setter name="foo" args="newfoo">
>>> Debug.info("sub.set foo: %s", newfoo);
>>> var methname = "foo";
>>> super.setAttribute(methname, newfoo);
>>> </setter>
>>> </class>
>> swf9 compilation - compile error:
>>> |LPP-5587.lzx:22:5: Syntax error: the token "[" was not expected at
>>> this position.
>>> Was expecting one of: (, .|
>>
>>
>> On 7/29/2008 1:04 PM, P T Withington wrote:
>>> [REVISED: I really think I got the change set up to date now.]
>>>
>>> Change 20080728-ptw-G by ptw at dueling-banjos.local on 2008-07-28
>>> 16:57:52 EDT
>>> in /Users/ptw/OpenLaszlo/dingdong-clean
>>> for http://svn.openlaszlo.org/openlaszlo/trunk
>>>
>>> Summary: Implement <setter>
>>>
>>> Bugs Fixed:
>>> LPP-5587 'Improve LZX getter/setter to be more like conventional O-O
>>> languages'
>>>
>>> Technical Reviewer: a.bargull at intensis.de (pending)
>>> QA Reviewer: promanik at laszlosystems.com (pending)
>>>
>>> Release Notes:
>>> There is a new tag available in classes and instances (<setter>)
>>> that can be used to define a setter for an attribute. This tag
>>> can be used to override a built-in setter. The overridden setter
>>> can be invoked by using `super.setAttribute`.
>>>
>>> Details:
>>> schema: allow <setter> in canvas and node
>>>
>>> swf9stubs: use LzFormatter for prettier output
>>>
>>> JavascriptGenerator, CodeGenerator, SWF9Generator: Transform
>>> `super.setAttribute(x, y)` to `super['$lzc$set_' + x](y)`.
>>>
>>> NodeModel: Add support or the <setter> tag.
>>>
>>> Tests:
>>> Test case from bug, in swf8, dhtml, and swf9
>>>
>>> Files:
>>> M WEB-INF/lps/schema/lfc.lzx
>>> M WEB-INF/lps/lfc/debugger/swf9stubs.lzs
>>> M
>>> WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
>>> M WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
>>> M WEB-INF/lps/server/src/org/openlaszlo/sc/SWF9Generator.java
>>> M WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
>>>
>>> Changeset:
>>> http://svn.openlaszlo.org/openlaszlo/patches/20080728-ptw-G.tar
>>>
>
>
More information about the Laszlo-dev
mailing list