function lengthDecorator(fun) {
function update(len) {
var args = [];
for (var i = 0; i < len; ++i) {
args.push('a' + i);
}
var result = new Function('fun',
'return function(' + args.join(',') + ') {' +
'var args = Array.prototype.slice.call(arguments);' +
'return fun.apply(this, args);' +
'}'
);
result = result(fun);
result.update = update;
return result;
}
return update(fun.length);
}
var foo = lengthDecorator(function(a,b) {
return a+b;
});
print('foo.length: ' + foo.length);
print('foo(2, 3): ' + foo(2, 3));
print('');
foo = foo.update(42);
print('foo.length: ' + foo.length);
print('foo(2, 3): ' + foo(2, 3));
ZnVuY3Rpb24gbGVuZ3RoRGVjb3JhdG9yKGZ1bikgewoJZnVuY3Rpb24gdXBkYXRlKGxlbikgewoJCXZhciBhcmdzID0gW107CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewoJCQlhcmdzLnB1c2goJ2EnICsgaSk7CgkJfQoJCXZhciByZXN1bHQgPSBuZXcgRnVuY3Rpb24oJ2Z1bicsCgkJCSdyZXR1cm4gZnVuY3Rpb24oJyArIGFyZ3Muam9pbignLCcpICsgJykgeycgKwoJCQkJJ3ZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsnICsKCQkJCSdyZXR1cm4gZnVuLmFwcGx5KHRoaXMsIGFyZ3MpOycgKwoJCQknfScKCQkpOwoJCXJlc3VsdCA9IHJlc3VsdChmdW4pOwoJCXJlc3VsdC51cGRhdGUgPSB1cGRhdGU7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCXJldHVybiB1cGRhdGUoZnVuLmxlbmd0aCk7Cn0KCnZhciBmb28gPSBsZW5ndGhEZWNvcmF0b3IoZnVuY3Rpb24oYSxiKSB7CglyZXR1cm4gYStiOwp9KTsKCnByaW50KCdmb28ubGVuZ3RoOiAnICsgZm9vLmxlbmd0aCk7CnByaW50KCdmb28oMiwgMyk6ICcgKyBmb28oMiwgMykpOwoKcHJpbnQoJycpOwpmb28gPSBmb28udXBkYXRlKDQyKTsKcHJpbnQoJ2Zvby5sZW5ndGg6ICcgKyBmb28ubGVuZ3RoKTsKcHJpbnQoJ2ZvbygyLCAzKTogJyArIGZvbygyLCAzKSk7