Skip to content

Commit 1ee3c1f

Browse files
committed
adding recursive contract definitions
1 parent 437370e commit 1ee3c1f

File tree

13 files changed

+323
-63
lines changed

13 files changed

+323
-63
lines changed

benchmark/bench_complex_raw.js

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ _c$600 = function () {
99
var Blame = {
1010
create: function (name, pos, neg, lineNumber) {
1111
var o = new BlameObj(name, pos, neg, lineNumber);
12-
// Object.freeze(o);
1312
return o;
1413
},
1514
clone: function (old, props) {
@@ -18,7 +17,6 @@ _c$600 = function () {
1817
o.given = typeof props.given !== 'undefined' ? props.given : old.given;
1918
o.loc = typeof props.loc !== 'undefined' ? props.loc : old.loc;
2019
o.parents = typeof props.parents !== 'undefined' ? props.parents : old.parents;
21-
// Object.freeze(o);
2220
return o;
2321
}
2422
};
@@ -62,6 +60,10 @@ _c$600 = function () {
6260
this.type = type;
6361
this.proj = proj.bind(this);
6462
}
63+
Contract.prototype.closeCycle = function closeCycle(contract) {
64+
this.cycleContract = contract;
65+
return contract;
66+
};
6567
Contract.prototype.toString = function toString() {
6668
return this.name;
6769
};
@@ -415,16 +417,20 @@ _c$600 = function () {
415417
}
416418
contractKeys.forEach(function (key) {
417419
if (!(objContract[key].type === 'optional' && obj[key] === undefined)) {
418-
// self contracts use the original object contract
419-
var c$2 = objContract[key];
420420
var propProjOptions = function () {
421421
if (objContract[key].type === 'fun') {
422422
return { overrideThisContract: this };
423423
} else {
424424
return {};
425425
}
426426
}.bind(this)();
427-
// var c = objContract[key].type === "self" ? this : objContract[key];
427+
var c$2 = function () {
428+
if (objContract[key].type === 'cycle') {
429+
return objContract[key].cycleContract;
430+
} else {
431+
return objContract[key];
432+
}
433+
}.bind(this)();
428434
var propProj = c$2.proj(blame.addLocation('the ' + key + ' property of'), false, propProjOptions);
429435
var checkedProperty = propProj(obj[key]);
430436
obj[key] = checkedProperty;
@@ -434,7 +440,14 @@ _c$600 = function () {
434440
return new Proxy(obj, {
435441
set: function (target, key, value) {
436442
if (objContract.hasOwnProperty(key)) {
437-
var propProj = objContract[key].proj(blame.swap().addLocation('setting the ' + key + ' property of'));
443+
var c$2 = function () {
444+
if (objContract[key].type === 'cycle') {
445+
return objContract[key].cycleContract;
446+
} else {
447+
return objContract[key];
448+
}
449+
}.bind(this)();
450+
var propProj = c$2.proj(blame.swap().addLocation('setting the ' + key + ' property of'));
438451
var checkedProperty = propProj(value);
439452
target[key] = checkedProperty;
440453
} else {
@@ -480,6 +493,11 @@ _c$600 = function () {
480493
};
481494
});
482495
}
496+
function cyclic(name) {
497+
return new Contract(name, 'cycle', function () {
498+
throw new Error('Stub, should never be called');
499+
});
500+
}
483501
function guard(contract, value, name) {
484502
var proj = contract.proj(Blame.create(name, 'function ' + name, '(calling context for ' + name + ')'));
485503
return proj(value);
@@ -535,6 +553,7 @@ _c$600 = function () {
535553
optional: optional,
536554
object: object,
537555
array: array,
556+
cyclic: cyclic,
538557
Blame: Blame,
539558
makeCoffer: makeCoffer,
540559
guard: guard
@@ -560,20 +579,11 @@ var inner_mkSort = _c$600.fun([typeof Num !== 'undefined' ? Num : _c$600.Num], t
560579
function mkSort(x) {
561580
return inner_mkSort.apply(this, arguments);
562581
}
563-
function mkSortRaw(x) {
564-
var arr = [];
565-
for (var i = 0; i < x; i++) {
566-
arr.push(i);
567-
}
568-
arr.sort();
569-
return arr[0];
570-
}
571582
module.exports = {
572583
name: 'CJS vs RHO - mkSort function',
573584
tests: {
574585
'RHO - mkSort(10000)': function () {
575-
// rhoMkSort(10000);
576-
mkSortRaw(10000);
586+
rhoMkSort(10000);
577587
},
578588
'CJS - mkSort(10000)': function () {
579589
mkSort(10000);

benchmark/bench_fun.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ _c$600 = function () {
99
var Blame = {
1010
create: function (name, pos, neg, lineNumber) {
1111
var o = new BlameObj(name, pos, neg, lineNumber);
12-
// Object.freeze(o);
1312
return o;
1413
},
1514
clone: function (old, props) {
@@ -18,7 +17,6 @@ _c$600 = function () {
1817
o.given = typeof props.given !== 'undefined' ? props.given : old.given;
1918
o.loc = typeof props.loc !== 'undefined' ? props.loc : old.loc;
2019
o.parents = typeof props.parents !== 'undefined' ? props.parents : old.parents;
21-
// Object.freeze(o);
2220
return o;
2321
}
2422
};
@@ -62,6 +60,10 @@ _c$600 = function () {
6260
this.type = type;
6361
this.proj = proj.bind(this);
6462
}
63+
Contract.prototype.closeCycle = function closeCycle(contract) {
64+
this.cycleContract = contract;
65+
return contract;
66+
};
6567
Contract.prototype.toString = function toString() {
6668
return this.name;
6769
};
@@ -415,16 +417,20 @@ _c$600 = function () {
415417
}
416418
contractKeys.forEach(function (key) {
417419
if (!(objContract[key].type === 'optional' && obj[key] === undefined)) {
418-
// self contracts use the original object contract
419-
var c$2 = objContract[key];
420420
var propProjOptions = function () {
421421
if (objContract[key].type === 'fun') {
422422
return { overrideThisContract: this };
423423
} else {
424424
return {};
425425
}
426426
}.bind(this)();
427-
// var c = objContract[key].type === "self" ? this : objContract[key];
427+
var c$2 = function () {
428+
if (objContract[key].type === 'cycle') {
429+
return objContract[key].cycleContract;
430+
} else {
431+
return objContract[key];
432+
}
433+
}.bind(this)();
428434
var propProj = c$2.proj(blame.addLocation('the ' + key + ' property of'), false, propProjOptions);
429435
var checkedProperty = propProj(obj[key]);
430436
obj[key] = checkedProperty;
@@ -434,7 +440,14 @@ _c$600 = function () {
434440
return new Proxy(obj, {
435441
set: function (target, key, value) {
436442
if (objContract.hasOwnProperty(key)) {
437-
var propProj = objContract[key].proj(blame.swap().addLocation('setting the ' + key + ' property of'));
443+
var c$2 = function () {
444+
if (objContract[key].type === 'cycle') {
445+
return objContract[key].cycleContract;
446+
} else {
447+
return objContract[key];
448+
}
449+
}.bind(this)();
450+
var propProj = c$2.proj(blame.swap().addLocation('setting the ' + key + ' property of'));
438451
var checkedProperty = propProj(value);
439452
target[key] = checkedProperty;
440453
} else {
@@ -480,6 +493,11 @@ _c$600 = function () {
480493
};
481494
});
482495
}
496+
function cyclic(name) {
497+
return new Contract(name, 'cycle', function () {
498+
throw new Error('Stub, should never be called');
499+
});
500+
}
483501
function guard(contract, value, name) {
484502
var proj = contract.proj(Blame.create(name, 'function ' + name, '(calling context for ' + name + ')'));
485503
return proj(value);
@@ -535,6 +553,7 @@ _c$600 = function () {
535553
optional: optional,
536554
object: object,
537555
array: array,
556+
cyclic: cyclic,
538557
Blame: Blame,
539558
makeCoffer: makeCoffer,
540559
guard: guard

benchmark/bench_fun_raw.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ _c$600 = function () {
99
var Blame = {
1010
create: function (name, pos, neg, lineNumber) {
1111
var o = new BlameObj(name, pos, neg, lineNumber);
12-
// Object.freeze(o);
1312
return o;
1413
},
1514
clone: function (old, props) {
@@ -18,7 +17,6 @@ _c$600 = function () {
1817
o.given = typeof props.given !== 'undefined' ? props.given : old.given;
1918
o.loc = typeof props.loc !== 'undefined' ? props.loc : old.loc;
2019
o.parents = typeof props.parents !== 'undefined' ? props.parents : old.parents;
21-
// Object.freeze(o);
2220
return o;
2321
}
2422
};
@@ -62,6 +60,10 @@ _c$600 = function () {
6260
this.type = type;
6361
this.proj = proj.bind(this);
6462
}
63+
Contract.prototype.closeCycle = function closeCycle(contract) {
64+
this.cycleContract = contract;
65+
return contract;
66+
};
6567
Contract.prototype.toString = function toString() {
6668
return this.name;
6769
};
@@ -415,16 +417,20 @@ _c$600 = function () {
415417
}
416418
contractKeys.forEach(function (key) {
417419
if (!(objContract[key].type === 'optional' && obj[key] === undefined)) {
418-
// self contracts use the original object contract
419-
var c$2 = objContract[key];
420420
var propProjOptions = function () {
421421
if (objContract[key].type === 'fun') {
422422
return { overrideThisContract: this };
423423
} else {
424424
return {};
425425
}
426426
}.bind(this)();
427-
// var c = objContract[key].type === "self" ? this : objContract[key];
427+
var c$2 = function () {
428+
if (objContract[key].type === 'cycle') {
429+
return objContract[key].cycleContract;
430+
} else {
431+
return objContract[key];
432+
}
433+
}.bind(this)();
428434
var propProj = c$2.proj(blame.addLocation('the ' + key + ' property of'), false, propProjOptions);
429435
var checkedProperty = propProj(obj[key]);
430436
obj[key] = checkedProperty;
@@ -434,7 +440,14 @@ _c$600 = function () {
434440
return new Proxy(obj, {
435441
set: function (target, key, value) {
436442
if (objContract.hasOwnProperty(key)) {
437-
var propProj = objContract[key].proj(blame.swap().addLocation('setting the ' + key + ' property of'));
443+
var c$2 = function () {
444+
if (objContract[key].type === 'cycle') {
445+
return objContract[key].cycleContract;
446+
} else {
447+
return objContract[key];
448+
}
449+
}.bind(this)();
450+
var propProj = c$2.proj(blame.swap().addLocation('setting the ' + key + ' property of'));
438451
var checkedProperty = propProj(value);
439452
target[key] = checkedProperty;
440453
} else {
@@ -480,6 +493,11 @@ _c$600 = function () {
480493
};
481494
});
482495
}
496+
function cyclic(name) {
497+
return new Contract(name, 'cycle', function () {
498+
throw new Error('Stub, should never be called');
499+
});
500+
}
483501
function guard(contract, value, name) {
484502
var proj = contract.proj(Blame.create(name, 'function ' + name, '(calling context for ' + name + ')'));
485503
return proj(value);
@@ -535,6 +553,7 @@ _c$600 = function () {
535553
optional: optional,
536554
object: object,
537555
array: array,
556+
cyclic: cyclic,
538557
Blame: Blame,
539558
makeCoffer: makeCoffer,
540559
guard: guard

benchmark/bench_id.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ _c$600 = function () {
99
var Blame = {
1010
create: function (name, pos, neg, lineNumber) {
1111
var o = new BlameObj(name, pos, neg, lineNumber);
12-
// Object.freeze(o);
1312
return o;
1413
},
1514
clone: function (old, props) {
@@ -18,7 +17,6 @@ _c$600 = function () {
1817
o.given = typeof props.given !== 'undefined' ? props.given : old.given;
1918
o.loc = typeof props.loc !== 'undefined' ? props.loc : old.loc;
2019
o.parents = typeof props.parents !== 'undefined' ? props.parents : old.parents;
21-
// Object.freeze(o);
2220
return o;
2321
}
2422
};
@@ -62,6 +60,10 @@ _c$600 = function () {
6260
this.type = type;
6361
this.proj = proj.bind(this);
6462
}
63+
Contract.prototype.closeCycle = function closeCycle(contract) {
64+
this.cycleContract = contract;
65+
return contract;
66+
};
6567
Contract.prototype.toString = function toString() {
6668
return this.name;
6769
};
@@ -415,16 +417,20 @@ _c$600 = function () {
415417
}
416418
contractKeys.forEach(function (key) {
417419
if (!(objContract[key].type === 'optional' && obj[key] === undefined)) {
418-
// self contracts use the original object contract
419-
var c$2 = objContract[key];
420420
var propProjOptions = function () {
421421
if (objContract[key].type === 'fun') {
422422
return { overrideThisContract: this };
423423
} else {
424424
return {};
425425
}
426426
}.bind(this)();
427-
// var c = objContract[key].type === "self" ? this : objContract[key];
427+
var c$2 = function () {
428+
if (objContract[key].type === 'cycle') {
429+
return objContract[key].cycleContract;
430+
} else {
431+
return objContract[key];
432+
}
433+
}.bind(this)();
428434
var propProj = c$2.proj(blame.addLocation('the ' + key + ' property of'), false, propProjOptions);
429435
var checkedProperty = propProj(obj[key]);
430436
obj[key] = checkedProperty;
@@ -434,7 +440,14 @@ _c$600 = function () {
434440
return new Proxy(obj, {
435441
set: function (target, key, value) {
436442
if (objContract.hasOwnProperty(key)) {
437-
var propProj = objContract[key].proj(blame.swap().addLocation('setting the ' + key + ' property of'));
443+
var c$2 = function () {
444+
if (objContract[key].type === 'cycle') {
445+
return objContract[key].cycleContract;
446+
} else {
447+
return objContract[key];
448+
}
449+
}.bind(this)();
450+
var propProj = c$2.proj(blame.swap().addLocation('setting the ' + key + ' property of'));
438451
var checkedProperty = propProj(value);
439452
target[key] = checkedProperty;
440453
} else {
@@ -480,6 +493,11 @@ _c$600 = function () {
480493
};
481494
});
482495
}
496+
function cyclic(name) {
497+
return new Contract(name, 'cycle', function () {
498+
throw new Error('Stub, should never be called');
499+
});
500+
}
483501
function guard(contract, value, name) {
484502
var proj = contract.proj(Blame.create(name, 'function ' + name, '(calling context for ' + name + ')'));
485503
return proj(value);
@@ -535,6 +553,7 @@ _c$600 = function () {
535553
optional: optional,
536554
object: object,
537555
array: array,
556+
cyclic: cyclic,
538557
Blame: Blame,
539558
makeCoffer: makeCoffer,
540559
guard: guard

0 commit comments

Comments
 (0)