Thanks, Greg! -- Josh Tynjala Bowler Hat LLC <https://bowlerhat.dev>
On Mon, Oct 14, 2019 at 5:08 PM Greg Dove <greg.d...@gmail.com> wrote: > Thanks for bringing that to my attention, Josh. it should be fixed now (I > tested with your example, thanks for that). > > On Tue, Oct 15, 2019 at 10:31 AM Greg Dove <greg.d...@gmail.com> wrote: > > > > > Hi Josh, thanks, I will look into that today. > > > > > > On Tue, Oct 15, 2019 at 10:30 AM Josh Tynjala <joshtynj...@apache.org> > > wrote: > > > >> Hey Greg, > >> > >> Starting with the commit, there are times when compilation gets stuck in > >> an infinite loop. It should be possible to reproduce using the following > >> code: > >> > >> for each(var key:Object in Fake.hello) > >> { > >> } > >> > >> "Fake" is a class that does not exist. It should result in an error, but > >> the compiler seems to get stuck trying to resolve it over and over > again. > >> > >> - Josh > >> > >> On 2019/10/02 08:39:35, gregd...@apache.org wrote: > >> > This is an automated email from the ASF dual-hosted git repository. > >> > > >> > gregdove pushed a commit to branch develop > >> > in repository https://gitbox.apache.org/repos/asf/royale-asjs.git > >> > > >> > commit e52954b22a4599c75ba242955273627867e00e4d > >> > Author: greg-dove <greg.d...@gmail.com> > >> > AuthorDate: Sun Sep 29 15:16:21 2019 +1300 > >> > > >> > RoyaleArrayLike support (IArrayList and BinaryData) > >> > --- > >> > frameworks/projects/Collections/pom.xml | 14 ++ > >> > .../src/main/config/compile-swf-config.xml | 1 + > >> > .../src/main/royale/CollectionsClasses.as | 2 + > >> > .../org/apache/royale/collections/ArrayList.as | 2 +- > >> > .../org/apache/royale/collections/IArrayList.as | 13 +- > >> > frameworks/projects/Core/pom.xml | 19 +- > >> > .../Core/src/main/config/compile-swf-config.xml | 6 +- > >> > .../projects/Core/src/main/royale/CoreClasses.as | 3 + > >> > .../royale/org/apache/royale/utils/BinaryData.as | 11 +- > >> > .../Language/src/main/royale/LanguageClasses.as | 2 +- > >> > .../apache/royale/language/iterator/arrayLike.as | 73 +++++++ > >> > .../main/royale/flexUnitTests/LanguageTester.as | 8 +- > >> > .../language/LanguageTesterTestArraylikeGetSet.as | 227 > >> +++++++++++++++++++++ > >> > .../language/LanguageTesterTestForEach.as | 205 > >> +++++++++++++++++++ > >> > .../language/support/checkArrayLikeFunc.as | 30 +-- > >> > 15 files changed, 587 insertions(+), 29 deletions(-) > >> > > >> > diff --git a/frameworks/projects/Collections/pom.xml > >> b/frameworks/projects/Collections/pom.xml > >> > index a105423..59cb218 100644 > >> > --- a/frameworks/projects/Collections/pom.xml > >> > +++ b/frameworks/projects/Collections/pom.xml > >> > @@ -60,6 +60,20 @@ > >> > <dependencies> > >> > <dependency> > >> > <groupId>org.apache.royale.framework</groupId> > >> > + <artifactId>Language</artifactId> > >> > + <version>0.9.6-SNAPSHOT</version> > >> > + <type>swc</type> > >> > + <classifier>swf</classifier> > >> > + </dependency> > >> > + <dependency> > >> > + <groupId>org.apache.royale.framework</groupId> > >> > + <artifactId>Language</artifactId> > >> > + <version>0.9.6-SNAPSHOT</version> > >> > + <type>swc</type> > >> > + <classifier>js</classifier> > >> > + </dependency> > >> > + <dependency> > >> > + <groupId>org.apache.royale.framework</groupId> > >> > <artifactId>Core</artifactId> > >> > <version>0.9.6-SNAPSHOT</version> > >> > <type>swc</type> > >> > diff --git > >> a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml > >> b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml > >> > index 6116aec..1c00110 100644 > >> > --- > >> a/frameworks/projects/Collections/src/main/config/compile-swf-config.xml > >> > +++ > >> b/frameworks/projects/Collections/src/main/config/compile-swf-config.xml > >> > @@ -31,6 +31,7 @@ > >> > <external-library-path> > >> > > >> > <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element> > >> > <path-element>../../../../../libs/Core.swc</path-element> > >> > + > >> <path-element>../../../../../libs/Language.swc</path-element> > >> > </external-library-path> > >> > > >> > <mxml> > >> > diff --git > >> a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as > >> b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as > >> > index fe946df..ecc1033 100644 > >> > --- > >> a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as > >> > +++ > >> b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as > >> > @@ -43,6 +43,8 @@ internal class CollectionsClasses > >> > import org.apache.royale.collections.SortField; SortField; > >> > import org.apache.royale.collections.SortFieldCompareTypes; > >> SortFieldCompareTypes; > >> > import org.apache.royale.collections.CompareUtils; CompareUtils; > >> > + > >> > + import org.apache.royale.language.iterator.arrayLike;arrayLike; > >> > > >> > } > >> > > >> > diff --git > >> > a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as > >> > b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as > >> > index 38164aa..75ea856 100644 > >> > --- > >> > a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as > >> > +++ > >> > b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as > >> > @@ -34,7 +34,6 @@ package org.apache.royale.collections > >> > import flash.utils.IDataInput; > >> > import flash.utils.IDataOutput; > >> > } > >> > - > >> > > >> > //-------------------------------------- > >> > // Events > >> > @@ -90,6 +89,7 @@ package org.apache.royale.collections > >> > * @productversion Royale 0.0 > >> > */ > >> > [Event(name="itemUpdated", > >> type="org.apache.royale.events.CollectionEvent")] > >> > + > >> > > >> > /** > >> > * The ArrayList class provides an event-driven wrapper for the > >> > diff --git > >> > a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as > >> > b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as > >> > index 32638b0..454d27f 100644 > >> > --- > >> > a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as > >> > +++ > >> > b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/IArrayList.as > >> > @@ -27,8 +27,17 @@ package org.apache.royale.collections > >> > import org.apache.royale.collections.converters.IItemConverter; > >> > > >> > //-------------------------------------- > >> > - > >> > - > >> > + > >> > + /** > >> > + * Support for Arraylike access (typed index access via []) and > >> also via iteration when used with for-each loops. > >> > + * > >> > + * @langversion 3.0 > >> > + * @playerversion Flash 10.2 > >> > + * @playerversion AIR 2.6 > >> > + * @productversion Royale 0.0 > >> > + */ > >> > + > >> > [RoyaleArrayLike(getValue="getItemAt",setValue="setItemAt",setterArgSequence="value,index",length="length",lengthAccess="getter")] > >> > + > >> > /** > >> > * The ArrayList class provides an event-driven wrapper for the > >> > * standard Array. Events are dispatched when items are added, > >> removed, > >> > diff --git a/frameworks/projects/Core/pom.xml > >> b/frameworks/projects/Core/pom.xml > >> > index 947ce17..49b3b6f 100644 > >> > --- a/frameworks/projects/Core/pom.xml > >> > +++ b/frameworks/projects/Core/pom.xml > >> > @@ -68,5 +68,22 @@ > >> > </plugin> > >> > </plugins> > >> > </build> > >> > - > >> > + <dependencies> > >> > + <!-- Language is included to permit a concrete reference > >> > + to the arrayLike iterator to be re-exported, so that it is > always > >> available --> > >> > + <dependency> > >> > + <groupId>org.apache.royale.framework</groupId> > >> > + <artifactId>Language</artifactId> > >> > + <version>0.9.6-SNAPSHOT</version> > >> > + <type>swc</type> > >> > + <classifier>swf</classifier> > >> > + </dependency> > >> > + <dependency> > >> > + <groupId>org.apache.royale.framework</groupId> > >> > + <artifactId>Language</artifactId> > >> > + <version>0.9.6-SNAPSHOT</version> > >> > + <type>swc</type> > >> > + <classifier>js</classifier> > >> > + </dependency> > >> > + </dependencies> > >> > </project> > >> > diff --git > >> a/frameworks/projects/Core/src/main/config/compile-swf-config.xml > >> b/frameworks/projects/Core/src/main/config/compile-swf-config.xml > >> > index 265d4d8..4d0d2a7 100644 > >> > --- a/frameworks/projects/Core/src/main/config/compile-swf-config.xml > >> > +++ b/frameworks/projects/Core/src/main/config/compile-swf-config.xml > >> > @@ -31,7 +31,11 @@ > >> > <external-library-path> > >> > > >> > <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element> > >> > </external-library-path> > >> > - > >> > + > >> > + <library-path> > >> > + > >> <path-element>../../../../../libs/Language.swc</path-element> > >> > + </library-path> > >> > + > >> > <allow-subclass-overrides>true</allow-subclass-overrides> > >> > > >> > <mxml> > >> > diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as > >> b/frameworks/projects/Core/src/main/royale/CoreClasses.as > >> > index 4e258c7..6d03a3b 100644 > >> > --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as > >> > +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as > >> > @@ -324,6 +324,9 @@ internal class CoreClasses > >> > > >> > import org.apache.royale.core.TextLineMetrics; TextLineMetrics; > >> > import org.apache.royale.utils.ClassSelectorList; > >> ClassSelectorList; > >> > + > >> > + //explicit support for RoyaleArrayLike for each iteration > >> (BinaryData) > >> > + import org.apache.royale.language.iterator.arrayLike;arrayLike; > >> > } > >> > > >> > } > >> > diff --git > >> > a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as > >> > b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as > >> > index 2143d31..483bfb1 100644 > >> > --- > >> > a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as > >> > +++ > >> > b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/BinaryData.as > >> > @@ -27,7 +27,16 @@ COMPILE::JS > >> > { > >> > import goog.DEBUG; > >> > } > >> > - > >> > + > >> > +/** > >> > + * Support for Arraylike access (typed index access via []) and also > >> iteration when used with for-each loops. > >> > + * > >> > + * @langversion 3.0 > >> > + * @playerversion Flash 10.2 > >> > + * @playerversion AIR 2.6 > >> > + * @productversion Royale 0.0 > >> > + */ > >> > > >> > +[RoyaleArrayLike(getValue="readByteAt",setValue="writeByteAt",setterArgSequence="index,value",length="length",lengthAccess="getter")] > >> > > >> > /** > >> > * The BinaryData class is a class that represents binary data. The > >> way > >> > diff --git > >> a/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> b/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > index 2d4388e..f0e5ed3 100644 > >> > --- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > +++ b/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > @@ -31,10 +31,10 @@ internal class LanguageClasses > >> > import org.apache.royale.utils.Language; Language; > >> > import QName; QName; > >> > import Namespace; Namespace; > >> > - > >> > } > >> > import org.apache.royale.language.string.match; match; > >> > import org.apache.royale.language.string.search; search; > >> > + import org.apache.royale.language.iterator.arrayLike; arrayLike; > >> > } > >> > > >> > } > >> > diff --git > >> > a/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as > >> > b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as > >> > new file mode 100644 > >> > index 0000000..38b1c65 > >> > --- /dev/null > >> > +++ > >> > b/frameworks/projects/Language/src/main/royale/org/apache/royale/language/iterator/arrayLike.as > >> > @@ -0,0 +1,73 @@ > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +// > >> > +// Licensed to the Apache Software Foundation (ASF) under one or > more > >> > +// contributor license agreements. See the NOTICE file distributed > >> with > >> > +// this work for additional information regarding copyright > ownership. > >> > +// The ASF licenses this file to You under the Apache License, > >> Version 2.0 > >> > +// (the "License"); you may not use this file except in compliance > >> with > >> > +// the License. You may obtain a copy of the License at > >> > +// > >> > +// http://www.apache.org/licenses/LICENSE-2.0 > >> > +// > >> > +// Unless required by applicable law or agreed to in writing, > software > >> > +// distributed under the License is distributed on an "AS IS" BASIS, > >> > +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> > +// See the License for the specific language governing permissions > and > >> > +// limitations under the License. > >> > +// > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +package org.apache.royale.language.iterator > >> > +{ > >> > + /** > >> > + * Used by the compiler for classes with [RoyaleArrayLike] > >> metadata when processing for each loops > >> > + * @param forInstance the instance to be checked > >> > + * @param lengthCheck either a string that represents a property > >> to return length value, or a function method reference, e.g. > >> instance.length() > >> > + * @param getAt the String name of the accessor for the item at > >> index... e.g. 'getItemAt'. If null it will default to Array Access [] > >> > + * @param lengthIsMethodCall true if the length accessor is an > >> explicit method call instead of a getter > >> > + * @return a lightweight iterator Object with hasNext() and > next() > >> methods > >> > + * > >> > + * @royalesuppressexport > >> > + */ > >> > + public function arrayLike(forInstance:Object, lengthCheck:String, > >> getAt:String, lengthIsMethodCall:Boolean):Object{ > >> > + if (forInstance) { > >> > + var i:int = 0; > >> > + var ret:Object = { }; > >> > + if (lengthIsMethodCall) { > >> > + ret['hasNext'] = function():Boolean{ > >> > + return i < forInstance[lengthCheck](); > >> > + } > >> > + } else { > >> > + ret['hasNext'] = function():Boolean{ > >> > + return i < forInstance[lengthCheck] > >> > + } > >> > + } > >> > + if (getAt != null){ > >> > + ret['next'] = function():*{ > >> > + return forInstance[getAt](i++); > >> > + } > >> > + } else { > >> > + ret['next'] = function():*{ > >> > + return forInstance[i++]; > >> > + } > >> > + } > >> > + } else { > >> > + //no need to create a new instance: > >> > + ret = NULL_ITERABLE; > >> > + } > >> > + return ret; > >> > + } > >> > +} > >> > +/** > >> > + * @royalesuppressexport > >> > + */ > >> > +const NULL_ITERABLE:* = { > >> > + 'hasNext':function():Boolean{ > >> > + return false; > >> > + }, > >> > + 'next':function():*{ > >> > + //this should never be called in compiler-generated code in > >> any case > >> > + throw new TypeError('Cannot iterate over a null object > >> reference'); > >> > + } > >> > +}; > >> > + > >> > + > >> > diff --git > >> a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as > >> b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as > >> > index 441932b..52337ba 100644 > >> > --- > >> a/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as > >> > +++ > >> b/manualtests/UnitTests/src/main/royale/flexUnitTests/LanguageTester.as > >> > @@ -30,7 +30,7 @@ package flexUnitTests > >> > public function LanguageTester() > >> > { > >> > // see notes in CoreTester > >> > - var arr:Array = [LanguageTesterTestIs, > >> LanguageTesterIntUint, > LanguageTesterTestVector,LanguageTesterTestClass]; > >> > + // var arr:Array = [LanguageTesterTestIs, > >> LanguageTesterIntUint, > LanguageTesterTestVector,LanguageTesterTestClass]; > >> > } > >> > > >> > public var languageTestIs:LanguageTesterTestIs; > >> > @@ -40,5 +40,11 @@ package flexUnitTests > >> > public var languageTestVector:LanguageTesterTestVector; > >> > > >> > public var languageTestClass:LanguageTesterTestClass; > >> > + > >> > + public var languageTestForeach:LanguageTesterTestForEach; > >> > + > >> > + public var > languageTestgetSet:LanguageTesterTestArraylikeGetSet > >> > + > >> > + > >> > } > >> > } > >> > diff --git > >> > a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as > >> > new file mode 100644 > >> > index 0000000..8ff14fe > >> > --- /dev/null > >> > +++ > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestArraylikeGetSet.as > >> > @@ -0,0 +1,227 @@ > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +// > >> > +// Licensed to the Apache Software Foundation (ASF) under one or > more > >> > +// contributor license agreements. See the NOTICE file distributed > >> with > >> > +// this work for additional information regarding copyright > ownership. > >> > +// The ASF licenses this file to You under the Apache License, > >> Version 2.0 > >> > +// (the "License"); you may not use this file except in compliance > >> with > >> > +// the License. You may obtain a copy of the License at > >> > +// > >> > +// http://www.apache.org/licenses/LICENSE-2.0 > >> > +// > >> > +// Unless required by applicable law or agreed to in writing, > software > >> > +// distributed under the License is distributed on an "AS IS" BASIS, > >> > +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> > +// See the License for the specific language governing permissions > and > >> > +// limitations under the License. > >> > +// > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +package flexUnitTests.language > >> > +{ > >> > + > >> > + > >> > + import org.apache.royale.test.asserts.*; > >> > + > >> > + import flexUnitTests.language.support.*; > >> > + import org.apache.royale.collections.ArrayList; > >> > + import org.apache.royale.collections.ArrayListView; > >> > + import org.apache.royale.collections.IArrayList; > >> > + import org.apache.royale.utils.BinaryData; > >> > + import testshim.RoyaleUnitTestRunner; > >> > + > >> > + /** > >> > + * @royalesuppresspublicvarwarning > >> > + */ > >> > + public class LanguageTesterTestArraylikeGetSet > >> > + { > >> > + > >> > + public static var isJS:Boolean = COMPILE::JS; > >> > + > >> > + [BeforeClass] > >> > + public static function setUpBeforeClass():void > >> > + { > >> > + > >> > + } > >> > + > >> > + [AfterClass] > >> > + public static function tearDownAfterClass():void > >> > + { > >> > + } > >> > + > >> > + [Before] > >> > + public function setUp():void > >> > + { > >> > + arrayList= new ArrayList(['dog', > 'cat','mouse','gerbil']); > >> > + } > >> > + > >> > + [After] > >> > + public function tearDown():void > >> > + { > >> > + } > >> > + > >> > + > >> > + /*public function LanguageTesterTestArraylikeGetSet(){ > >> > + > >> > + }*/ > >> > + > >> > + public var arrayList:ArrayList; > >> > + > >> > + /* [Test] > >> > + public function testImpl():void > >> > + { > >> > + var other:ArrayList = new ArrayList([1,2,3]); > >> > + var local:ArrayList = new ArrayList(['gerbil','something > >> else']); > >> > + arrayList[0] = local[0]; > >> > + assertEquals(arrayList.getItemAt(0),'gerbil', 'unexpected > >> get/set result') > >> > + > >> //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); > >> > + arrayList.setItemAt('manually assigned gerbil',0); > >> > + > >> RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); > >> > + if (arrayList[0] == 'manually assigned gerbil') { > >> > + arrayList[0] = local[1]; > >> > + } > >> > + assertEquals(arrayList.getItemAt(0),'something else', > >> 'unexpected get/set result'); > >> > + var collect:Array = []; > >> > + for(var i:int =0; i<other[2];i++) { // 'getItemAt' used > in > >> here > >> > + collect.push(other[i]); //'getItemAt' > >> > + } > >> > + assertEquals(collect.toString(),'1,2,3', 'unexpected loop > >> result'); > >> > + > >> > + if (arrayList[0] == 'not the value') { > >> > + arrayList[0] = 'bad assignment'; > >> > + } else { > >> > + arrayList[0] = 'correct assignment'; > >> > + } > >> > + assertEquals(arrayList.getItemAt(0),'correct assignment', > >> 'unexpected assignment result in else block'); > >> > + > >> RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); > >> > + > >> > + try{ > >> > + arrayList[0] = "inside try"; > >> > + } catch (e:Error) > >> > + { > >> > + //no error > >> > + } finally{ > >> > + arrayList[1] = "inside finally"; > >> > + } > >> > + assertEquals(arrayList.getItemAt(0),'inside try', > >> 'unexpected try/catch/finally result'); > >> > + assertEquals(arrayList.getItemAt(1),'inside finally', > >> 'unexpected try/catch/finally result'); > >> > + > >> > + } > >> > + > >> > + [Test] > >> > + public function testSubClass():void{ > >> > + //test 'inheritance' via class (ArrayListView in this > case) > >> > + arrayList= new ArrayList(['dog', > 'cat','mouse','gerbil']); > >> > + var other:ArrayList = new ArrayList([1,2,3]); > >> > + var local:ArrayList = new ArrayList(['gerbil','something > >> else']); > >> > + > >> > + var alv:ArrayListView = new ArrayListView(arrayList); > >> > + var alv1:ArrayListView = new ArrayListView(other); > >> > + var alv2:ArrayListView = new ArrayListView(local); > >> > + alv[0] = alv2[0]; > >> > + assertEquals(alv.getItemAt(0),'gerbil', 'unexpected > >> get/set result'); > >> > + > >> //RoyaleUnitTestRunner.consoleOut(arrayList.source.toString()); > >> > + alv.setItemAt('manually assigned gerbil',0); > >> > + RoyaleUnitTestRunner.consoleOut(alv.source.toString()); > >> > + if (alv[0] == 'manually assigned gerbil') { > >> > + alv[0] = alv2[1]; > >> > + } > >> > + assertEquals(alv.getItemAt(0),'something else', > >> 'unexpected get/set result'); > >> > + var collect:Array = []; > >> > + for(var i:int =0; i<alv1[2];i++) { // 'getItemAt' used in > >> here > >> > + collect.push(alv1[i]); //'getItemAt' > >> > + } > >> > + assertEquals(collect.toString(),'1,2,3', 'unexpected loop > >> result'); > >> > + > >> > + if (alv[0] == 'not the value') { > >> > + alv[0] = 'bad assignment'; > >> > + } else { > >> > + alv[0] = 'correct assignment'; > >> > + } > >> > + assertEquals(alv.getItemAt(0),'correct assignment', > >> 'unexpected assignment result in else block'); > >> > + RoyaleUnitTestRunner.consoleOut(alv.source.toString()); > >> > + > >> > + try{ > >> > + alv[0] = "inside try"; > >> > + } catch (e:Error) > >> > + { > >> > + //no error > >> > + } finally{ > >> > + alv[1] = "inside finally"; > >> > + } > >> > + assertEquals(alv.getItemAt(0),'inside try', 'unexpected > >> try/catch/finally result'); > >> > + assertEquals(alv.getItemAt(1),'inside finally', > >> 'unexpected try/catch/finally result'); > >> > + } > >> > + */ > >> > + > >> > + [Test] > >> > + public function testNested():void > >> > + { > >> > + arrayList= new ArrayList(['dog', > 'cat','mouse','gerbil']); > >> > + > >> > + var f:Function = function something():String{ > >> > + arrayList[1] = 'another dog'; > >> > + return arrayList[1] as String; > >> > + }; > >> > + > >> > + var f2:Function = function():String{ > >> > + arrayList[1] = 'yet another dog'; > >> > + return arrayList[1] as String; > >> > + }; > >> > + > >> > + var check:String = f(); > >> > + assertEquals(check,'another dog', 'unexpected get/set > >> result'); > >> > + > >> > + assertEquals(arrayList.getItemAt(1),'another dog', > >> 'unexpected get/set result'); > >> > + > >> > + check = f2(); > >> > + assertEquals(check,'yet another dog', 'unexpected get/set > >> result'); > >> > + > >> > + assertEquals(arrayList.getItemAt(1),'yet another dog', > >> 'unexpected get/set result'); > >> > + > >> > + } > >> > + > >> > + private function localReturn(val:ArrayList):String{ > >> > + val[0] = 'get and set from localMethod'; > >> > + return val[0] as String; > >> > + } > >> > + > >> > + [Test] > >> > + public function testLocalMethodReturn():void{ > >> > + arrayList= new ArrayList(['dog', > 'cat','mouse','gerbil']); > >> > + > >> > + var check:String = localReturn(arrayList); > >> > + assertEquals(check,'get and set from localMethod', > >> 'unexpected get/set result'); > >> > + assertEquals(arrayList.getItemAt(0),'get and set from > >> localMethod', 'unexpected get/set result'); > >> > + } > >> > + > >> > + > >> > + [Test] > >> > + public function testExternalFunc():void{ > >> > + arrayList= new ArrayList(['dog', > 'cat','mouse','gerbil']); > >> > + > >> > + var check:String = checkArrayLikeFunc(arrayList); > >> > + assertEquals(check,'get and set from checkArrayLikeFunc', > >> 'unexpected get/set result'); > >> > + assertEquals(arrayList.getItemAt(0),'get and set from > >> checkArrayLikeFunc', 'unexpected get/set result'); > >> > + } > >> > + > >> > + > >> > + public function testBinaryData():void{ > >> > + var bd:BinaryData = new BinaryData(); > >> > + bd.length = 100; > >> > + var checkVal:uint = 0; > >> > + for (var i:uint=0;i<100;i++) { > >> > + checkVal += i; > >> > + bd[i] = i; > >> > + } > >> > + var summationCheck:uint=0; > >> > + for each(var byte:uint in bd) { > >> > + summationCheck += byte; > >> > + } > >> > + assertEquals(bd[99], 99, 'unexpected value at index'); > >> > + assertEquals(summationCheck, checkVal, 'unexpected check > >> on result') > >> > + } > >> > + > >> > + > >> > + > >> > + } > >> > +} > >> > diff --git > >> > a/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as > >> > new file mode 100644 > >> > index 0000000..2a2c2e2 > >> > --- /dev/null > >> > +++ > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/LanguageTesterTestForEach.as > >> > @@ -0,0 +1,205 @@ > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +// > >> > +// Licensed to the Apache Software Foundation (ASF) under one or > more > >> > +// contributor license agreements. See the NOTICE file distributed > >> with > >> > +// this work for additional information regarding copyright > ownership. > >> > +// The ASF licenses this file to You under the Apache License, > >> Version 2.0 > >> > +// (the "License"); you may not use this file except in compliance > >> with > >> > +// the License. You may obtain a copy of the License at > >> > +// > >> > +// http://www.apache.org/licenses/LICENSE-2.0 > >> > +// > >> > +// Unless required by applicable law or agreed to in writing, > software > >> > +// distributed under the License is distributed on an "AS IS" BASIS, > >> > +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >> implied. > >> > +// See the License for the specific language governing permissions > and > >> > +// limitations under the License. > >> > +// > >> > > >> > +//////////////////////////////////////////////////////////////////////////////// > >> > +package flexUnitTests.language > >> > +{ > >> > + > >> > + > >> > + import org.apache.royale.test.asserts.*; > >> > + > >> > + import flexUnitTests.language.support.*; > >> > + import org.apache.royale.collections.ArrayList; > >> > + import org.apache.royale.collections.IArrayList; > >> > + > >> > + import testshim.RoyaleUnitTestRunner; > >> > + > >> > + /** > >> > + * @royalesuppresspublicvarwarning > >> > + */ > >> > + public class LanguageTesterTestForEach > >> > + { > >> > + /*import org.apache.royale.language.iterator.arrayLike;*/ > >> > + > >> > + public static var isJS:Boolean = COMPILE::JS; > >> > + > >> > + [BeforeClass] > >> > + public static function setUpBeforeClass():void > >> > + { > >> > + > >> > + } > >> > + > >> > + [AfterClass] > >> > + public static function tearDownAfterClass():void > >> > + { > >> > + } > >> > + > >> > + [Before] > >> > + public function setUp():void > >> > + { > >> > + _myList = new ArrayList(['dog', 'cat','mouse','gerbil']) > >> > + } > >> > + > >> > + [After] > >> > + public function tearDown():void > >> > + { > >> > + } > >> > + private var _animal:String; > >> > + private var _char:String; > >> > + private var _myList:ArrayList > >> > + > >> > + > >> > + [Test] > >> > + public function testNested1():void > >> > + { > >> > + var arrayList:ArrayList = new ArrayList(['dog', > >> 'cat','mouse','gerbil']); > >> > + > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(var animal:String in arrayList) { > >> > + foundItems.push(animal); > >> > + var deepList:ArrayList = new > >> ArrayList(animal.split('')); > >> > + for each(var char:String in deepList) { > >> > + // RoyaleUnitTestRunner.consoleOut(char); > >> > + charItems.push(char); > >> > + } > >> > + } > >> > + // RoyaleUnitTestRunner.consoleOut(value + ''); > >> > + assertEquals(foundItems.toString(), > >> 'dog,cat,mouse,gerbil', 'unexpected for each result'); > >> > + //check nested loop content > >> > + assertEquals(charItems.toString(), > >> 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); > >> > + } > >> > + > >> > + > >> > + > >> > + [Test] > >> > + public function testNested1a():void > >> > + { > >> > + var array:Array=['dog', 'cat','mouse','gerbil']; > >> > + > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(_animal in array) { > >> > + foundItems.push(_animal); > >> > + var deepList:Array = _animal.split(''); > >> > + for each(_char in deepList) { > >> > + // RoyaleUnitTestRunner.consoleOut(char); > >> > + charItems.push(_char); > >> > + } > >> > + } > >> > + // RoyaleUnitTestRunner.consoleOut(value + ''); > >> > + assertEquals(foundItems.toString(), > >> 'dog,cat,mouse,gerbil', 'unexpected for each result'); > >> > + //check nested loop content > >> > + assertEquals(charItems.toString(), > >> 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); > >> > + } > >> > + > >> > + [Test] > >> > + public function testNested1b():void > >> > + { > >> > + //using a target referenced externally > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(_animal in _myList) { > >> > + foundItems.push(_animal); > >> > + var deepList:ArrayList = new > >> ArrayList(_animal.split('')); > >> > + for each(_char in deepList) { > >> > + // RoyaleUnitTestRunner.consoleOut(char); > >> > + charItems.push(_char); > >> > + } > >> > + } > >> > + // RoyaleUnitTestRunner.consoleOut(value + ''); > >> > + assertEquals(foundItems.toString(), > >> 'dog,cat,mouse,gerbil', 'unexpected for each result'); > >> > + //check nested loop content > >> > + assertEquals(charItems.toString(), > >> 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); > >> > + } > >> > + > >> > + > >> > + [Test] > >> > + public function testNested2():void > >> > + { > >> > + var arrayList:ArrayList = new ArrayList(['dog', > >> 'cat','mouse','gerbil']); > >> > + > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(_animal in arrayList) { > >> > + foundItems.push(_animal); > >> > + var deepList:ArrayList = new > >> ArrayList(_animal.split('')); > >> > + for each(_char in deepList) { > >> > + // RoyaleUnitTestRunner.consoleOut(char); > >> > + charItems.push(_char); > >> > + } > >> > + } > >> > + // RoyaleUnitTestRunner.consoleOut(value + ''); > >> > + assertEquals(foundItems.toString(), > >> 'dog,cat,mouse,gerbil', 'unexpected for each result'); > >> > + //check nested loop content > >> > + assertEquals(charItems.toString(), > >> 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); > >> > + } > >> > + > >> > + > >> > + [Test] > >> > + public function testNested3():void > >> > + { > >> > + var arrayList:IArrayList = new ArrayList(['dog', > >> 'cat','mouse','gerbil']); > >> > + > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(_animal in arrayList) { > >> > + foundItems.push(_animal); > >> > + var deepList:IArrayList = new > >> ArrayList(_animal.split('')); > >> > + for each(_char in deepList) { > >> > + // RoyaleUnitTestRunner.consoleOut(char); > >> > + charItems.push(_char); > >> > + } > >> > + } > >> > + // RoyaleUnitTestRunner.consoleOut(value + ''); > >> > + assertEquals(foundItems.toString(), > >> 'dog,cat,mouse,gerbil', 'unexpected for each result'); > >> > + //check nested loop content > >> > + assertEquals(charItems.toString(), > >> 'd,o,g,c,a,t,m,o,u,s,e,g,e,r,b,i,l', 'unexpected for each result'); > >> > + } > >> > + > >> > + > >> > + [Test] > >> > + public function testXML():void{ > >> > + var xm:XML = <test><child><child/></child></test>; > >> > + RoyaleUnitTestRunner.consoleOut('xml' ); > >> > + for each(var xml:XML in xm..child) { > >> > + RoyaleUnitTestRunner.consoleOut(xml.toXMLString() ); > >> > + } > >> > + RoyaleUnitTestRunner.consoleOut('thing' ); > >> > + for each(var thing:XML in xm) { > >> > + RoyaleUnitTestRunner.consoleOut(thing.toXMLString() > ); > >> > + } > >> > + assertTrue(true) > >> > + } > >> > + > >> > + > >> > + [Test] > >> > + public function tesTargetMutation():void{ > >> > + var arrayList:ArrayList = new ArrayList(['dog', > >> 'cat','mouse','gerbil']); > >> > + > >> > + var foundItems:Array = []; > >> > + var charItems:Array = []; > >> > + for each(_animal in arrayList) { > >> > + foundItems.push(_animal); > >> > + if (arrayList.length) arrayList.removeAll();//should > >> stop iterating after first item > >> > + } > >> > + assertEquals(foundItems.toString(), 'dog', 'unexpected > for > >> each result'); > >> > + } > >> > + > >> > + > >> > + } > >> > +} > >> > diff --git > >> a/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as > >> > similarity index 66% > >> > copy from > >> frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > copy to > >> > manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as > >> > index 2d4388e..11ae093 100644 > >> > --- a/frameworks/projects/Language/src/main/royale/LanguageClasses.as > >> > +++ > >> > b/manualtests/UnitTests/src/main/royale/flexUnitTests/language/support/checkArrayLikeFunc.as > >> > @@ -16,26 +16,14 @@ > >> > // limitations under the License. > >> > // > >> > > >> > //////////////////////////////////////////////////////////////////////////////// > >> > -package { > >> > - > >> > -/** > >> > - * @private > >> > - * This class is used to link additional classes into Language.swc > >> > - * beyond those that are found by dependency analysis starting > >> > - * from the classes specified in manifest.xml. > >> > - */ > >> > -internal class LanguageClasses > >> > +package flexUnitTests.language.support > >> > { > >> > - COMPILE::JS > >> > - { > >> > - import org.apache.royale.utils.Language; Language; > >> > - import QName; QName; > >> > - import Namespace; Namespace; > >> > - > >> > - } > >> > - import org.apache.royale.language.string.match; match; > >> > - import org.apache.royale.language.string.search; search; > >> > + import org.apache.royale.collections.ArrayList; > >> > + > >> > + public function checkArrayLikeFunc(val:ArrayList):String > >> > + { > >> > + val[0] = 'get and set from checkArrayLikeFunc'; > >> > + return val[0] as String; > >> > + // return val.getItemAt(0) as String; > >> > + } > >> > } > >> > - > >> > -} > >> > - > >> > > >> > > >> > > >