You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@royale.apache.org by Greg Dove <gr...@gmail.com> on 2019/10/14 21:31:44 UTC
Re: [royale-asjs] 01/06: RoyaleArrayLike support (IArrayList and BinaryData)
Hi Josh, thanks, I will look into that today.
On Tue, Oct 15, 2019 at 10:30 AM Josh Tynjala <jo...@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, gregdove@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 <gr...@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;
> > + }
> > }
> > -
> > -}
> > -
> >
> >
>
Re: [royale-asjs] 01/06: RoyaleArrayLike support (IArrayList and BinaryData)
Posted by Josh Tynjala <jo...@bowlerhat.dev>.
Thanks, Greg!
--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>
On Mon, Oct 14, 2019 at 5:08 PM Greg Dove <gr...@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 <gr...@gmail.com> wrote:
>
> >
> > Hi Josh, thanks, I will look into that today.
> >
> >
> > On Tue, Oct 15, 2019 at 10:30 AM Josh Tynjala <jo...@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, gregdove@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 <gr...@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;
> >> > + }
> >> > }
> >> > -
> >> > -}
> >> > -
> >> >
> >> >
> >>
> >
>
Re: [royale-asjs] 01/06: RoyaleArrayLike support (IArrayList and BinaryData)
Posted by Greg Dove <gr...@gmail.com>.
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 <gr...@gmail.com> wrote:
>
> Hi Josh, thanks, I will look into that today.
>
>
> On Tue, Oct 15, 2019 at 10:30 AM Josh Tynjala <jo...@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, gregdove@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 <gr...@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;
>> > + }
>> > }
>> > -
>> > -}
>> > -
>> >
>> >
>>
>