Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performances optimizations #47

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
15 changes: 4 additions & 11 deletions bind.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,17 @@ function bind(target, targetPath, descriptor) {
var sourcePath = descriptor["<-"] || descriptor["<->"] || "";
var twoWay = descriptor.twoWay = "<->" in descriptor;
descriptor.sourcePath = sourcePath;
var value = descriptor.value;
var parameters = descriptor.parameters = descriptor.parameters || source;
var document = descriptor.document;
var components = descriptor.components;
var trace = descriptor.trace;

// TODO: consider the possibility that source and target have intrinsic
// scope properties

var sourceScope = descriptor.sourceScope = new Scope(source);
sourceScope.parameters = parameters;
sourceScope.document = document;
sourceScope.components = components;
var targetScope = descriptor.targetScope = new Scope(target);
targetScope.parameters = parameters;
targetScope.document = document;
targetScope.components = components;

sourceScope.parameters = targetScope.parameters = (descriptor.parameters = descriptor.parameters || source);
sourceScope.document = targetScope.document = descriptor.document;
sourceScope.components = targetScope.components = descriptor.components;

// promote convert and revert from a converter object up to the descriptor
if (descriptor.converter) {
Expand Down Expand Up @@ -121,7 +115,6 @@ function bind(target, targetPath, descriptor) {
cancelSourceToTarget();
cancelTargetToSource();
};

}

function bindOneWay(
Expand Down
9 changes: 2 additions & 7 deletions bindings.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@

var Map = require("collections/map");
var bind = require("./bind");
var compute = require("./compute");
var observe = require("./observe");
var stringify = require("./stringify");

var bindingsForObject = new Map();
var bindingsForObject = {};
var owns = Object.prototype.hasOwnProperty;

exports.count = 0;
Expand Down Expand Up @@ -57,10 +56,7 @@ function defineBinding(object, name, descriptor, commonDescriptor) {

exports.getBindings = getBindings;
function getBindings(object) {
if (!bindingsForObject.has(object)) {
bindingsForObject.set(object, {});
}
return bindingsForObject.get(object);
return object.__bindingDescriptors__ || (object.__bindingDescriptors__ = {});
}

exports.getBinding = getBinding;
Expand Down Expand Up @@ -91,7 +87,6 @@ function cancelBinding(object, name) {
for (var name in bindings) {
return; // if there are any remaining bindings, short-circuit
}
bindingsForObject["delete"](object);
}
}

5 changes: 3 additions & 2 deletions compile-observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,12 @@ var semantics = compile.semantics = {
};

var compilers = semantics.compilers;
Object.keys(Operators).forEach(function (name) {
var operators = Object.keys(Operators);
for(var i=0, name;(name = operators[i]); i++) {
if (!compilers[name]) {
compilers[name] = Observers.makeOperatorObserverMaker(Operators[name]);
}
});
}

// a special Hell for non-enumerable inheritance
compilers.toString = Observers.makeOperatorObserverMaker(Operators.toString);
Expand Down
1 change: 0 additions & 1 deletion expand.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@

var Set = require("collections/set");
var Map = require("collections/map");
var Operators = require("./operators");

module.exports = expand;
function expand(syntax, scope) {
Expand Down
4 changes: 2 additions & 2 deletions parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
require("collections/shim");
var grammar = require("./grammar");

var memo = {}; // could be Dict
var memo = Object.create(null); // could be Dict

module.exports = parse;
function parse(text, options) {
Expand All @@ -13,7 +13,7 @@ function parse(text, options) {
return parse(text, options);
})
};
} else if (!options && Object.prototype.hasOwnProperty.call(memo, text)) {
} else if (!options && (text in memo)) {
return memo[text];
} else {
try {
Expand Down
12 changes: 12 additions & 0 deletions scope.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@ function Scope(value) {
this.value = value;
}

Object.defineProperties(Scope.prototype, {
parent: {
value:null,
writable: true
},
value: {
value:null,
writable: true
}
});


Scope.prototype.nest = function (value) {
var child = Object.create(this);
child.value = value;
Expand Down
3 changes: 2 additions & 1 deletion spec/bind-defined-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ describe("defined binding", function () {
}
});
expect(object.property).toBe(undefined);
expect(object.defined).toBeFalsy();

object.property = 10;
expect(object.property).toBe(10);
expect(object.defined).toBe(true);
expect(object.defined).toBeTruthy();

object.defined = false;
expect(object.property).toBe(undefined);
Expand Down
41 changes: 41 additions & 0 deletions spec/bind-reverse-spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
var Bindings = require("..");

describe("reverse binding", function () {

it("should override initial value", function () {
var object = {foo: 42, bar: 0};
Bindings.defineBinding(object, "foo", { "<->": "bar" });

expect(object.bar).toEqual(0);
expect(object.foo).toEqual(0);
});

it("should reflect first member change", function() {
var object = {foo: 42, bar: 0};
Bindings.defineBinding(object, "foo", { "<->": "bar" });

object.foo = 123;

expect(object.bar).toEqual(123);
expect(object.foo).toEqual(123);
});

it("should reflect second member change", function() {
var object = {foo: 42, bar: 0};
Bindings.defineBinding(object, "foo", { "<->": "bar" });

object.bar = 123;

expect(object.bar).toEqual(123);
expect(object.foo).toEqual(123);
});

it("should unset first member if second member is undefined", function() {
var object = {foo: 42};
Bindings.defineBinding(object, "foo", { "<->": "bar", trace: true });

expect(object.bar).toBeUndefined();
expect(object.foo).toBeUndefined();
});

});