I should add that this dead code removal does not happen in a release build
of TourDeJewel. In TourDeJewel, the if() statement body is not removed.

--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>


On Tue, Sep 8, 2020 at 3:27 PM Josh Tynjala <[email protected]>
wrote:

> So far, I've determined that Closure compiler is removing what it thinks
> is dead code in StyledLayoutBase.performLayout(). When that happens, the
> code that creates the DataGridColumnListPresentationModel is never run.
> That leads to the null reference exception.
>
> This is the original ActionScript:
>
> if (layout()) {
> if(layoutChildren)
> layoutChildren.executeLayoutChildren();
> viewBead.afterLayout();
> }
>
> In a JS release build, the code above basically gets reduced to this:
>
> this.layout();
>
> In other words, it removes the body of the if() block completely. The
> reason for this appears to be because LayoutBase.layout() returns false,
> and Closure compiler isn't properly detecting that an override might exist
> in a subclass. In our case, VerticalLayout.layout() returns true, but I
> have not yet determined why Closure compiler hasn't noticed this fact.
>
> --
> Josh Tynjala
> Bowler Hat LLC <https://bowlerhat.dev>
>
>
> On Tue, Sep 8, 2020 at 11:20 AM Carlos Rovira <[email protected]>
> wrote:
>
>> Hi Josh,
>> I remember the problem was not showing in TDJ, Piotr sent me a minimal
>> project that showed the problem.
>> Will try to send you directly to your email so you can try that.
>> Thanks for taking the time to look at it.
>>
>> El mar., 8 sept. 2020 a las 19:34, Josh Tynjala (<
>> [email protected]>)
>> escribió:
>>
>> > I checked out the bug/presentationmodel branch, rebuilt royale-asjs, and
>> > then built and ran a release build of TourDeJewel. I am seeing the
>> correct
>> > console.log() output, and I'm not getting any runtime exceptions.
>> >
>> > Tried building with both the normal SDK and with Maven. Same result.
>> Both
>> > good.
>> >
>> > --
>> > Josh Tynjala
>> > Bowler Hat LLC <https://bowlerhat.dev>
>> >
>> >
>> > On Thu, Sep 3, 2020 at 2:27 AM Carlos Rovira <[email protected]>
>> > wrote:
>> >
>> > > Hi Josh,
>> > >
>> > > it seems that my latest changes to solve the problem is making no
>> > behaving
>> > > as before.
>> > > So I created a branch to get the fail again.
>> > >
>> > > You can checkout the branch: "bug/presentationmodel" to reproduce the
>> > > problem.
>> > > You'll see how debug works, but release fails.
>> > >
>> > > The changes done in the branch are 2:
>> > >
>> > > 1.- In "IDataGridColumnList" remove again interface "
>> > > IListWithPresentationModel"
>> > > 2.- change the use in DataGridView to avoid using "beadsAdded":
>> > >
>> > > (_listArea as IParent).addElement(list as IChild);
>> > >
>> > > var pm:DataGridColumnListPresentationModel = list.getBeadByType(
>> > > IListPresentationModel) as DataGridColumnListPresentationModel;
>> > > var zzz:Object = list.getBeadByType(IListPresentationModel);
>> > > COMPILE::JS {
>> > > console.log(zzz, zzz as DataGridColumnListPresentationModel);
>> > > }
>> > > pm.rowHeight = _presentationModel.rowHeight;
>> > > pm.variableRowHeight = false;
>> > > pm.align = list.columnInfo.align;
>> > >
>> > > columnLists.push(list);
>> > >
>> > > js code created for DataGridView is:
>> > >
>> > >
>> >
>> this.org_apache_royale_jewel_beads_views_DataGridView__listArea.addElement
>> > > (list);
>> > > var /** @type {Object} */ pm =
>> > list.getBeadByType(org.apache.royale.jewel.
>> > > supportClasses.list.IListPresentationModel);
>> > > var /** @type {Object} */ zzz =
>> > list.getBeadByType(org.apache.royale.jewel.
>> > > supportClasses.list.IListPresentationModel);
>> > > console.log(zzz, zzz);
>> > > pm.rowHeight = this.
>> > > org_apache_royale_jewel_beads_views_DataGridView__presentationModel.
>> > > rowHeight;
>> > > pm.variableRowHeight = false;
>> > > pm.align = list.columnInfo.align;
>> > > this.columnLists.push(list);
>> > >
>> > > a) In DEBUG mode I get the logs of zzz, zzz right with the instances
>> > >
>> > >
>> org.apache.royale.jewel.beads.models.DataGridColumnListPresentationModel
>> > > {disposed_:
>> > > false, onDisposeCallbacks_: undefined, eventTargetListeners_:
>> > > g…g.e…s.ListenerMap, actualEventTarget_:
>> > > org.a…e.r…e.j…l.b…s.m…s.DataGridColumnListPresentationModel,
>> > > parentEventTarget_: null, …}
>> > >
>> org.apache.royale.jewel.beads.models.DataGridColumnListPresentationModel
>> > > {disposed_:
>> > > false, onDisposeCallbacks_: undefined, eventTargetListeners_:
>> > > g…g.e…s.ListenerMap, actualEventTarget_:
>> > > org.a…e.r…e.j…l.b…s.m…s.DataGridColumnListPresentationModel,
>> > > parentEventTarget_: null, …}
>> > > ,
>> > >
>> org.apache.royale.jewel.beads.models.DataGridColumnListPresentationModel
>> > > {disposed_:
>> > > false, onDisposeCallbacks_: undefined, eventTargetListeners_:
>> > > g…g.e…s.ListenerMap, actualEventTarget_:
>> > > org.a…e.r…e.j…l.b…s.m…s.DataGridColumnListPresentationModel,
>> > > parentEventTarget_: null, …}
>> > >
>> org.apache.royale.jewel.beads.models.DataGridColumnListPresentationModel
>> > > {disposed_:
>> > > false, onDisposeCallbacks_: undefined, eventTargetListeners_:
>> > > g…g.e…s.ListenerMap, actualEventTarget_:
>> > > org.a…e.r…e.j…l.b…s.m…s.DataGridColumnListPresentationModel,
>> > > parentEventTarget_: null, …}
>> > >
>> > > b) In RELEASE it fails with this error:
>> > >
>> > > DataGridView.as:244 null null
>> > > DataGridView.as:246 Uncaught TypeError: Cannot set property
>> 'rowHeight'
>> > of
>> > > null
>> > >     at yo (DataGridView.as:246)
>> > >     at wo.G.m (DataGridView.as:134)
>> > >     at ul.G.addBead (ElementWrapper.as:270)
>> > >     at ul.Yk.addBead (HTMLElementWrapper.js:43)
>> > >     at ul.G.addBead (UIBase.js:372)
>> > >     at cl (loadBeadFromValuesManager.js:41)
>> > >     at ul.G.loadBeads (UIBase.as:1415)
>> > >     at ul.G.addedToParent (UIBase.as:1398)
>> > >     at ul.G.addedToParent (GroupBase.js:58)
>> > >     at ul.tl.addedToParent (Group.js:67)
>> > >
>> > >
>> > > El mié., 2 sept. 2020 a las 21:16, Josh Tynjala (<
>> > > [email protected]>)
>> > > escribió:
>> > >
>> > > > I don't think that this code is compiled incorrectly. I think that
>> we
>> > > > haven't found the proper code to reproduce your original issue. As
>> > best I
>> > > > can tell, the list.presentationModel getter is where the
>> > > > IListPresentationModel is created, so returning null is the correct
>> > > > behavior for getBeadByType() in this particular code. Clearly, this
>> is
>> > > not
>> > > > the right way to reproduce the issue that you described (which
>> involved
>> > > the
>> > > > release build not behaving the same as the debug build), so I need
>> your
>> > > > help to find out how to reproduce it.
>> > > >
>> > > > --
>> > > > Josh Tynjala
>> > > > Bowler Hat LLC <https://bowlerhat.dev>
>> > > >
>> > > >
>> > > > On Wed, Sep 2, 2020 at 12:01 PM Carlos Rovira <
>> [email protected]
>> > >
>> > > > wrote:
>> > > >
>> > > > > Hi Josh,
>> > > > >
>> > > > > If I change that function to this code:
>> > > > >
>> > > > > /**
>> > > > > * @private
>> > > > > */
>> > > > > protected function
>> > > configureColumnListPresentationModel(event:Event):void
>> > > > > {
>> > > > > var list:IDataGridColumnList = event.target as
>> IDataGridColumnList;
>> > > > > var zzz:Object = (list as
>> > > IStrand).getBeadByType(IListPresentationModel);
>> > > > > COMPILE::JS {
>> > > > > console.log(zzz, zzz as DataGridColumnListPresentationModel);
>> > > > > }
>> > > > > //var pm:DataGridColumnListPresentationModel =
>> > > > > list.getBeadByType(IListPresentationModel) as
>> > > > > DataGridColumnListPresentationModel; --> this line doesn't work
>> > > > > var pm:DataGridColumnListPresentationModel =
>> list.presentationModel
>> > as
>> > > > > DataGridColumnListPresentationModel;
>> > > > > pm.rowHeight = _presentationModel.rowHeight;
>> > > > > pm.variableRowHeight = false;
>> > > > > pm.align = list.columnInfo.align;
>> > > > > }
>> > > > >
>> > > > > I get null, null too
>> > > > >
>> > > > > I think it's ok with the current problem, instead of getting the
>> > IBead,
>> > > > we
>> > > > > are getting null, so I guess something is compiling wrongly
>> > > > >
>> > > > > The compiled code I get is this:
>> > > > >
>> > > > > /**
>> > > > > * @asprivate
>> > > > > * @protected
>> > > > > * @param {org.apache.royale.events.Event} event
>> > > > > */
>> > > > > org.apache.royale.jewel.beads.views.DataGridView.prototype.
>> > > > > configureColumnListPresentationModel = function(event) {
>> > > > > var /** @type
>> > > > >
>> {org.apache.royale.jewel.supportClasses.datagrid.IDataGridColumnList}
>> > > */
>> > > > > list = org.apache.royale.utils.Language.as(event.target,
>> > > > > org.apache.royale.
>> > > > > jewel.supportClasses.datagrid.IDataGridColumnList);
>> > > > > var /** @type {Object} */ zzz =
>> org.apache.royale.utils.Language.as
>> > > > (list,
>> > > > >
>> > org.apache.royale.core.IStrand).getBeadByType(org.apache.royale.jewel.
>> > > > > supportClasses.list.IListPresentationModel);
>> > > > > console.log(zzz, org.apache.royale.utils.Language.as(zzz,
>> > > > > org.apache.royale.
>> > > > > jewel.beads.models.DataGridColumnListPresentationModel));
>> > > > > var /** @type
>> > > > >
>> > > >
>> > >
>> >
>> {org.apache.royale.jewel.beads.models.DataGridColumnListPresentationModel}
>> > > > > */ pm = org.apache.royale.utils.Language.as
>> (list.presentationModel,
>> > > org.
>> > > > >
>> > apache.royale.jewel.beads.models.DataGridColumnListPresentationModel);
>> > > > > pm.rowHeight = this.
>> > > > >
>> org_apache_royale_jewel_beads_views_DataGridView__presentationModel.
>> > > > > rowHeight;
>> > > > > pm.variableRowHeight = false;
>> > > > > pm.align = list.columnInfo.align;
>> > > > > };
>> > > > >
>> > > > >
>> > > > > El mié., 2 sept. 2020 a las 19:44, Josh Tynjala (<
>> > > > > [email protected]>)
>> > > > > escribió:
>> > > > >
>> > > > > > I had a free moment to look into this, but I'm having trouble
>> > > > reproducing
>> > > > > > the same behavior.
>> > > > > >
>> > > > > > I added the following code inside
>> > > > > > DataGridView.configureColumnListPresentationModel():
>> > > > > >
>> > > > > > var zzz:Object = list.getBeadByType(IListPresentationModel);
>> > > > > > COMPILE::JS {
>> > > > > >     console.log(zzz, zzz as
>> DataGridColumnListPresentationModel);
>> > > > > > }
>> > > > > >
>> > > > > > If I build and run TourDeJewel, it prints "null null" to the
>> debug
>> > > > > console.
>> > > > > > There's no difference between debug and release builds, so I
>> guess
>> > > I'm
>> > > > > > doing something wrong.
>> > > > > >
>> > > > > > Can you put together some simple code that will reproduce the
>> > issue?
>> > > > > >
>> > > > > > --
>> > > > > > Josh Tynjala
>> > > > > > Bowler Hat LLC <https://bowlerhat.dev>
>> > > > > >
>> > > > > >
>> > > > > > On Wed, Sep 2, 2020 at 9:27 AM Josh Tynjala <
>> > > [email protected]
>> > > > >
>> > > > > > wrote:
>> > > > > >
>> > > > > > > In a release build, what gets returned by
>> > > > > > > getBeadByType(IListPresentationModel) if you don't cast it
>> with
>> > "as
>> > > > > > > DataGridColumnListPresentationModel"? Is it the correct
>> object?
>> > Or
>> > > is
>> > > > > it
>> > > > > > > also null?
>> > > > > > >
>> > > > > > > --
>> > > > > > > Josh Tynjala
>> > > > > > > Bowler Hat LLC <https://bowlerhat.dev>
>> > > > > > >
>> > > > > > >
>> > > > > > > On Wed, Sep 2, 2020 at 6:43 AM Carlos Rovira <
>> > > > [email protected]>
>> > > > > > > wrote:
>> > > > > > >
>> > > > > > >> Hi,
>> > > > > > >>
>> > > > > > >> I did some more testing and it's not a timing issue.
>> > > > > > >> I refactored the PM code to "beadsAdded" since is the right
>> > place
>> > > to
>> > > > > > >> configure it (or was retrieved from the beads array or it's
>> > > created
>> > > > > from
>> > > > > > >> scratch).
>> > > > > > >> Trying to use the "getBeadByType" line fails the same way, so
>> > the
>> > > > > > problem
>> > > > > > >> is clearly a compiler issue, from my point of view.
>> > > > > > >>
>> > > > > > >> El mié., 2 sept. 2020 a las 14:17, Carlos Rovira (<
>> > > > > > >> [email protected]>)
>> > > > > > >> escribió:
>> > > > > > >>
>> > > > > > >> > Hi,
>> > > > > > >> >
>> > > > > > >> > I just committed a fix to solve an issue Piotr was getting
>> in
>> > > > > > DataGrid.
>> > > > > > >> >
>> > > > > > >> > The issue only can be seen in release mode, in debug
>> works, so
>> > > it
>> > > > > > seems
>> > > > > > >> a
>> > > > > > >> > compiler bug so hope others like Greg or Josh with more
>> > > knowledge
>> > > > in
>> > > > > > >> that
>> > > > > > >> > field can see what could be wrong, or if maybe it is just
>> some
>> > > > issue
>> > > > > > in
>> > > > > > >> the
>> > > > > > >> > code.
>> > > > > > >> >
>> > > > > > >> > Problem is in DataGridView line 239:
>> > > > > > >> >
>> > > > > > >> > // var pm:DataGridColumnListPresentationModel =
>> > > > > > >> > list.getBeadByType(IListPresentationModel) as
>> > > > > > >> > DataGridColumnListPresentationModel;
>> > > > > > >> > var pm:DataGridColumnListPresentationModel =
>> > > > list.presentationModel
>> > > > > as
>> > > > > > >> > DataGridColumnListPresentationModel;
>> > > > > > >> > Commented line does not work, I need to refactor to the
>> next
>> > > one.
>> > > > > > >> >
>> > > > > > >> > in the commit I added missed coercions and need to make
>> > > > > > >> > IDataGridColumnList implement "IListWithPresentationModel"
>> > > (what I
>> > > > > > think
>> > > > > > >> > is ok since that is needed for all column lists.
>> > > > > > >> >
>> > > > > > >> > So the problem is: Why can't I retrieve the bead from the
>> > list?
>> > > > > > >> >
>> > > > > > >> > I'm thinking this could be a timing issue, since the list
>> > needs
>> > > to
>> > > > > be
>> > > > > > >> > added to the parent to process the beads and be able to
>> > retrieve
>> > > > the
>> > > > > > >> one.
>> > > > > > >> > I'll try one more test now trying to put some time out
>> after
>> > > > > > addElement.
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >> > ---------- Forwarded message ---------
>> > > > > > >> > De: Piotr Zarzycki <[email protected]>
>> > > > > > >> > Date: mié., 2 sept. 2020 a las 12:48
>> > > > > > >> > Subject: Re: NPE in DataGridView - release build of
>> > application
>> > > > > > >> > To: Apache Royale Development <[email protected]>
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >> > I have sent you.
>> > > > > > >> >
>> > > > > > >> > śr., 2 wrz 2020 o 12:41 Carlos Rovira <
>> > [email protected]>
>> > > > > > >> > napisał(a):
>> > > > > > >> >
>> > > > > > >> > > cool :)
>> > > > > > >> > > yeah send me :)
>> > > > > > >> > >
>> > > > > > >> >
>> > > > > > >> > --
>> > > > > > >> > Carlos Rovira
>> > > > > > >> > http://about.me/carlosrovira
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >> >
>> > > > > > >>
>> > > > > > >> --
>> > > > > > >> Carlos Rovira
>> > > > > > >> http://about.me/carlosrovira
>> > > > > > >>
>> > > > > > >
>> > > > > >
>> > > > >
>> > > > >
>> > > > > --
>> > > > > Carlos Rovira
>> > > > > http://about.me/carlosrovira
>> > > > >
>> > > >
>> > >
>> > >
>> > > --
>> > > Carlos Rovira
>> > > http://about.me/carlosrovira
>> > >
>> >
>>
>>
>> --
>> Carlos Rovira
>> http://about.me/carlosrovira
>>
>

Reply via email to