Skip to content

Commit

Permalink
override generator coroutine function length property
Browse files Browse the repository at this point in the history
use es5 defineProperty
  • Loading branch information
petkaantonov committed Jan 23, 2016
1 parent 0dc2861 commit 6bd757e
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
15 changes: 13 additions & 2 deletions src/generators.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var util = require("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];
var defineProperty = require("./es5").defineProperty;

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
for (var i = 0; i < yieldHandlers.length; ++i) {
Expand Down Expand Up @@ -178,15 +179,25 @@ Promise.coroutine = function (generatorFunction, options) {
var yieldHandler = Object(options).yieldHandler;
var PromiseSpawn$ = PromiseSpawn;
var stack = new Error().stack;
return function () {

function wrap () {
var generator = generatorFunction.apply(this, arguments);
var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
stack);
var ret = spawn.promise();
spawn._generator = generator;
spawn._promiseFulfilled(undefined);
return ret;
};
}

defineProperty(wrap, "length", {
value: generatorFunction.length,
writable: false,
enumerable: false,
configurable: true
});

return wrap;
};

Promise.coroutine.addYieldHandler = function(fn) {
Expand Down
17 changes: 11 additions & 6 deletions test/mocha/generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -295,18 +295,23 @@ describe("Promise.coroutine", function() {
this.goblins = 3;
}

MyClass.prototype.spawnGoblins = Promise.coroutine(function* () {
this.goblins = yield get(this.goblins+1);
});
function* gen(increment) {
this.goblins = yield get(this.goblins+increment);
}

MyClass.prototype.spawnGoblins = Promise.coroutine(gen);

specify("generator function's arity should be replicated", function() {
assert.equal(MyClass.prototype.spawnGoblins.length, gen.length);
});

specify("generator function's receiver should be the instance too", function() {
var a = new MyClass();
var b = new MyClass();

return Promise.join(a.spawnGoblins().then(function(){
return a.spawnGoblins()
}), b.spawnGoblins()).then(function(){
return Promise.join(a.spawnGoblins(1).then(function(){
return a.spawnGoblins(1)
}), b.spawnGoblins(1)).then(function(){
assert.equal(a.goblins, 5);
assert.equal(b.goblins, 4);
});
Expand Down

0 comments on commit 6bd757e

Please sign in to comment.