Skip to content

Commit

Permalink
Attempt to fix 734: introduce array.get / set
Browse files Browse the repository at this point in the history
  • Loading branch information
mweststrate committed Jan 17, 2017
1 parent 8539234 commit 0430a93
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 47 deletions.
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "mobx",
"version": "3.0.1",
"version": "3.0.1-fix734",
"description": "Simple, scalable state management.",
"main": "lib/mobx.js",
"typings": "lib/mobx.d.ts",
Expand Down
2 changes: 2 additions & 0 deletions src/mobx.ts
Expand Up @@ -67,6 +67,7 @@ import { spyReport, spyReportEnd, spyReportStart, isSpyEnabled } from "./core/sp
import { Lambda } from "./utils/utils";
import { isComputingDerivation } from "./core/derivation";
import { setReactionScheduler, onReactionError } from "./core/reaction";
import { reserveArrayBuffer } from "./types/observablearray";

export const extras = {
allowStateChanges,
Expand All @@ -79,6 +80,7 @@ export const extras = {
isComputingDerivation,
isSpyEnabled,
onReactionError,
reserveArrayBuffer, // See #734
resetGlobalState,
shareGlobalState,
spyReport,
Expand Down
22 changes: 19 additions & 3 deletions src/types/observablearray.ts
Expand Up @@ -388,6 +388,16 @@ export class ObservableArray<T> extends StubArray {
this.$mobx.atom.reportObserved();
return Array.prototype.toLocaleString.apply(this.$mobx.values, arguments);
}

// See #734, in case property accessors are unreliable...
get(index: number): T {
return (ALL_INDEX_DESCRIPTORS[index].get as any).call(this);
}

// See #734, in case property accessors are unreliable...
set(index: number, value: T): void {
(ALL_INDEX_DESCRIPTORS[index].set as any).call(this, value);
}
}

declareIterator(ObservableArray.prototype, function() {
Expand All @@ -403,6 +413,7 @@ makeNonEnumerable(ObservableArray.prototype, [
"observe",
"clear",
"concat",
"get",
"replace",
"toJS",
"toJSON",
Expand All @@ -411,6 +422,7 @@ makeNonEnumerable(ObservableArray.prototype, [
"splice",
"push",
"pop",
"set",
"shift",
"unshift",
"reverse",
Expand Down Expand Up @@ -465,14 +477,18 @@ const ENTRY_0 = {
get: createArrayGetter(0)
};

const ALL_INDEX_DESCRIPTORS: PropertyDescriptor[] = [];

function createArrayBufferItem(index: number) {
const set = createArraySetter(index);
const get = createArrayGetter(index);
Object.defineProperty(ObservableArray.prototype, "" + index, {
const descriptor = {
enumerable: false,
configurable: true,
set, get
});
};
ALL_INDEX_DESCRIPTORS[index] = descriptor;
Object.defineProperty(ObservableArray.prototype, "" + index, descriptor);
}

function createArraySetter(index: number) {
Expand Down Expand Up @@ -522,7 +538,7 @@ function createArrayGetter(index: number) {
};
}

function reserveArrayBuffer(max: number) {
export function reserveArrayBuffer(max: number) {
for (let index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++)
createArrayBufferItem(index);
OBSERVABLE_ARRAY_BUFFER_SIZE = max;
Expand Down
1 change: 1 addition & 0 deletions test/api.js
Expand Up @@ -60,6 +60,7 @@ test('correct api should be exposed', function(t) {
'isComputingDerivation',
'isSpyEnabled',
'onReactionError',
'reserveArrayBuffer',
'resetGlobalState',
'setReactionScheduler',
'shareGlobalState',
Expand Down
4 changes: 4 additions & 0 deletions test/array.js
Expand Up @@ -87,6 +87,10 @@ test('test1', function(t) {

t.equal(JSON.stringify(a), "[3,1,2]");

t.equal(a.get(1), 1);
a.set(2, 4);
t.equal(a.get(2), 4);

// t.deepEqual(Object.keys(a), ['0', '1', '2']); // ideally....
t.deepEqual(Object.keys(a), []);

Expand Down
86 changes: 43 additions & 43 deletions test/perf/perf.txt
@@ -1,51 +1,51 @@

One observers many observes one - Started/Updated in 60/34 ms.
500 props observing sibling - Started/Updated in 3/11 ms.
Late dependency change - Updated in 135ms.
Unused computables - Updated in 0 ms.
Unused observables - Updated in 25 ms.
Array reduce - Started/Updated in 57/44 ms.
Array loop - Started/Updated in 127/231 ms.
Order system batched: false tracked: true Started/Updated in 473/37 ms.
Order system batched: true tracked: true Started/Updated in 102/28 ms.
Order system batched: false tracked: false Started/Updated in 117/37 ms.
Order system batched: true tracked: false Started/Updated in 118/35 ms.
One observers many observes one - Started/Updated in 50/22 ms.
500 props observing sibling - Started/Updated in 6/2 ms.
Late dependency change - Updated in 59ms.
Unused computables - Updated in 1 ms.
Unused observables - Updated in 10 ms.
Array reduce - Started/Updated in 28/26 ms.
Array loop - Started/Updated in 113/170 ms.
Order system batched: false tracked: true Started/Updated in 701/76 ms.
Order system batched: true tracked: true Started/Updated in 180/76 ms.
Order system batched: false tracked: false Started/Updated in 235/86 ms.
Order system batched: true tracked: false Started/Updated in 116/33 ms.

Create array - Created in 552ms.
Create array - Created in 261ms.

Create array (non-recursive) Created in 297ms.
Observable with many observers + dispose: 768ms
expensive sort: created 2787
expensive sort: updated 12518
expensive sort: disposed561
native plain sort: updated 1087
computed memoization 1ms
create folders 0ms.
create displayfolders 1ms.
create text 471ms.
Create array (non-recursive) Created in 45ms.
Observable with many observers + dispose: 1627ms
expensive sort: created 4714
expensive sort: updated 11440
expensive sort: disposed412
native plain sort: updated 920
computed memoization 0ms
create folders 1ms.
create displayfolders 0ms.
create text 225ms.
collapse folder 1ms.
uncollapse folder 1ms.
change name of folder 498ms.
search 103ms.
unsearch 438ms.
uncollapse folder 0ms.
change name of folder 221ms.
search 49ms.
unsearch 211ms.
reactive folder tree [total]
1517ms.
create folders 21ms.
create displayfolders 1ms.
create text 51ms.
collapse folder 2ms.
uncollapse folder 5ms.
change name of folder 10ms.
search 15ms.
unsearch 24ms.
709ms.
create folders 29ms.
create displayfolders 3ms.
create text 112ms.
collapse folder 6ms.
uncollapse folder 10ms.
change name of folder 17ms.
search 47ms.
unsearch 37ms.
reactive folder tree [total]
131ms.
create boxes 89ms.
mutations 523ms.
total 625ms.
create boxes 90ms.
mutations 928ms.
total 1084ms.
263ms.
create boxes 125ms.
mutations 412ms.
total 554ms.
create boxes 128ms.
mutations 958ms.
total 1158ms.


Completed performance suite in 25.475 sec.
Completed performance suite in 25.2 sec.

0 comments on commit 0430a93

Please sign in to comment.