18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch *  Copyright (C) 2003, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2003 Peter Kelly (pmk@post.com)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  USA
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ArrayPrototype.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CachedCall.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "CodeBlock.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h"
308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JIT.h"
318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include "JSStringBuilder.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Lookup.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ObjectPrototype.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Operations.h"
35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "StringRecursionChecker.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashSet.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASSERT_CLASS_FITS_IN_CELL(ArrayPrototype);
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncToString(ExecState*);
45545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncToLocaleString(ExecState*);
46545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncConcat(ExecState*);
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncJoin(ExecState*);
48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncPop(ExecState*);
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncPush(ExecState*);
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncReverse(ExecState*);
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncShift(ExecState*);
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncSlice(ExecState*);
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncSort(ExecState*);
54545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncSplice(ExecState*);
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncUnShift(ExecState*);
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncEvery(ExecState*);
57545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncForEach(ExecState*);
58545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncSome(ExecState*);
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncIndexOf(ExecState*);
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncFilter(ExecState*);
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncMap(ExecState*);
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncReduce(ExecState*);
63545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncReduceRight(ExecState*);
64545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL arrayProtoFuncLastIndexOf(ExecState*);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ArrayPrototype.lut.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic inline bool isNumericCompareFunction(ExecState* exec, CallType callType, const CallData& callData)
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (callType != CallTypeJS)
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
77967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    FunctionExecutable* executable = callData.js.functionExecutable;
78967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
79967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* error = executable->compileForCall(exec, callData.js.scopeChain);
80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (error)
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return false;
828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
83967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return executable->generatedBytecodeForCall().isNumericCompareFunction();
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ------------------------------ ArrayPrototype ----------------------------
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo ArrayPrototype::s_info = {"Array", &JSArray::s_info, 0, ExecState::arrayTable};
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* Source for ArrayPrototype.lut.h
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@begin arrayTable 16
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  toString       arrayProtoFuncToString       DontEnum|Function 0
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  toLocaleString arrayProtoFuncToLocaleString DontEnum|Function 0
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  concat         arrayProtoFuncConcat         DontEnum|Function 1
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  join           arrayProtoFuncJoin           DontEnum|Function 1
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  pop            arrayProtoFuncPop            DontEnum|Function 0
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  push           arrayProtoFuncPush           DontEnum|Function 1
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  reverse        arrayProtoFuncReverse        DontEnum|Function 0
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  shift          arrayProtoFuncShift          DontEnum|Function 0
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  slice          arrayProtoFuncSlice          DontEnum|Function 2
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  sort           arrayProtoFuncSort           DontEnum|Function 1
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  splice         arrayProtoFuncSplice         DontEnum|Function 2
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  unshift        arrayProtoFuncUnShift        DontEnum|Function 1
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  every          arrayProtoFuncEvery          DontEnum|Function 1
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  forEach        arrayProtoFuncForEach        DontEnum|Function 1
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  some           arrayProtoFuncSome           DontEnum|Function 1
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  indexOf        arrayProtoFuncIndexOf        DontEnum|Function 1
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  lastIndexOf    arrayProtoFuncLastIndexOf    DontEnum|Function 1
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  filter         arrayProtoFuncFilter         DontEnum|Function 1
1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian  reduce         arrayProtoFuncReduce         DontEnum|Function 1
1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian  reduceRight    arrayProtoFuncReduceRight    DontEnum|Function 1
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  map            arrayProtoFuncMap            DontEnum|Function 1
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ECMA 15.4.4
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochArrayPrototype::ArrayPrototype(JSGlobalObject* globalObject, Structure* structure)
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : JSArray(globalObject->globalData(), structure)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(inherits(&s_info));
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putAnonymousValue(globalObject->globalData(), 0, globalObject);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ArrayPrototype::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getStaticFunctionSlot<JSArray>(exec, ExecState::arrayTable(exec), this, propertyName, slot);
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool ArrayPrototype::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return getStaticFunctionDescriptor<JSArray>(exec, ExecState::arrayTable(exec), this, propertyName, descriptor);
132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ------------------------------ Array Functions ----------------------------
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Helper function
1375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic JSValue getProperty(ExecState* exec, JSObject* obj, unsigned index)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PropertySlot slot(obj);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!obj->getPropertySlot(exec, index, slot))
1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return JSValue();
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return slot.getValue(exec, index);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic void putProperty(ExecState* exec, JSObject* obj, const Identifier& propertyName, JSValue value)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PutPropertySlot slot;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    obj->put(exec, propertyName, value, slot);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic unsigned argumentClampedIndexFromStartOrEnd(ExecState* exec, int argument, unsigned length, unsigned undefinedValue = 0)
1525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
1535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSValue value = exec->argument(argument);
1545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (value.isUndefined())
1555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return undefinedValue;
1565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    double indexDouble = value.toInteger(exec);
1585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (indexDouble < 0) {
1595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        indexDouble += length;
1605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return indexDouble < 0 ? 0 : static_cast<unsigned>(indexDouble);
1615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
1625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return indexDouble > length ? length : static_cast<unsigned>(indexDouble);
1635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
1645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncToString(ExecState* exec)
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue thisValue = exec->hostThisValue();
1682bde8e466a4451c7319e3a072d118917957d6554Steve Block
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool isRealArray = isJSArray(&exec->globalData(), thisValue);
17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!isRealArray && !thisValue.inherits(&JSArray::s_info))
171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    JSArray* thisObj = asArray(thisValue);
173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1742bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
1752bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block
178ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    StringRecursionChecker checker(exec, thisObj);
179ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (EncodedJSValue earlyReturnValue = checker.earlyReturnValue())
180ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return earlyReturnValue;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    unsigned totalSize = length ? length - 1 : 0;
183a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if OS(SYMBIAN)
184a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Symbian has very limited stack size available.
185a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // This function could be called recursively and allocating 1K on stack here cause
186a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // stack overflow on Symbian devices.
187a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Vector<RefPtr<StringImpl> > strBuffer(length);
188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#else
189f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    Vector<RefPtr<StringImpl>, 256> strBuffer(length);
190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < length; k++) {
192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        JSValue element;
193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isRealArray && thisObj->canGetIndex(k))
194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            element = thisObj->getIndex(k);
195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        else
196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            element = thisObj->get(exec, k);
197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (element.isUndefinedOrNull())
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        UString str = element.toString(exec);
202f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        strBuffer[k] = str.impl();
203f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        totalSize += str.length();
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!strBuffer.data()) {
2068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            throwOutOfMemoryError(exec);
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (exec->hadException())
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!totalSize)
213545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return JSValue::encode(jsEmptyString(exec));
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Vector<UChar> buffer;
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    buffer.reserveCapacity(totalSize);
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!buffer.data())
217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return JSValue::encode(throwOutOfMemoryError(exec));
218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
219231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (unsigned i = 0; i < length; i++) {
220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (i)
221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            buffer.append(',');
222f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        if (RefPtr<StringImpl> rep = strBuffer[i])
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            buffer.append(rep->characters(), rep->length());
224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(buffer.size() == totalSize);
226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(jsString(exec, UString::adopt(buffer)));
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
229545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncToLocaleString(ExecState* exec)
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue thisValue = exec->hostThisValue();
2322bde8e466a4451c7319e3a072d118917957d6554Steve Block
23381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!thisValue.inherits(&JSArray::s_info))
234545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* thisObj = asArray(thisValue);
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2372bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
2382bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block
241ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    StringRecursionChecker checker(exec, thisObj);
242ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (EncodedJSValue earlyReturnValue = checker.earlyReturnValue())
243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return earlyReturnValue;
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    JSStringBuilder strBuffer;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < length; k++) {
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (k >= 1)
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            strBuffer.append(',');
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue element = thisObj->get(exec, k);
2518a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!element.isUndefinedOrNull()) {
2528a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            JSObject* o = element.toObject(exec);
2538a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            JSValue conversionFunction = o->get(exec, exec->propertyNames().toLocaleString);
2548a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            UString str;
2558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            CallData callData;
256545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            CallType callType = getCallData(conversionFunction, callData);
2578a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (callType != CallTypeNone)
2588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                str = call(exec, conversionFunction, callType, callData, element, exec->emptyList()).toString(exec);
2598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            else
2608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                str = element.toString(exec);
2618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            strBuffer.append(str);
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
264ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
265545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(strBuffer.build(exec));
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncJoin(ExecState* exec)
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
2712bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
2722bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
2732bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
275ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    StringRecursionChecker checker(exec, thisObj);
276ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (EncodedJSValue earlyReturnValue = checker.earlyReturnValue())
277ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return earlyReturnValue;
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    JSStringBuilder strBuffer;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    UString separator;
2825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!exec->argument(0).isUndefined())
2835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        separator = exec->argument(0).toString(exec);
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28521939df44de1705786c545cd1bf519d47250322dBen Murdoch    unsigned k = 0;
28621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (isJSArray(&exec->globalData(), thisObj)) {
28721939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSArray* array = asArray(thisObj);
2886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (length) {
2906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            if (!array->canGetIndex(k))
2916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                goto skipFirstLoop;
29221939df44de1705786c545cd1bf519d47250322dBen Murdoch            JSValue element = array->getIndex(k);
29321939df44de1705786c545cd1bf519d47250322dBen Murdoch            if (!element.isUndefinedOrNull())
29421939df44de1705786c545cd1bf519d47250322dBen Murdoch                strBuffer.append(element.toString(exec));
2956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            k++;
2966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
2976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (separator.isNull()) {
2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            for (; k < length; k++) {
3006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (!array->canGetIndex(k))
3016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    break;
3026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                strBuffer.append(',');
3036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                JSValue element = array->getIndex(k);
3046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (!element.isUndefinedOrNull())
3056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    strBuffer.append(element.toString(exec));
3066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            }
3076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        } else {
3086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            for (; k < length; k++) {
3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (!array->canGetIndex(k))
3106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    break;
3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                strBuffer.append(separator);
3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                JSValue element = array->getIndex(k);
3136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (!element.isUndefinedOrNull())
3146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    strBuffer.append(element.toString(exec));
3156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            }
31621939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
31721939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
3186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen skipFirstLoop:
31921939df44de1705786c545cd1bf519d47250322dBen Murdoch    for (; k < length; k++) {
3208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (k >= 1) {
3218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if (separator.isNull())
3228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                strBuffer.append(',');
3238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            else
3248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                strBuffer.append(separator);
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue element = thisObj->get(exec, k);
3288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!element.isUndefinedOrNull())
3298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            strBuffer.append(element.toString(exec));
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
331ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
332545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(strBuffer.build(exec));
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
335545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncConcat(ExecState* exec)
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue thisValue = exec->hostThisValue();
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSArray* arr = constructEmptyArray(exec);
3395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned n = 0;
3405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue curArg = thisValue.toThisObject(exec);
3415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    size_t i = 0;
3425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    size_t argCount = exec->argumentCount();
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (1) {
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (curArg.inherits(&JSArray::s_info)) {
3458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            unsigned length = curArg.get(exec, exec->propertyNames().length).toUInt32(exec);
3468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            JSObject* curObject = curArg.toObject(exec);
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (unsigned k = 0; k < length; ++k) {
3485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (JSValue v = getProperty(exec, curObject, k))
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    arr->put(exec, n, v);
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                n++;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            arr->put(exec, n, curArg);
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            n++;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (i == argCount)
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        curArg = (exec->argument(i));
3595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ++i;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    arr->setLength(n);
362545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(arr);
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
365545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncPop(ExecState* exec)
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue thisValue = exec->hostThisValue();
3682bde8e466a4451c7319e3a072d118917957d6554Steve Block
3698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (isJSArray(&exec->globalData(), thisValue))
370545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return JSValue::encode(asArray(thisValue)->pop());
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSObject* thisObj = thisValue.toThisObject(exec);
373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
3742bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
3752bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
3762bde8e466a4451c7319e3a072d118917957d6554Steve Block
3772bde8e466a4451c7319e3a072d118917957d6554Steve Block    JSValue result;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length == 0) {
379e14391e94c850b8bd03680c23b38978db68687a8John Reck        putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length));
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = jsUndefined();
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = thisObj->get(exec, length - 1);
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        thisObj->deleteProperty(exec, length - 1);
384e14391e94c850b8bd03680c23b38978db68687a8John Reck        putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length - 1));
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
386545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
389545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncPush(ExecState* exec)
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue thisValue = exec->hostThisValue();
3922bde8e466a4451c7319e3a072d118917957d6554Steve Block
3935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (isJSArray(&exec->globalData(), thisValue) && exec->argumentCount() == 1) {
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSArray* array = asArray(thisValue);
3955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        array->push(exec, exec->argument(0));
396e14391e94c850b8bd03680c23b38978db68687a8John Reck        return JSValue::encode(jsNumber(array->length()));
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSObject* thisObj = thisValue.toThisObject(exec);
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
4012bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
4022bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
4032bde8e466a4451c7319e3a072d118917957d6554Steve Block
4045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned n = 0; n < exec->argumentCount(); n++)
4055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        thisObj->put(exec, length + n, exec->argument(n));
4065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    length += exec->argumentCount();
407e14391e94c850b8bd03680c23b38978db68687a8John Reck    putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length));
408e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(length));
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
411545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncReverse(ExecState* exec)
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
414635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
4152bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
4162bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned middle = length / 2;
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < middle; k++) {
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned lk1 = length - k - 1;
4215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue obj2 = getProperty(exec, thisObj, lk1);
4225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue obj = getProperty(exec, thisObj, k);
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (obj2)
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->put(exec, k, obj2);
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->deleteProperty(exec, k);
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (obj)
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->put(exec, lk1, obj);
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->deleteProperty(exec, lk1);
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
434545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(thisObj);
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
437545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncShift(ExecState* exec)
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
4405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
4432bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
4442bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
4452bde8e466a4451c7319e3a072d118917957d6554Steve Block
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (length == 0) {
447e14391e94c850b8bd03680c23b38978db68687a8John Reck        putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length));
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = jsUndefined();
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = thisObj->get(exec, 0);
451db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        if (isJSArray(&exec->globalData(), thisObj))
452db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            ((JSArray *)thisObj)->shiftCount(exec, 1);
453db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        else {
454db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            for (unsigned k = 1; k < length; k++) {
455db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                if (JSValue obj = getProperty(exec, thisObj, k))
456db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    thisObj->put(exec, k - 1, obj);
457db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                else
458db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    thisObj->deleteProperty(exec, k - 1);
459db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            }
460db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            thisObj->deleteProperty(exec, length - 1);
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
462e14391e94c850b8bd03680c23b38978db68687a8John Reck        putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length - 1));
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
464545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
467545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncSlice(ExecState* exec)
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // http://developer.netscape.com/docs/manuals/js/client/jsref/array.htm#1193713 or 15.4.4.10
4705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We return a new array
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSArray* resObj = constructEmptyArray(exec);
4745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result = resObj;
4755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block
4805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
4815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned end = argumentClampedIndexFromStartOrEnd(exec, 1, length, length);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned n = 0;
4845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (unsigned k = begin; k < end; k++, n++) {
4855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (JSValue v = getProperty(exec, thisObj, k))
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            resObj->put(exec, n, v);
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resObj->setLength(n);
489545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
492545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncSort(ExecState* exec)
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
4952bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!length || exec->hadException())
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(thisObj);
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
501545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (thisObj->classInfo() == &JSArray::s_info) {
504231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (isNumericCompareFunction(exec, callType, callData))
505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            asArray(thisObj)->sortNumeric(exec, function, callType, callData);
506635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (callType != CallTypeNone)
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            asArray(thisObj)->sort(exec, function, callType, callData);
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            asArray(thisObj)->sort(exec);
510545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return JSValue::encode(thisObj);
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // "Min" sort. Not the fastest, but definitely less code than heapsort
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // or quicksort, and much less swapping than bubblesort/insertionsort.
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < length - 1; ++i) {
5165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue iObj = thisObj->get(exec, i);
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned themin = i;
5205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue minObj = iObj;
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned j = i + 1; j < length; ++j) {
5225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue jObj = thisObj->get(exec, j);
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (exec->hadException())
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                return JSValue::encode(jsUndefined());
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            double compareResult;
526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (jObj.isUndefined())
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                compareResult = 1; // don't check minObj because there's no need to differentiate == (0) from > (1)
528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else if (minObj.isUndefined())
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                compareResult = -1;
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (callType != CallTypeNone) {
5315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                MarkedArgumentBuffer l;
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l.append(jObj);
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                l.append(minObj);
534635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                compareResult = call(exec, function, callType, callData, exec->globalThisValue(), l).toNumber(exec);
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
536635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                compareResult = (jObj.toString(exec) < minObj.toString(exec)) ? -1 : 1;
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (compareResult < 0) {
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                themin = j;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                minObj = jObj;
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Swap themin and i
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (themin > i) {
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->put(exec, i, minObj);
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            thisObj->put(exec, themin, iObj);
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
549545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(thisObj);
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
552545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncSplice(ExecState* exec)
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // 15.4.4.12
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5562bde8e466a4451c7319e3a072d118917957d6554Steve Block    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
5572bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
5582bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
5592bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
5602bde8e466a4451c7319e3a072d118917957d6554Steve Block
5615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!exec->argumentCount())
5625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return JSValue::encode(constructEmptyArray(exec));
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned begin = argumentClampedIndexFromStartOrEnd(exec, 0, length);
5655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
5665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned deleteCount = length - begin;
5675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (exec->argumentCount() > 1) {
5685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        double deleteDouble = exec->argument(1).toInteger(exec);
5695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (deleteDouble < 0)
5705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            deleteCount = 0;
5715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else if (deleteDouble > length - begin)
5725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            deleteCount = length - begin;
5735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        else
5745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            deleteCount = static_cast<unsigned>(deleteDouble);
5755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSArray* resObj = new (exec) JSArray(exec->globalData(), exec->lexicalGlobalObject()->arrayStructure(), deleteCount, CreateCompact);
578967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSValue result = resObj;
5792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    JSGlobalData& globalData = exec->globalData();
580967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    for (unsigned k = 0; k < deleteCount; k++)
5812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        resObj->uncheckedSetIndex(globalData, k, getProperty(exec, thisObj, k + begin));
582967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resObj->setLength(deleteCount);
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned additionalArgs = std::max<int>(exec->argumentCount() - 2, 0);
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (additionalArgs != deleteCount) {
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (additionalArgs < deleteCount) {
588db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            if ((!begin) && (isJSArray(&exec->globalData(), thisObj)))
589db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                ((JSArray *)thisObj)->shiftCount(exec, deleteCount - additionalArgs);
590db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            else {
591db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                for (unsigned k = begin; k < length - deleteCount; ++k) {
592db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    if (JSValue v = getProperty(exec, thisObj, k + deleteCount))
593db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                        thisObj->put(exec, k + additionalArgs, v);
594db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    else
595db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                        thisObj->deleteProperty(exec, k + additionalArgs);
596db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                }
597db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                for (unsigned k = length; k > length - deleteCount + additionalArgs; --k)
598db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    thisObj->deleteProperty(exec, k - 1);
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
601db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            if ((!begin) && (isJSArray(&exec->globalData(), thisObj)))
602db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                ((JSArray *)thisObj)->unshiftCount(exec, additionalArgs - deleteCount);
603db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            else {
604db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                for (unsigned k = length - deleteCount; k > begin; --k) {
605db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    if (JSValue obj = getProperty(exec, thisObj, k + deleteCount - 1))
606db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                        thisObj->put(exec, k + additionalArgs - 1, obj);
607db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    else
608db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                        thisObj->deleteProperty(exec, k + additionalArgs - 1);
609db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                }
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < additionalArgs; ++k)
6145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        thisObj->put(exec, k + begin, exec->argument(k + 2));
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
616e14391e94c850b8bd03680c23b38978db68687a8John Reck    putProperty(exec, thisObj, exec->propertyNames().length, jsNumber(length - deleteCount + additionalArgs));
617545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
620545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncUnShift(ExecState* exec)
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // 15.4.4.13
6232bde8e466a4451c7319e3a072d118917957d6554Steve Block
6242bde8e466a4451c7319e3a072d118917957d6554Steve Block    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
6262bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
6272bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
6282bde8e466a4451c7319e3a072d118917957d6554Steve Block
6295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned nrArgs = exec->argumentCount();
630db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if ((nrArgs) && (length)) {
631db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        if (isJSArray(&exec->globalData(), thisObj))
632db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            ((JSArray *)thisObj)->unshiftCount(exec, nrArgs);
633db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        else {
634db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            for (unsigned k = length; k > 0; --k) {
635db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                if (JSValue v = getProperty(exec, thisObj, k - 1))
636db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    thisObj->put(exec, k + nrArgs - 1, v);
637db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                else
638db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block                    thisObj->deleteProperty(exec, k + nrArgs - 1);
639db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block            }
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < nrArgs; ++k)
6435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        thisObj->put(exec, k, exec->argument(k));
644e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSValue result = jsNumber(length + nrArgs);
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    putProperty(exec, thisObj, exec->propertyNames().length, result);
646545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
649545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncFilter(ExecState* exec)
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
6522bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
6532bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
6542bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
658545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callType == CallTypeNone)
660545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSObject* applyThis = exec->argument(1).isUndefinedOrNull() ? exec->globalThisValue() : exec->argument(1).toObject(exec);
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSArray* resultArray = constructEmptyArray(exec);
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned filterIndex = 0;
6665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned k = 0;
6675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && isJSArray(&exec->globalData(), thisObj)) {
6685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSFunction* f = asFunction(function);
6695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSArray* array = asArray(thisObj);
670e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, f, 3);
6715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; k < length && !exec->hadException(); ++k) {
6725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (!array->canGetIndex(k))
6735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
6745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue v = array->getIndex(k);
6755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(applyThis);
6765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, v);
677e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(1, jsNumber(k));
6785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(2, thisObj);
6795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = cachedCall.call();
6815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (result.toBoolean(exec))
6825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                resultArray->put(exec, filterIndex++, v);
6835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
6845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (k == length)
685545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return JSValue::encode(resultArray);
6865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
6875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; k < length && !exec->hadException(); ++k) {
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(thisObj);
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!thisObj->getPropertySlot(exec, k, slot))
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
6915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue v = slot.getValue(exec, k);
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        MarkedArgumentBuffer eachArguments;
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(v);
698e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(k));
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(thisObj);
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = call(exec, function, callType, callData, applyThis, eachArguments);
702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (result.toBoolean(exec))
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            resultArray->put(exec, filterIndex++, v);
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
705545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(resultArray);
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncMap(ExecState* exec)
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
7112bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
7122bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
7132bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
717545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callType == CallTypeNone)
719545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSObject* applyThis = exec->argument(1).isUndefinedOrNull() ? exec->globalThisValue() : exec->argument(1).toObject(exec);
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSArray* resultArray = constructEmptyArray(exec, length);
7245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned k = 0;
7255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && isJSArray(&exec->globalData(), thisObj)) {
7265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSFunction* f = asFunction(function);
7275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSArray* array = asArray(thisObj);
728e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, f, 3);
7295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; k < length && !exec->hadException(); ++k) {
7305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!array->canGetIndex(k)))
7315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(applyThis);
7345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, array->getIndex(k));
735e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(1, jsNumber(k));
7365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(2, thisObj);
7375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            resultArray->JSArray::put(exec, k, cachedCall.call());
7395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
7405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
7415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; k < length && !exec->hadException(); ++k) {
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(thisObj);
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!thisObj->getPropertySlot(exec, k, slot))
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
7455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue v = slot.getValue(exec, k);
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        MarkedArgumentBuffer eachArguments;
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(v);
752e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(k));
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(thisObj);
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
7562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
7572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = call(exec, function, callType, callData, applyThis, eachArguments);
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resultArray->put(exec, k, result);
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
762545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(resultArray);
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Documentation for these three is available at:
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// http://developer-test.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:every
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// http://developer-test.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:forEach
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// http://developer-test.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:some
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
770545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncEvery(ExecState* exec)
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
7732bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
7742bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
7752bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
779545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callType == CallTypeNone)
781545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSObject* applyThis = exec->argument(1).isUndefinedOrNull() ? exec->globalThisValue() : exec->argument(1).toObject(exec);
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result = jsBoolean(true);
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned k = 0;
7885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && isJSArray(&exec->globalData(), thisObj)) {
7895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSFunction* f = asFunction(function);
7905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSArray* array = asArray(thisObj);
791e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, f, 3);
7925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; k < length && !exec->hadException(); ++k) {
7935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!array->canGetIndex(k)))
7945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
7955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(applyThis);
7975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, array->getIndex(k));
798e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(1, jsNumber(k));
7995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(2, thisObj);
800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            JSValue result = cachedCall.call();
801643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!result.toBoolean(cachedCall.newCallFrame(exec)))
802545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                return JSValue::encode(jsBoolean(false));
8035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
8045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
8055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; k < length && !exec->hadException(); ++k) {
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(thisObj);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!thisObj->getPropertySlot(exec, k, slot))
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MarkedArgumentBuffer eachArguments;
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(slot.getValue(exec, k));
812e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(k));
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(thisObj);
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
8162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool predicateResult = call(exec, function, callType, callData, applyThis, eachArguments).toBoolean(exec);
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!predicateResult) {
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = jsBoolean(false);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
825545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncForEach(ExecState* exec)
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
8312bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
8322bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
8332bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
837545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callType == CallTypeNone)
839545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSObject* applyThis = exec->argument(1).isUndefinedOrNull() ? exec->globalThisValue() : exec->argument(1).toObject(exec);
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned k = 0;
8445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && isJSArray(&exec->globalData(), thisObj)) {
8455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSFunction* f = asFunction(function);
8465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSArray* array = asArray(thisObj);
847e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, f, 3);
8485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; k < length && !exec->hadException(); ++k) {
8495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!array->canGetIndex(k)))
8505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
8515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(applyThis);
8535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, array->getIndex(k));
854e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(1, jsNumber(k));
8555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(2, thisObj);
8565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.call();
8585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
8595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
8605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; k < length && !exec->hadException(); ++k) {
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(thisObj);
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!thisObj->getPropertySlot(exec, k, slot))
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MarkedArgumentBuffer eachArguments;
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(slot.getValue(exec, k));
867e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(k));
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(thisObj);
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
8712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
8722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        call(exec, function, callType, callData, applyThis, eachArguments);
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
875545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(jsUndefined());
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncSome(ExecState* exec)
8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
8812bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
8822bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
8832bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
8868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallData callData;
887545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callType == CallTypeNone)
889545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSObject* applyThis = exec->argument(1).isUndefinedOrNull() ? exec->globalThisValue() : exec->argument(1).toObject(exec);
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result = jsBoolean(false);
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned k = 0;
8965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && isJSArray(&exec->globalData(), thisObj)) {
8975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSFunction* f = asFunction(function);
8985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSArray* array = asArray(thisObj);
899e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, f, 3);
9005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; k < length && !exec->hadException(); ++k) {
9015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!array->canGetIndex(k)))
9025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
9035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(applyThis);
9055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, array->getIndex(k));
906e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(1, jsNumber(k));
9075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(2, thisObj);
908643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            JSValue result = cachedCall.call();
909643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (result.toBoolean(cachedCall.newCallFrame(exec)))
910545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                return JSValue::encode(jsBoolean(true));
9115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
9125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; k < length && !exec->hadException(); ++k) {
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(thisObj);
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!thisObj->getPropertySlot(exec, k, slot))
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MarkedArgumentBuffer eachArguments;
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(slot.getValue(exec, k));
920e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(k));
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        eachArguments.append(thisObj);
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
9242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        bool predicateResult = call(exec, function, callType, callData, applyThis, eachArguments).toBoolean(exec);
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (predicateResult) {
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = jsBoolean(true);
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
932545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(result);
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
935545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncReduce(ExecState* exec)
9365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
9375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
9382bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
9392bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
9402bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
9412bde8e466a4451c7319e3a072d118917957d6554Steve Block
9425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
9435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CallData callData;
944545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
9455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeNone)
946545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
9475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned i = 0;
9495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue rv;
9505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!length && exec->argumentCount() == 1)
951545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
9522bde8e466a4451c7319e3a072d118917957d6554Steve Block
9535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSArray* array = 0;
9545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (isJSArray(&exec->globalData(), thisObj))
9555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        array = asArray(thisObj);
9565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (exec->argumentCount() >= 2)
9585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        rv = exec->argument(1);
9595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    else if (array && array->canGetIndex(0)){
9605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        rv = array->getIndex(0);
9615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        i = 1;
9625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else {
9635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (i = 0; i < length; i++) {
9645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            rv = getProperty(exec, thisObj, i);
9655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (rv)
9665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
9675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
9685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!rv)
969545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return throwVMTypeError(exec);
9705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        i++;
9715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && array) {
974e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, asFunction(function), 4);
9755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; i < length && !exec->hadException(); ++i) {
9765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(jsNull());
9775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, rv);
9785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue v;
9795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (LIKELY(array->canGetIndex(i)))
9805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                v = array->getIndex(i);
9815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            else
9825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break; // length has been made unsafe while we enumerate fallback to slow path
9835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(1, v);
984e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(2, jsNumber(i));
9855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(3, array);
9865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            rv = cachedCall.call();
9875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
9885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (i == length) // only return if we reached the end of the array
989545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return JSValue::encode(rv);
9905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; i < length && !exec->hadException(); ++i) {
9935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue prop = getProperty(exec, thisObj, i);
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
9952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
9965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!prop)
9975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            continue;
9985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MarkedArgumentBuffer eachArguments;
10005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(rv);
10015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(prop);
1002e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(i));
10035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(thisObj);
10045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        rv = call(exec, function, callType, callData, jsNull(), eachArguments);
10065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1007545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(rv);
10085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1010545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncReduceRight(ExecState* exec)
10115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
10132bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
10142bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
10152bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
10162bde8e466a4451c7319e3a072d118917957d6554Steve Block
10175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue function = exec->argument(0);
10185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CallData callData;
1019545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
10205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeNone)
1021545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
10225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned i = 0;
10245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue rv;
10255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (!length && exec->argumentCount() == 1)
1026545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return throwVMTypeError(exec);
10272bde8e466a4451c7319e3a072d118917957d6554Steve Block
10285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSArray* array = 0;
10295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (isJSArray(&exec->globalData(), thisObj))
10305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        array = asArray(thisObj);
10315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (exec->argumentCount() >= 2)
10335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        rv = exec->argument(1);
10345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    else if (array && array->canGetIndex(length - 1)){
10355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        rv = array->getIndex(length - 1);
10365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        i = 1;
10375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else {
10385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (i = 0; i < length; i++) {
10395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            rv = getProperty(exec, thisObj, length - i - 1);
10405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (rv)
10415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break;
10425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
10435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!rv)
1044545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return throwVMTypeError(exec);
10455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        i++;
10465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
10475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (callType == CallTypeJS && array) {
1049e14391e94c850b8bd03680c23b38978db68687a8John Reck        CachedCall cachedCall(exec, asFunction(function), 4);
10505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        for (; i < length && !exec->hadException(); ++i) {
10515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            unsigned idx = length - i - 1;
10525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setThis(jsNull());
10535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(0, rv);
10545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!array->canGetIndex(idx)))
10555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                break; // length has been made unsafe while we enumerate fallback to slow path
10565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(1, array->getIndex(idx));
1057e14391e94c850b8bd03680c23b38978db68687a8John Reck            cachedCall.setArgument(2, jsNumber(idx));
10585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            cachedCall.setArgument(3, array);
10595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            rv = cachedCall.call();
10605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
10615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (i == length) // only return if we reached the end of the array
1062545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return JSValue::encode(rv);
10635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
10645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (; i < length && !exec->hadException(); ++i) {
10665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned idx = length - i - 1;
10675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue prop = getProperty(exec, thisObj, idx);
10682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (exec->hadException())
10692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return JSValue::encode(jsUndefined());
10705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!prop)
10715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            continue;
10725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MarkedArgumentBuffer eachArguments;
10745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(rv);
10755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(prop);
1076e14391e94c850b8bd03680c23b38978db68687a8John Reck        eachArguments.append(jsNumber(idx));
10775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        eachArguments.append(thisObj);
10785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        rv = call(exec, function, callType, callData, jsNull(), eachArguments);
10805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1081545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return JSValue::encode(rv);
10825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1084545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncIndexOf(ExecState* exec)
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10862bde8e466a4451c7319e3a072d118917957d6554Steve Block    // 15.4.4.14
10875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
1088635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
10892bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (exec->hadException())
10902bde8e466a4451c7319e3a072d118917957d6554Steve Block        return JSValue::encode(jsUndefined());
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10922bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned index = argumentClampedIndexFromStartOrEnd(exec, 1, length);
10935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue searchElement = exec->argument(0);
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (; index < length; ++index) {
10955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue e = getProperty(exec, thisObj, index);
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!e)
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (JSValue::strictEqual(exec, searchElement, e))
1099e14391e94c850b8bd03680c23b38978db68687a8John Reck            return JSValue::encode(jsNumber(index));
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1102e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(-1));
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL arrayProtoFuncLastIndexOf(ExecState* exec)
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11072bde8e466a4451c7319e3a072d118917957d6554Steve Block    // 15.4.4.15
11085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSObject* thisObj = exec->hostThisValue().toThisObject(exec);
1109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
11105ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!length)
1111e14391e94c850b8bd03680c23b38978db68687a8John Reck        return JSValue::encode(jsNumber(-1));
11125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
11135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned index = length - 1;
11145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    JSValue fromValue = exec->argument(1);
11155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!fromValue.isUndefined()) {
11165ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        double fromDouble = fromValue.toInteger(exec);
11175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (fromDouble < 0) {
11185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            fromDouble += length;
11195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (fromDouble < 0)
1120e14391e94c850b8bd03680c23b38978db68687a8John Reck                return JSValue::encode(jsNumber(-1));
11215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
11225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (fromDouble < length)
11235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            index = static_cast<unsigned>(fromDouble);
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue searchElement = exec->argument(0);
11275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    do {
11285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        ASSERT(index < length);
11295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue e = getProperty(exec, thisObj, index);
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!e)
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (JSValue::strictEqual(exec, searchElement, e))
1133e14391e94c850b8bd03680c23b38978db68687a8John Reck            return JSValue::encode(jsNumber(index));
11345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    } while (index--);
11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1136e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(-1));
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
1140