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());
}
示例#2
0
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));
}
示例#3
0
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));
}
示例#4
0
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());
}