Patch.prototype.update = function (src) { var opts = {}; if (this.context) opts.names = this.context.names; var nsrc = scoper('(function(){' + src + '})()', opts); var c = Function('return ' + nsrc)(); if (this.context) { var ctx = this.context; c.patch(ctx); var fpatch = patcher.computePatch(ctx.function, c.function); var lpatch = patcher.computePatch(ctx.literal, c.literal); if (fpatch) patcher.applyPatch(ctx.function, fpatch); if (lpatch) patcher.applyPatch(ctx.literal, lpatch); var keys = Object.keys(c.names) var names = keys.map(function (n) { return c.names[n] }); var vars = keys.map(function (k) { return ctx[k] }); if (lpatch) Object.keys(lpatch).forEach(function (key) { var fsrc = ';(' + fpatch[key] + ')()'; var ix = 0; falafel(fsrc, function (node) { if (node.type !== 'Identifier') return; if (node.name !== c.names.literal) return; var up = upexpr(node); if (getscope(ctx.scope, node) !== key) return; if (!has(lpatch[key], ix ++)) return; Function(names, up.source()).apply(null, vars); }); }); } else { this.context = c; c.run(); } };
self.patch = function (patch) { if (patch !== null) { patcher.applyPatch(self.object, patch); self.emit('update', self.object); } };