Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit ae0ba2c

Browse files
Optimizing disposables
1 parent ea222a5 commit ae0ba2c

22 files changed

Lines changed: 483 additions & 469 deletions

dist/rx.all.compat.js

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@
780780

781781
priorityProto.removeAt = function (index) {
782782
this.items[index] = this.items[--this.length];
783-
delete this.items[this.length];
783+
this.items[this.length] = undefined;
784784
this.heapify();
785785
};
786786

@@ -812,7 +812,13 @@
812812
* @constructor
813813
*/
814814
var CompositeDisposable = Rx.CompositeDisposable = function () {
815-
this.disposables = argsOrArray(arguments, 0);
815+
var disposables = [];
816+
if (Array.isArray(arguments[0])) {
817+
disposables = arguments[0];
818+
} else {
819+
for(var i = 0, len = arguments.length; i < len; i++) { disposables.push(arguments[i]); }
820+
}
821+
this.disposables = disposables;
816822
this.isDisposed = false;
817823
this.length = this.disposables.length;
818824
};
@@ -857,11 +863,11 @@
857863
CompositeDisposablePrototype.dispose = function () {
858864
if (!this.isDisposed) {
859865
this.isDisposed = true;
860-
var currentDisposables = this.disposables.slice(0);
866+
for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }
861867
this.disposables = [];
862868
this.length = 0;
863869

864-
for (var i = 0, len = currentDisposables.length; i < len; i++) {
870+
for (i = 0, len = currentDisposables.length; i < len; i++) {
865871
currentDisposables[i].dispose();
866872
}
867873
}
@@ -872,7 +878,8 @@
872878
* @returns {Array} An array of disposable objects.
873879
*/
874880
CompositeDisposablePrototype.toArray = function () {
875-
return this.disposables.slice(0);
881+
for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }
882+
return currentDisposables;
876883
};
877884

878885
/**
@@ -927,9 +934,9 @@
927934
* @param {Disposable} value The new underlying disposable.
928935
*/
929936
booleanDisposablePrototype.setDisposable = function (value) {
930-
var shouldDispose = this.isDisposed, old;
937+
var shouldDispose = this.isDisposed;
931938
if (!shouldDispose) {
932-
old = this.current;
939+
var old = this.current;
933940
this.current = value;
934941
}
935942
old && old.dispose();
@@ -940,10 +947,9 @@
940947
* Disposes the underlying disposable as well as all future replacements.
941948
*/
942949
booleanDisposablePrototype.dispose = function () {
943-
var old;
944950
if (!this.isDisposed) {
945951
this.isDisposed = true;
946-
old = this.current;
952+
var old = this.current;
947953
this.current = null;
948954
}
949955
old && old.dispose();
@@ -953,67 +959,63 @@
953959
}());
954960
var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;
955961

