/*
 * Copyright (c) 2015 Canon Inc.
 * Copyright (c) 2015 Igalia.
 * Copyright (c) 2016 Apple Inc. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

// DO NOT EDIT THIS FILE. It is automatically generated from JavaScript files for
// builtins by the script: Source/JavaScriptCore/Scripts/generate-js-builtins.py

#include "config.h"
#include "ReadableStreamBuiltins.h"

#if ENABLE(READABLE_STREAM_API)

#include "WebCoreJSClientData.h"
#include <heap/HeapInlines.h>
#include <runtime/Executable.h>
#include <runtime/Intrinsic.h>
#include <runtime/JSCJSValueInlines.h>
#include <runtime/JSCellInlines.h>
#include <runtime/StructureInlines.h>
#include <runtime/VM.h>

namespace WebCore {

const JSC::ConstructAbility s_readableStreamInitializeReadableStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamInitializeReadableStreamCodeLength = 1272;
static const JSC::Intrinsic s_readableStreamInitializeReadableStreamCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamInitializeReadableStreamCode =
    "(function (underlyingSource, strategy)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "     if (underlyingSource === @undefined)\n" \
    "         underlyingSource = { };\n" \
    "     if (strategy === @undefined)\n" \
    "         strategy = { highWaterMark: 1, size: function() { return 1; } };\n" \
    "    if (!@isObject(underlyingSource))\n" \
    "        throw new @TypeError(\"ReadableStream constructor takes an object as first argument\");\n" \
    "    if (strategy !== @undefined && !@isObject(strategy))\n" \
    "        throw new @TypeError(\"ReadableStream constructor takes an object as second argument, if any\");\n" \
    "    this.@state = @streamReadable;\n" \
    "    this.@reader = @undefined;\n" \
    "    this.@storedError = @undefined;\n" \
    "    this.@disturbed = false;\n" \
    "    this.@readableStreamController = null;\n" \
    "    const type = underlyingSource.type;\n" \
    "    const typeString = @String(type);\n" \
    "    if (typeString === \"bytes\") {\n" \
    "        throw new @TypeError(\"ReadableByteStreamController is not implemented\");\n" \
    "    } else if (type === @undefined) {\n" \
    "        if (strategy.highWaterMark === @undefined)\n" \
    "            strategy.highWaterMark = 1;\n" \
    "        this.@readableStreamController = new @ReadableStreamDefaultController(this, underlyingSource, strategy.size, strategy.highWaterMark);\n" \
    "    } else\n" \
    "        throw new @RangeError(\"Invalid type for underlying source\");\n" \
    "    return this;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamCancelCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamCancelCodeLength = 321;
static const JSC::Intrinsic s_readableStreamCancelCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamCancelCode =
    "(function (reason)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    if (!@isReadableStream(this))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"ReadableStream\", \"cancel\"));\n" \
    "    if (@isReadableStreamLocked(this))\n" \
    "        return @Promise.@reject(new @TypeError(\"ReadableStream is locked\"));\n" \
    "    return @cancelReadableStream(this, reason);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamGetReaderCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamGetReaderCodeLength = 464;
static const JSC::Intrinsic s_readableStreamGetReaderCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamGetReaderCode =
    "(function (options)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    if (!@isReadableStream(this))\n" \
    "        throw @makeThisTypeError(\"ReadableStream\", \"getReader\");\n" \
    "    if (options === @undefined)\n" \
    "         options = { };\n" \
    "    if (options.mode === 'byob') {\n" \
    "        throw new @TypeError(\"ReadableStreamBYOBReader is not implemented\");\n" \
    "    }\n" \
    "    if (options.mode === @undefined)\n" \
    "        return new @ReadableStreamDefaultReader(this);\n" \
    "    throw new @RangeError(\"Invalid mode is specified\");\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamPipeThroughCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamPipeThroughCodeLength = 187;
static const JSC::Intrinsic s_readableStreamPipeThroughCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamPipeThroughCode =
    "(function (streams, options)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    const writable = streams.writable;\n" \
    "    const readable = streams.readable;\n" \
    "    this.pipeTo(writable, options);\n" \
    "    return readable;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamPipeToCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamPipeToCodeLength = 2593;
static const JSC::Intrinsic s_readableStreamPipeToCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamPipeToCode =
    "(function (destination)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    const options = arguments[1];\n" \
    "    const preventClose = @isObject(options) && !!options.preventClose;\n" \
    "    const preventAbort = @isObject(options) && !!options.preventAbort;\n" \
    "    const preventCancel = @isObject(options) && !!options.preventCancel;\n" \
    "    const source = this;\n" \
    "    let reader;\n" \
    "    let lastRead;\n" \
    "    let lastWrite;\n" \
    "    let closedPurposefully = false;\n" \
    "    let promiseCapability;\n" \
    "    function doPipe() {\n" \
    "        lastRead = reader.read();\n" \
    "        @Promise.prototype.@then.@call(@Promise.all([lastRead, destination.ready]), function([{ value, done }]) {\n" \
    "            if (done)\n" \
    "                closeDestination();\n" \
    "            else if (destination.state === \"writable\") {\n" \
    "                lastWrite = destination.write(value);\n" \
    "                doPipe();\n" \
    "            }\n" \
    "        }, function(e) {\n" \
    "            throw e;\n" \
    "        });\n" \
    "    }\n" \
    "    function cancelSource(reason) {\n" \
    "        if (!preventCancel) {\n" \
    "            reader.cancel(reason);\n" \
    "            reader.releaseLock();\n" \
    "            promiseCapability.@reject.@call(@undefined, reason);\n" \
    "        } else {\n" \
    "            @Promise.prototype.@then.@call(lastRead, function() {\n" \
    "                reader.releaseLock();\n" \
    "                promiseCapability.@reject.@call(@undefined, reason);\n" \
    "            });\n" \
    "        }\n" \
    "    }\n" \
    "    function closeDestination() {\n" \
    "        reader.releaseLock();\n" \
    "        const destinationState = destination.state;\n" \
    "        if (!preventClose && (destinationState === \"waiting\" || destinationState === \"writable\")) {\n" \
    "            closedPurposefully = true;\n" \
    "            @Promise.prototype.@then.@call(destination.close(), promiseCapability.@resolve, promiseCapability.@reject);\n" \
    "        } else if (lastWrite !== @undefined)\n" \
    "            @Promise.prototype.@then.@call(lastWrite, promiseCapability.@resolve, promiseCapability.@reject);\n" \
    "        else\n" \
    "            promiseCapability.@resolve.@call();\n" \
    "    }\n" \
    "    function abortDestination(reason) {\n" \
    "        reader.releaseLock();\n" \
    "        if (!preventAbort)\n" \
    "            destination.abort(reason);\n" \
    "        promiseCapability.@reject.@call(@undefined, reason);\n" \
    "    }\n" \
    "    promiseCapability = @newPromiseCapability(@Promise);\n" \
    "    reader = source.getReader();\n" \
    "    @Promise.prototype.@then.@call(reader.closed, @undefined, abortDestination);\n" \
    "    @Promise.prototype.@then.@call(destination.closed,\n" \
    "        function() {\n" \
    "            if (!closedPurposefully)\n" \
    "                cancelSource(new @TypeError('destination is closing or closed and cannot be piped to anymore'));\n" \
    "        },\n" \
    "        cancelSource\n" \
    "    );\n" \
    "    doPipe();\n" \
    "    return promiseCapability.@promise;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamTeeCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamTeeCodeLength = 173;
static const JSC::Intrinsic s_readableStreamTeeCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamTeeCode =
    "(function ()\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    if (!@isReadableStream(this))\n" \
    "        throw @makeThisTypeError(\"ReadableStream\", \"tee\");\n" \
    "    return @teeReadableStream(this, false);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_readableStreamLockedCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_readableStreamLockedCodeLength = 176;
static const JSC::Intrinsic s_readableStreamLockedCodeIntrinsic = JSC::NoIntrinsic;
const char* s_readableStreamLockedCode =
    "(function ()\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    if (!@isReadableStream(this))\n" \
    "        throw @makeGetterTypeError(\"ReadableStream\", \"locked\");\n" \
    "    return @isReadableStreamLocked(this);\n" \
    "})\n" \
;


#define DEFINE_BUILTIN_GENERATOR(codeName, functionName, argumentCount) \
JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \
{\
    JSVMClientData* clientData = static_cast<JSVMClientData*>(vm.clientData); \
    return clientData->builtinFunctions().readableStreamBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().readableStreamBuiltins().codeName##Source(), Nullopt, s_##codeName##Intrinsic); \
}
WEBCORE_FOREACH_READABLESTREAM_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
#undef DEFINE_BUILTIN_GENERATOR


} // namespace WebCore

#endif // ENABLE(READABLE_STREAM_API)
