Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions src/org/osflash/signals/MonoSignal.as
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ package org.osflash.signals
*/
public class MonoSignal implements ISignal
{
protected var _valueClasses:Array; // of Class
protected var _valueClasses:Vector.<Class>;

protected var slot:Slot;

Expand All @@ -40,20 +40,32 @@ package org.osflash.signals
* @throws ArgumentError <code>ArgumentError</code>: 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.<Class> 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.<Class>(value.length, true) : new Vector.<Class>(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];
}
}

Expand Down Expand Up @@ -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.
Expand Down
26 changes: 19 additions & 7 deletions src/org/osflash/signals/OnceSignal.as
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ package org.osflash.signals
*/
public class OnceSignal implements IOnceSignal
{
protected var _valueClasses:Array; // of Class
protected var _valueClasses:Vector.<Class>;
protected var slots:SlotList = SlotList.NIL;

/**
Expand All @@ -46,20 +46,32 @@ package org.osflash.signals
* @throws ArgumentError <code>ArgumentError</code>: 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.<Class> 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.<Class>(value.length, true) : new Vector.<Class>(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];
}
}

Expand Down Expand Up @@ -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.
Expand Down
51 changes: 45 additions & 6 deletions src/org/osflash/signals/Slot.as
Original file line number Diff line number Diff line change
Expand Up @@ -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.<Object>;

/**
* Creates and returns a new Slot object.
Expand Down Expand Up @@ -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();
Expand All @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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.<Object> 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.<Object>(value.length, true);
for (var i:int = 0; i < value.length; i++)
{
_params[i] = value[i];
}
}

/**
* @inheritDoc
Expand Down
15 changes: 9 additions & 6 deletions src/org/osflash/signals/natives/NativeMappedSignal.as
Original file line number Diff line number Diff line change
Expand Up @@ -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.<Class>(value.length, true) : new Vector.<Class>(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];
}
}

Expand Down Expand Up @@ -168,7 +170,7 @@ package org.osflash.signals.natives
return mappingFunction();
}
}
else if (valueClasses.length == 0)
else if (valueClasses == null || valueClasses.length == 0)
{
return [];
}
Expand Down Expand Up @@ -222,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)
{
Expand Down