962+
/**
963+
* Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.
964+
*/
965+
var RefCountDisposable = Rx.RefCountDisposable = (function () {
966+
967+
function InnerDisposable(disposable) {
968+
this.disposable = disposable;
969+
this.disposable.count++;
970+
this.isInnerDisposed = false;
971+
}
972+
973+
InnerDisposable.prototype.dispose = function () {
974+
if (!this.disposable.isDisposed && !this.isInnerDisposed) {
975+
this.isInnerDisposed = true;
976+
this.disposable.count--;
977+
if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
978+
this.disposable.isDisposed = true;
979+
this.disposable.underlyingDisposable.dispose();
980+
}
981+
}
982+
};
983+
956984
/**
957-
* Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.
958-
*/
959-
var RefCountDisposable = Rx.RefCountDisposable = (function () {
960-
961-
function InnerDisposable(disposable) {
962-
this.disposable = disposable;
963-
this.disposable.count++;
964-
this.isInnerDisposed = false;
965-
}
966-
967-
InnerDisposable.prototype.dispose = function () {
968-
if (!this.disposable.isDisposed) {
969-
if (!this.isInnerDisposed) {
970-
this.isInnerDisposed = true;
971-
this.disposable.count--;
972-
if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
973-
this.disposable.isDisposed = true;
974-
this.disposable.underlyingDisposable.dispose();
975-
}
976-
}
977-
}
978-
};
985+
* Initializes a new instance of the RefCountDisposable with the specified disposable.
986+
* @constructor
987+
* @param {Disposable} disposable Underlying disposable.
988+
*/
989+
function RefCountDisposable(disposable) {
990+
this.underlyingDisposable = disposable;
991+
this.isDisposed = false;
992+
this.isPrimaryDisposed = false;
993+
this.count = 0;
994+
}
979995

980-
/**
981-
* Initializes a new instance of the RefCountDisposable with the specified disposable.
982-
* @constructor
983-
* @param {Disposable} disposable Underlying disposable.
984-
*/
985-
function RefCountDisposable(disposable) {
986-
this.underlyingDisposable = disposable;
987-
this.isDisposed = false;
988-
this.isPrimaryDisposed = false;
989-
this.count = 0;
990-
}
991-
992-
/**
993-
* Disposes the underlying disposable only when all dependent disposables have been disposed
994-
*/
995-
RefCountDisposable.prototype.dispose = function () {
996-
if (!this.isDisposed) {
997-
if (!this.isPrimaryDisposed) {
998-
this.isPrimaryDisposed = true;
999-
if (this.count === 0) {
1000-
this.isDisposed = true;
1001-
this.underlyingDisposable.dispose();
1002-
}
1003-
}
1004-
}
1005-
};
996+
/**
997+
* Disposes the underlying disposable only when all dependent disposables have been disposed
998+
*/
999+
RefCountDisposable.prototype.dispose = function () {
1000+
if (!this.isDisposed && !this.isPrimaryDisposed) {
1001+
this.isPrimaryDisposed = true;
1002+
if (this.count === 0) {
1003+
this.isDisposed = true;
1004+
this.underlyingDisposable.dispose();
1005+
}
1006+
}
1007+
};
10061008

1007-
/**
1008-
* Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.
1009-
* @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.
1010-
*/
1011-
RefCountDisposable.prototype.getDisposable = function () {
1012-
return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
1013-
};
1009+
/**
1010+
* Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.
1011+
* @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.
1012+
*/
1013+
RefCountDisposable.prototype.getDisposable = function () {
1014+
return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
1015+
};
10141016

1015-
return RefCountDisposable;
1016-
})();
1017+
return RefCountDisposable;
1018+
})();
10171019

