/*
 * Copyright (c) 2016 Apple Inc. All rights reserved.
 * Copyright (c) 2016 Canon Inc.
 * 
 * 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 "FetchResponseBuiltins.h"

#if ENABLE(FETCH_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_fetchResponseInitializeFetchResponseCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseInitializeFetchResponseCodeLength = 1015;
static const JSC::Intrinsic s_fetchResponseInitializeFetchResponseCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseInitializeFetchResponseCode =
    "(function (body, init)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "    if (init === @undefined)\n" \
    "        init = { };\n" \
    "    else if (!@isObject(init))\n" \
    "        throw new @TypeError(\"Response init must be an object\");\n" \
    "    let status = (init.status !== @undefined) ? @toNumber(init.status) : 200;\n" \
    "    if (status < 200  || status > 599)\n" \
    "        throw new @RangeError(\"Status must be between 200 and 599\");\n" \
    "    let statusText = (init.statusText !== @undefined) ? init.statusText : \"OK\";\n" \
    "    this.@setStatus(status, statusText);\n" \
    "    if (init.headers !== @undefined)\n" \
    "        @fillFetchHeaders(this.headers, init.headers);\n" \
    "    if (body !== @undefined && body !== null) {\n" \
    "        if (status == 101 || status == 204 || status == 205 || status == 304)\n" \
    "            throw new @TypeError(\"Response cannot have a body with the given status\");\n" \
    "        let isBodyReadableStream = (@isObject(body) && !!body.@readableStreamController);\n" \
    "        if (isBodyReadableStream)\n" \
    "          this.@body = body;\n" \
    "        this.@initializeWith(body);\n" \
    "    }\n" \
    "    return this;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseBodyUsedCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseBodyUsedCodeLength = 247;
static const JSC::Intrinsic s_fetchResponseBodyUsedCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseBodyUsedCode =
    "(function ()\n" \
    "{\n" \
    "   if (!(this instanceof @Response))\n" \
    "        throw @makeGetterTypeError(\"Response\", \"bodyUsed\");\n" \
    "    if (this.@body)\n" \
    "        return @isReadableStreamDisturbed(this.@body);\n" \
    "    return @Response.prototype.@isDisturbed.@call(this);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseBodyCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseBodyCodeLength = 513;
static const JSC::Intrinsic s_fetchResponseBodyCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseBodyCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        throw @makeGetterTypeError(\"Response\", \"body\");\n" \
    "    if (!this.@body) {\n" \
    "        if (@Response.prototype.@isDisturbed.@call(this)) {\n" \
    "            this.@body = new @ReadableStream();\n" \
    "            new @ReadableStreamDefaultReader(this.@body);\n" \
    "        } else {\n" \
    "            var source = @Response.prototype.@createReadableStreamSource.@call(this);\n" \
    "            this.@body = source ? new @ReadableStream(source) : null;\n" \
    "        }\n" \
    "    }\n" \
    "    return this.@body;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseCloneCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseCloneCodeLength = 794;
static const JSC::Intrinsic s_fetchResponseCloneCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseCloneCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        throw @makeThisTypeError(\"Response\", \"clone\");\n" \
    "    if (@Response.prototype.@isDisturbed.@call(this) || (this.@body && @isReadableStreamLocked(this.@body)))\n" \
    "        throw new @TypeError(\"Cannot clone a disturbed Response\");\n" \
    "    var cloned = @Response.prototype.@cloneForJS.@call(this);\n" \
    "    if (@Response.prototype.@isLoading.@call(this) && !this.@body) {\n" \
    "        var source = @Response.prototype.@createReadableStreamSource.@call(this);\n" \
    "        @assert(!!source);\n" \
    "        this.@body = new @ReadableStream(source);\n" \
    "    }\n" \
    "    if (this.@body) {\n" \
    "        var teedReadableStreams = @teeReadableStream(this.@body, true);\n" \
    "        this.@body = teedReadableStreams[0];\n" \
    "        cloned.@body = teedReadableStreams[1];\n" \
    "    }\n" \
    "    return cloned;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseArrayBufferCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseArrayBufferCodeLength = 336;
static const JSC::Intrinsic s_fetchResponseArrayBufferCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseArrayBufferCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"Response\", \"arrayBuffer\"));\n" \
    "    const arrayBufferConsumerType = 1;\n" \
    "    if (!this.@body)\n" \
    "        return @Response.prototype.@consume.@call(this, arrayBufferConsumerType);\n" \
    "    return @consumeStream(this, arrayBufferConsumerType);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseBlobCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseBlobCodeLength = 308;
static const JSC::Intrinsic s_fetchResponseBlobCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseBlobCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"Response\", \"blob\"));\n" \
    "    const blobConsumerType = 2;\n" \
    "    if (!this.@body)\n" \
    "        return @Response.prototype.@consume.@call(this, blobConsumerType);\n" \
    "    return @consumeStream(this, blobConsumerType);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseFormDataCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseFormDataCodeLength = 181;
static const JSC::Intrinsic s_fetchResponseFormDataCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseFormDataCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"Response\", \"formData\"));\n" \
    "    return @Promise.@reject(\"Not implemented\");\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseJsonCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseJsonCodeLength = 308;
static const JSC::Intrinsic s_fetchResponseJsonCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseJsonCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"Response\", \"json\"));\n" \
    "    const jsonConsumerType = 3;\n" \
    "    if (!this.@body)\n" \
    "        return @Response.prototype.@consume.@call(this, jsonConsumerType);\n" \
    "    return @consumeStream(this, jsonConsumerType);\n" \
    "})\n" \
;

const JSC::ConstructAbility s_fetchResponseTextCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const int s_fetchResponseTextCodeLength = 308;
static const JSC::Intrinsic s_fetchResponseTextCodeIntrinsic = JSC::NoIntrinsic;
const char* s_fetchResponseTextCode =
    "(function ()\n" \
    "{\n" \
    "    if (!(this instanceof @Response))\n" \
    "        return @Promise.@reject(@makeThisTypeError(\"Response\", \"text\"));\n" \
    "    const textConsumerType = 4;\n" \
    "    if (!this.@body)\n" \
    "        return @Response.prototype.@consume.@call(this, textConsumerType);\n" \
    "    return @consumeStream(this, textConsumerType);\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().fetchResponseBuiltins().codeName##Executable()->link(vm, clientData->builtinFunctions().fetchResponseBuiltins().codeName##Source(), Nullopt, s_##codeName##Intrinsic); \
}
WEBCORE_FOREACH_FETCHRESPONSE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
#undef DEFINE_BUILTIN_GENERATOR


} // namespace WebCore

#endif // ENABLE(FETCH_API)
