From 2dac2399bb3df3ac6935fbae9bd4e78f0848277a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 May 2025 17:52:32 +0000 Subject: [PATCH 1/3] Initial plan for issue From 99375b5f0a97b543cc909d4f874475eb400dbb15 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 May 2025 18:02:12 +0000 Subject: [PATCH 2/3] Convert Array to Vector in core classes Co-authored-by: robertpenner <79827+robertpenner@users.noreply.github.com> --- src/org/osflash/signals/MonoSignal.as | 26 +++++++--- src/org/osflash/signals/OnceSignal.as | 26 +++++++--- src/org/osflash/signals/Slot.as | 51 ++++++++++++++++--- .../signals/natives/NativeMappedSignal.as | 10 ++-- 4 files changed, 89 insertions(+), 24 deletions(-) diff --git a/src/org/osflash/signals/MonoSignal.as b/src/org/osflash/signals/MonoSignal.as index 8dff613..11af381 100644 --- a/src/org/osflash/signals/MonoSignal.as +++ b/src/org/osflash/signals/MonoSignal.as @@ -14,7 +14,7 @@ package org.osflash.signals */ public class MonoSignal implements ISignal { - protected var _valueClasses:Array; // of Class + protected var _valueClasses:Vector.; protected var slot:Slot; @@ -40,20 +40,32 @@ package org.osflash.signals * @throws ArgumentError ArgumentError: Invalid valueClasses argument: item at index should be a Class but was not. */ [ArrayElementType("Class")] - public function get valueClasses():Array { return _valueClasses; } + public function get valueClasses():Array + { + // Convert Vector. to Array for backward compatibility + if (_valueClasses == null) return []; + + const result:Array = []; + for (var i:int = 0; i < _valueClasses.length; i++) + { + result[i] = _valueClasses[i]; + } + return result; + } public function set valueClasses(value:Array):void { // Clone so the Array cannot be affected from outside. - _valueClasses = value ? value.slice() : []; - for (var i:int = _valueClasses.length; i--; ) + _valueClasses = value ? new Vector.(value.length, true) : new Vector.(0, true); + for (var i:int = 0; i < (value ? value.length : 0); i++) { - if (!(_valueClasses[i] is Class)) + if (!(value[i] is Class)) { throw new ArgumentError('Invalid valueClasses argument: ' + 'item at index ' + i + ' should be a Class but was:<' + - _valueClasses[i] + '>.' + getQualifiedClassName(_valueClasses[i])); + value[i] + '>.' + getQualifiedClassName(value[i])); } + _valueClasses[i] = value[i]; } } @@ -107,7 +119,7 @@ package org.osflash.signals public function dispatch(...valueObjects):void { // If valueClasses is empty, value objects are not type-checked. - const numValueClasses:int = _valueClasses.length; + const numValueClasses:int = _valueClasses ? _valueClasses.length : 0; const numValueObjects:int = valueObjects.length; // Cannot dispatch fewer objects than declared classes. diff --git a/src/org/osflash/signals/OnceSignal.as b/src/org/osflash/signals/OnceSignal.as index 227c2cf..1d40922 100644 --- a/src/org/osflash/signals/OnceSignal.as +++ b/src/org/osflash/signals/OnceSignal.as @@ -21,7 +21,7 @@ package org.osflash.signals */ public class OnceSignal implements IOnceSignal { - protected var _valueClasses:Array; // of Class + protected var _valueClasses:Vector.; protected var slots:SlotList = SlotList.NIL; /** @@ -46,20 +46,32 @@ package org.osflash.signals * @throws ArgumentError ArgumentError: Invalid valueClasses argument: item at index should be a Class but was not. */ [ArrayElementType("Class")] - public function get valueClasses():Array { return _valueClasses; } + public function get valueClasses():Array + { + // Convert Vector. to Array for backward compatibility + if (_valueClasses == null) return []; + + const result:Array = []; + for (var i:int = 0; i < _valueClasses.length; i++) + { + result[i] = _valueClasses[i]; + } + return result; + } public function set valueClasses(value:Array):void { // Clone so the Array cannot be affected from outside. - _valueClasses = value ? value.slice() : []; - for (var i:int = _valueClasses.length; i--; ) + _valueClasses = value ? new Vector.(value.length, true) : new Vector.(0, true); + for (var i:int = 0; i < (value ? value.length : 0); i++) { - if (!(_valueClasses[i] is Class)) + if (!(value[i] is Class)) { throw new ArgumentError('Invalid valueClasses argument: ' + 'item at index ' + i + ' should be a Class but was:<' + - _valueClasses[i] + '>.' + getQualifiedClassName(_valueClasses[i])); + value[i] + '>.' + getQualifiedClassName(value[i])); } + _valueClasses[i] = value[i]; } } @@ -101,7 +113,7 @@ package org.osflash.signals { // If valueClasses is empty, value objects are not type-checked. - const numValueClasses:int = _valueClasses.length; + const numValueClasses:int = _valueClasses ? _valueClasses.length : 0; const numValueObjects:int = valueObjects.length; // Cannot dispatch fewer objects than declared classes. diff --git a/src/org/osflash/signals/Slot.as b/src/org/osflash/signals/Slot.as index 592fa45..5ab3c89 100644 --- a/src/org/osflash/signals/Slot.as +++ b/src/org/osflash/signals/Slot.as @@ -13,7 +13,7 @@ package org.osflash.signals protected var _listener:Function; protected var _once:Boolean = false; protected var _priority:int = 0; - protected var _params:Array; + protected var _params:Vector.; /** * Creates and returns a new Slot object. @@ -45,7 +45,12 @@ package org.osflash.signals if (_once) remove(); if (_params && _params.length) { - _listener.apply(null, _params); + const paramsArray:Array = []; + for (var i:int = 0; i < _params.length; i++) + { + paramsArray[i] = _params[i]; + } + _listener.apply(null, paramsArray); return; } _listener(); @@ -60,7 +65,12 @@ package org.osflash.signals if (_once) remove(); if (_params && _params.length) { - _listener.apply(null, [value].concat(_params)); + const valueArray:Array = [value]; + for (var i:int = 0; i < _params.length; i++) + { + valueArray.push(_params[i]); + } + _listener.apply(null, valueArray); return; } _listener(value); @@ -78,7 +88,12 @@ package org.osflash.signals // Note: This could be expensive if we're after the fastest dispatch possible. if (_params && _params.length) { - valueObjects = valueObjects.concat(_params); + const valueObjectsCopy:Array = valueObjects.concat(); + for (var i:int = 0; i < _params.length; i++) + { + valueObjectsCopy.push(_params[i]); + } + valueObjects = valueObjectsCopy; } // NOTE: simple ifs are faster than switch: http://jacksondunstan.com/articles/1007 @@ -155,9 +170,33 @@ package org.osflash.signals /** * @inheritDoc */ - public function get params():Array { return _params; } + public function get params():Array + { + if (_params == null) return null; + + // Convert Vector. to Array for backward compatibility + const result:Array = []; + for (var i:int = 0; i < _params.length; i++) + { + result[i] = _params[i]; + } + return result; + } - public function set params(value:Array):void { _params = value; } + public function set params(value:Array):void + { + if (value == null) + { + _params = null; + return; + } + + _params = new Vector.(value.length, true); + for (var i:int = 0; i < value.length; i++) + { + _params[i] = value[i]; + } + } /** * @inheritDoc diff --git a/src/org/osflash/signals/natives/NativeMappedSignal.as b/src/org/osflash/signals/natives/NativeMappedSignal.as index eafc464..6fe1d81 100644 --- a/src/org/osflash/signals/natives/NativeMappedSignal.as +++ b/src/org/osflash/signals/natives/NativeMappedSignal.as @@ -56,16 +56,18 @@ package org.osflash.signals.natives */ override public function set valueClasses(value:Array):void { - _valueClasses = value ? value.slice() : []; + // Clone so the Array cannot be affected from outside. + _valueClasses = value ? new Vector.(value.length, true) : new Vector.(0, true); - for (var i:int = _valueClasses.length; i--; ) + for (var i:int = 0; i < (value ? value.length : 0); i++) { - if (!(_valueClasses[i] is Class)) + if (!(value[i] is Class)) { throw new ArgumentError('Invalid valueClasses argument: ' + 'item at index ' + i + ' should be a Class but was:<' + - _valueClasses[i] + '>.' + getQualifiedClassName(_valueClasses[i])); + value[i] + '>.' + getQualifiedClassName(value[i])); } + _valueClasses[i] = value[i]; } } From 9d702f7a3f79998ed01e68b6919231a7731764a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 May 2025 18:05:33 +0000 Subject: [PATCH 3/3] Fix additional Vector handling in NativeMappedSignal Co-authored-by: robertpenner <79827+robertpenner@users.noreply.github.com> --- src/org/osflash/signals/natives/NativeMappedSignal.as | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/osflash/signals/natives/NativeMappedSignal.as b/src/org/osflash/signals/natives/NativeMappedSignal.as index 6fe1d81..254f07f 100644 --- a/src/org/osflash/signals/natives/NativeMappedSignal.as +++ b/src/org/osflash/signals/natives/NativeMappedSignal.as @@ -170,7 +170,7 @@ package org.osflash.signals.natives return mappingFunction(); } } - else if (valueClasses.length == 0) + else if (valueClasses == null || valueClasses.length == 0) { return []; } @@ -224,7 +224,8 @@ package org.osflash.signals.natives if (mappedData is Array) { - if (valueClasses.length == 1 && valueClasses[0] == Array)//TODO invariant + const numValueClasses:int = valueClasses ? valueClasses.length : 0; + if (numValueClasses == 1 && valueClasses[0] == Array)//TODO invariant { while (slotsToProcess.nonEmpty) {