Change how Array#reduce works

refs #12247
This commit is contained in:
Gunnar Beutner 2016-07-29 11:09:46 +02:00
parent a3815e4efd
commit ee75094128
2 changed files with 8 additions and 5 deletions

View File

@ -708,8 +708,8 @@ Signature:
function reduce(func);
Reduces the elements of the array into a single value by calling the provided
function `func` as `func(a, b)` repeatedly where `a` is the previous result of
function call (null initially) and `b` is an element of the array.
function `func` as `func(a, b)` repeatedly where `a` and `b` are elements of the array
or results from previous function calls.
### <a id="array-filter"> Array#filter

View File

@ -172,14 +172,17 @@ static Value ArrayReduce(const Function::Ptr& function)
if (vframe->Sandboxed && !function->IsSideEffectFree())
BOOST_THROW_EXCEPTION(ScriptError("Reduce function must be side-effect free."));
Value result;
if (self->GetLength() == 0)
return Empty;
Value result = self->Get(0);
ObjectLock olock(self);
BOOST_FOREACH(const Value& item, self) {
for (size_t i = 1; i < self->GetLength(); i++) {
ScriptFrame uframe;
std::vector<Value> args;
args.push_back(result);
args.push_back(item);
args.push_back(self->Get(i));
result = function->Invoke(args);
}