10181020
function ScheduledDisposable(scheduler, disposable) {
10191021
this.scheduler = scheduler;

dist/rx.all.compat.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.compat.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.js

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@
591591

592592
priorityProto.removeAt = function (index) {
593593
this.items[index] = this.items[--this.length];
594-
delete this.items[this.length];
594+
this.items[this.length] = undefined;
595595
this.heapify();
596596
};
597597

@@ -623,7 +623,13 @@
623623
* @constructor
624624
*/
625625
var CompositeDisposable = Rx.CompositeDisposable = function () {
626-
this.disposables = argsOrArray(arguments, 0);
626+
var disposables = [];
627+
if (Array.isArray(arguments[0])) {
628+
disposables = arguments[0];
629+
} else {
630+
for(var i = 0, len = arguments.length; i < len; i++) { disposables.push(arguments[i]); }
631+
}
632+
this.disposables = disposables;
627633
this.isDisposed = false;
628634
this.length = this.disposables.length;
629635
};
@@ -668,11 +674,11 @@
668674
CompositeDisposablePrototype.dispose = function () {
669675
if (!this.isDisposed) {
670676
this.isDisposed = true;
671-
var currentDisposables = this.disposables.slice(0);
677+
for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }
672678
this.disposables = [];
673679
this.length = 0;
674680

675-
for (var i = 0, len = currentDisposables.length; i < len; i++) {
681+
for (i = 0, len = currentDisposables.length; i < len; i++) {
676682
currentDisposables[i].dispose();
677683
}
678684
}
@@ -683,7 +689,8 @@
683689
* @returns {Array} An array of disposable objects.
684690
*/
685691
CompositeDisposablePrototype.toArray = function () {
686-
return this.disposables.slice(0);
692+
for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }
693+
return currentDisposables;
687694
};
688695

689696
/**
@@ -738,9 +745,9 @@
738745
* @param {Disposable} value The new underlying disposable.
739746
*/
740747
booleanDisposablePrototype.setDisposable = function (value) {
741-
var shouldDispose = this.isDisposed, old;
748+
var shouldDispose = this.isDisposed;
742749
if (!shouldDispose) {
743-
old = this.current;
750+
var old = this.current;
744751
this.current = value;
745752
}
746753
old && old.dispose();
@@ -751,10 +758,9 @@
751758
* Disposes the underlying disposable as well as all future replacements.
752759
*/
753760
booleanDisposablePrototype.dispose = function () {
754-
var old;
755761
if (!this.isDisposed) {
756762
this.isDisposed = true;
757-
old = this.current;
763+
var old = this.current;
758764
this.current = null;
759765
}
760766
old && old.dispose();
@@ -764,67 +770,63 @@
764770
}());
765771
var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;
766772

773+
/**
774+
* Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.
775+
*/
776+
var RefCountDisposable = Rx.RefCountDisposable = (function () {
777+
778+
function InnerDisposable(disposable) {
779+
this.disposable = disposable;
780+
this.disposable.count++;
781+
this.isInnerDisposed = false;
782+
}
783+
784+
InnerDisposable.prototype.dispose = function () {
785+
if (!this.disposable.isDisposed && !this.isInnerDisposed) {
786+
this.isInnerDisposed = true;
787+
this.disposable.count--;
788+
if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
789+
this.disposable.isDisposed = true;
790+
this.disposable.underlyingDisposable.dispose();
791+
}
792+
}
793+
};
794+
767795
/**
768-
* Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.
769-
*/
770-
var RefCountDisposable = Rx.RefCountDisposable = (function () {
771-
772-
function InnerDisposable(disposable) {
773-
this.disposable = disposable;
774-
this.disposable.count++;
775-
this.isInnerDisposed = false;
776-
}
777-
778-
InnerDisposable.prototype.dispose = function () {
779-
if (!this.disposable.isDisposed) {
780-
if (!this.isInnerDisposed) {
781-
this.isInnerDisposed = true;
782-
this.disposable.count--;
783-
if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {
784-
this.disposable.isDisposed = true;
785-
this.disposable.underlyingDisposable.dispose();
786-
}
787-
}
788-
}
789-
};
796+
* Initializes a new instance of the RefCountDisposable with the specified disposable.
797+
* @constructor
798+
* @param {Disposable} disposable Underlying disposable.
799+
*/
800+
function RefCountDisposable(disposable) {
801+
this.underlyingDisposable = disposable;
802+
this.isDisposed = false;
803+
this.isPrimaryDisposed = false;
804+
this.count = 0;
805+
}
790806

791-
/**
792-
* Initializes a new instance of the RefCountDisposable with the specified disposable.
793-
* @constructor
794-
* @param {Disposable} disposable Underlying disposable.
795-
*/
796-
function RefCountDisposable(disposable) {
797-
this.underlyingDisposable = disposable;
798-
this.isDisposed = false;
799-
this.isPrimaryDisposed = false;
800-
this.count = 0;
801-
}
802-
803-
/**
804-
* Disposes the underlying disposable only when all dependent disposables have been disposed
805-
*/
806-
RefCountDisposable.prototype.dispose = function () {
807-
if (!this.isDisposed) {
808-
if (!this.isPrimaryDisposed) {
809-
this.isPrimaryDisposed = true;
810-
if (this.count === 0) {
811-
this.isDisposed = true;
812-
this.underlyingDisposable.dispose();
813-
}
814-
}
815-
}
816-
};
807+
/**
808+
* Disposes the underlying disposable only when all dependent disposables have been disposed
809+
*/
810+
RefCountDisposable.prototype.dispose = function () {
811+
if (!this.isDisposed && !this.isPrimaryDisposed) {
812+
this.isPrimaryDisposed = true;
813+
if (this.count === 0) {
814+
this.isDisposed = true;
815+
this.underlyingDisposable.dispose();
816+
}
817+
}
818+
};
817819

818-
/**
819-
* Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.
820-
* @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.
821-
*/
822-
RefCountDisposable.prototype.getDisposable = function () {
823-
return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
824-
};
820+
/**
821+
* Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.
822+
* @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.
823+
*/
824+
RefCountDisposable.prototype.getDisposable = function () {
825+
return this.isDisposed ? disposableEmpty : new InnerDisposable(this);
826+
};
825827

826-
return RefCountDisposable;
827-
})();
828+
return RefCountDisposable;
829+
})();
828830

829831
function ScheduledDisposable(scheduler, disposable) {
830832
this.scheduler = scheduler;

dist/rx.all.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/rx.all.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)