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