EncodedJSValue JSC_HOST_CALL MapIteratorPrototypeFuncNext(CallFrame* callFrame) { JSMapIterator* iterator = jsDynamicCast<JSMapIterator*>(callFrame->thisValue()); if (!iterator) return JSValue::encode(throwTypeError(callFrame, ASCIILiteral("Cannot call MapIterator.next() on a non-MapIterator object"))); JSValue result; if (iterator->next(callFrame, result)) return JSValue::encode(result); return JSValue::encode(callFrame->vm().iterationTerminator.get()); }
EncodedJSValue JSC_HOST_CALL MapIteratorPrototypeFuncNext(CallFrame* callFrame) { JSMapIterator* iterator = jsDynamicCast<JSMapIterator*>(callFrame->thisValue()); if (!iterator) return JSValue::encode(throwTypeError(callFrame, ASCIILiteral("Cannot call MapIterator.next() on a non-MapIterator object"))); JSValue result; if (iterator->next(callFrame, result)) return JSValue::encode(createIteratorResultObject(callFrame, result, false)); iterator->finish(); return JSValue::encode(createIteratorResultObject(callFrame, jsUndefined(), true)); }
EncodedJSValue JSC_HOST_CALL privateFuncMapIteratorNext(ExecState* exec) { ASSERT(jsDynamicCast<JSMapIterator*>(exec->thisValue())); JSMapIterator* iterator = jsCast<JSMapIterator*>(exec->thisValue()); JSValue key, value; if (iterator->nextKeyValue(exec, key, value)) { JSArray* resultArray = jsCast<JSArray*>(exec->uncheckedArgument(0)); resultArray->putDirectIndex(exec, 0, key); resultArray->putDirectIndex(exec, 1, value); return JSValue::encode(jsBoolean(false)); } return JSValue::encode(jsBoolean(true)); }
EncodedJSValue JSC_HOST_CALL mapProtoFuncForEach(CallFrame* callFrame) { JSMap* map = getMap(callFrame, callFrame->thisValue()); if (!map) return JSValue::encode(jsUndefined()); JSValue callBack = callFrame->argument(0); CallData callData; CallType callType = getCallData(callBack, callData); if (callType == CallTypeNone) return JSValue::encode(throwTypeError(callFrame, WTF::ASCIILiteral("Map.prototype.forEach called without callback"))); JSValue thisValue = callFrame->argument(1); VM* vm = &callFrame->vm(); JSMapIterator* iterator = JSMapIterator::create(*vm, callFrame->callee()->globalObject()->mapIteratorStructure(), map, MapIterateKeyValue); JSValue key, value; if (callType == CallTypeJS) { JSFunction* function = jsCast<JSFunction*>(callBack); CachedCall cachedCall(callFrame, function, 3); while (iterator->nextKeyValue(key, value) && !vm->exception()) { cachedCall.setThis(thisValue); cachedCall.setArgument(0, value); cachedCall.setArgument(1, key); cachedCall.setArgument(2, map); cachedCall.call(); } iterator->finish(); } else { while (iterator->nextKeyValue(key, value) && !vm->exception()) { MarkedArgumentBuffer args; args.append(value); args.append(key); args.append(map); JSC::call(callFrame, callBack, callType, callData, thisValue, args); } iterator->finish(); } return JSValue::encode(jsUndefined()); }