### Begin File: BuiltinPrototypeBuiltins.h
/*
 * Copyright (c) 2014, 2015, 2016 Apple Inc. All rights reserved.
 * Copyright (c) 2015 Yusuke Suzuki <utatane.tea@gmail.com>.
 * 
 * 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

#pragma once



namespace JSC {
class FunctionExecutable;
}

namespace JSC {

/* Builtin.prototype */
extern const char* const s_builtinPrototypeEveryCode;
extern const int s_builtinPrototypeEveryCodeLength;
extern const JSC::ConstructAbility s_builtinPrototypeEveryCodeConstructAbility;
extern const JSC::ConstructorKind s_builtinPrototypeEveryCodeConstructorKind;
extern const char* const s_builtinPrototypeForEachCode;
extern const int s_builtinPrototypeForEachCodeLength;
extern const JSC::ConstructAbility s_builtinPrototypeForEachCodeConstructAbility;
extern const JSC::ConstructorKind s_builtinPrototypeForEachCodeConstructorKind;
extern const char* const s_builtinPrototypeMatchCode;
extern const int s_builtinPrototypeMatchCodeLength;
extern const JSC::ConstructAbility s_builtinPrototypeMatchCodeConstructAbility;
extern const JSC::ConstructorKind s_builtinPrototypeMatchCodeConstructorKind;
extern const char* const s_builtinPrototypeTestCode;
extern const int s_builtinPrototypeTestCodeLength;
extern const JSC::ConstructAbility s_builtinPrototypeTestCodeConstructAbility;
extern const JSC::ConstructorKind s_builtinPrototypeTestCodeConstructorKind;

#define JSC_FOREACH_BUILTIN_PROTOTYPE_BUILTIN_DATA(macro) \
    macro(every, builtinPrototypeEvery, 1) \
    macro(forEach, builtinPrototypeForEach, 1) \
    macro(match, builtinPrototypeMatch, 1) \
    macro(test, builtinPrototypeTest, 1) \

#define JSC_BUILTIN_BUILTIN_PROTOTYPE_EVERY 1
#define JSC_BUILTIN_BUILTIN_PROTOTYPE_FOREACH 1
#define JSC_BUILTIN_BUILTIN_PROTOTYPE_MATCH 1
#define JSC_BUILTIN_BUILTIN_PROTOTYPE_TEST 1

#define JSC_FOREACH_BUILTIN.PROTOTYPE_BUILTIN_CODE(macro) \
    macro(builtinPrototypeEveryCode, every, static_cast<const char*>(nullptr), s_builtinPrototypeEveryCodeLength) \
    macro(builtinPrototypeForEachCode, forEach, static_cast<const char*>(nullptr), s_builtinPrototypeForEachCodeLength) \
    macro(builtinPrototypeMatchCode, match, "[Symbol.match]", s_builtinPrototypeMatchCodeLength) \
    macro(builtinPrototypeTestCode, test, static_cast<const char*>(nullptr), s_builtinPrototypeTestCodeLength) \

#define JSC_FOREACH_BUILTIN.PROTOTYPE_BUILTIN_FUNCTION_NAME(macro) \
    macro(every) \
    macro(forEach) \
    macro(match) \
    macro(test) \

#define DECLARE_BUILTIN_GENERATOR(codeName, functionName, overriddenName, argumentCount) \
    JSC::FunctionExecutable* codeName##Generator(JSC::VM&);

JSC_FOREACH_BUILTIN.PROTOTYPE_BUILTIN_CODE(DECLARE_BUILTIN_GENERATOR)
#undef DECLARE_BUILTIN_GENERATOR

} // namespace JSC
### End File: BuiltinPrototypeBuiltins.h

### Begin File: BuiltinPrototypeBuiltins.cpp
/*
 * Copyright (c) 2014, 2015, 2016 Apple Inc. All rights reserved.
 * Copyright (c) 2015 Yusuke Suzuki <utatane.tea@gmail.com>.
 * 
 * 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 "BuiltinPrototypeBuiltins.h"

#include "BuiltinExecutables.h"
#include "HeapInlines.h"
#include "IdentifierInlines.h"
#include "Intrinsic.h"
#include "JSCellInlines.h"
#include "VM.h"

namespace JSC {

const JSC::ConstructAbility s_builtinPrototypeEveryCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_builtinPrototypeEveryCodeConstructorKind = JSC::ConstructorKind::None;
const int s_builtinPrototypeEveryCodeLength = 762;
static const JSC::Intrinsic s_builtinPrototypeEveryCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_builtinPrototypeEveryCode =
    "(function (callback )\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "\n" \
    "    if (this === null)\n" \
    "        throw new @TypeError(\"Array.prototype.every requires that |this| not be null\");\n" \
    "    \n" \
    "    if (this === undefined)\n" \
    "        throw new @TypeError(\"Array.prototype.every requires that |this| not be undefined\");\n" \
    "    \n" \
    "    var array = @Object(this);\n" \
    "    var length = @toLength(array.length);\n" \
    "\n" \
    "    if (typeof callback !== \"function\")\n" \
    "        throw new @TypeError(\"Array.prototype.every callback must be a function\");\n" \
    "    \n" \
    "    var thisArg = arguments.length > 1 ? arguments[1] : undefined;\n" \
    "    \n" \
    "    for (var i = 0; i < length; i++) {\n" \
    "        if (!(i in array))\n" \
    "            continue;\n" \
    "        if (!callback.@call(thisArg, array[i], i, array))\n" \
    "            return false;\n" \
    "    }\n" \
    "    \n" \
    "    return true;\n" \
    "})\n" \
;

const JSC::ConstructAbility s_builtinPrototypeForEachCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_builtinPrototypeForEachCodeConstructorKind = JSC::ConstructorKind::None;
const int s_builtinPrototypeForEachCodeLength = 694;
static const JSC::Intrinsic s_builtinPrototypeForEachCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_builtinPrototypeForEachCode =
    "(function (callback )\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "\n" \
    "    if (this === null)\n" \
    "        throw new @TypeError(\"Array.prototype.forEach requires that |this| not be null\");\n" \
    "    \n" \
    "    if (this === undefined)\n" \
    "        throw new @TypeError(\"Array.prototype.forEach requires that |this| not be undefined\");\n" \
    "    \n" \
    "    var array = @Object(this);\n" \
    "    var length = @toLength(array.length);\n" \
    "\n" \
    "    if (typeof callback !== \"function\")\n" \
    "        throw new @TypeError(\"Array.prototype.forEach callback must be a function\");\n" \
    "    \n" \
    "    var thisArg = arguments.length > 1 ? arguments[1] : undefined;\n" \
    "    \n" \
    "    for (var i = 0; i < length; i++) {\n" \
    "        if (i in array)\n" \
    "            callback.@call(thisArg, array[i], i, array);\n" \
    "    }\n" \
    "})\n" \
;

const JSC::ConstructAbility s_builtinPrototypeMatchCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_builtinPrototypeMatchCodeConstructorKind = JSC::ConstructorKind::None;
const int s_builtinPrototypeMatchCodeLength = 1238;
static const JSC::Intrinsic s_builtinPrototypeMatchCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_builtinPrototypeMatchCode =
    "(function (strArg)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "\n" \
    "    if (!@isObject(this))\n" \
    "        @throwTypeError(\"RegExp.prototype.@@match requires that |this| be an Object\");\n" \
    "\n" \
    "    let regexp = this;\n" \
    "\n" \
    "    //\n" \
    "    if (!@hasObservableSideEffectsForRegExpMatch(regexp))\n" \
    "        return @regExpMatchFast.@call(regexp, strArg);\n" \
    "\n" \
    "    let str = @toString(strArg);\n" \
    "\n" \
    "    if (!regexp.global)\n" \
    "        return @regExpExec(regexp, str);\n" \
    "    \n" \
    "    let unicode = regexp.unicode;\n" \
    "    regexp.lastIndex = 0;\n" \
    "    let resultList = [];\n" \
    "\n" \
    "    //\n" \
    "    //\n" \
    "    //\n" \
    "    const maximumReasonableMatchSize = 100000000;\n" \
    "\n" \
    "    while (true) {\n" \
    "        let result = @regExpExec(regexp, str);\n" \
    "        \n" \
    "        if (result === null) {\n" \
    "            if (resultList.length === 0)\n" \
    "                return null;\n" \
    "            return resultList;\n" \
    "        }\n" \
    "\n" \
    "        if (resultList.length > maximumReasonableMatchSize)\n" \
    "            @throwOutOfMemoryError();\n" \
    "\n" \
    "        if (!@isObject(result))\n" \
    "            @throwTypeError(\"RegExp.prototype.@@match call to RegExp.exec didn't return null or an object\");\n" \
    "\n" \
    "        let resultString = @toString(result[0]);\n" \
    "\n" \
    "        if (!resultString.length)\n" \
    "            regexp.lastIndex = @advanceStringIndex(str, regexp.lastIndex, unicode);\n" \
    "\n" \
    "        resultList.@push(resultString);\n" \
    "    }\n" \
    "})\n" \
;

const JSC::ConstructAbility s_builtinPrototypeTestCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_builtinPrototypeTestCodeConstructorKind = JSC::ConstructorKind::None;
const int s_builtinPrototypeTestCodeLength = 504;
static const JSC::Intrinsic s_builtinPrototypeTestCodeIntrinsic = JSC::RegExpTestIntrinsic;
const char* const s_builtinPrototypeTestCode =
    "(function (strArg)\n" \
    "{\n" \
    "    \"use strict\";\n" \
    "\n" \
    "    let regexp = this;\n" \
    "\n" \
    "    //\n" \
    "    if (@isRegExpObject(regexp) && @tryGetById(regexp, \"exec\") === @regExpBuiltinExec)\n" \
    "        return @regExpTestFast.@call(regexp, strArg);\n" \
    "\n" \
    "    //\n" \
    "    //\n" \
    "    if (!@isObject(regexp))\n" \
    "        @throwTypeError(\"RegExp.prototype.test requires that |this| be an Object\");\n" \
    "\n" \
    "    //\n" \
    "    let str = @toString(strArg);\n" \
    "\n" \
    "    //\n" \
    "    let match = @regExpExec(regexp, str);\n" \
    "\n" \
    "    //\n" \
    "    if (match !== null)\n" \
    "        return true;\n" \
    "    return false;\n" \
    "})\n" \
;


#define DEFINE_BUILTIN_GENERATOR(codeName, functionName, overriddenName, argumentCount) \
JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \
{\
    return vm.builtinExecutables()->codeName##Executable()->link(vm, nullptr, vm.builtinExecutables()->codeName##Source(), WTF::nullopt, s_##codeName##Intrinsic); }
JSC_FOREACH_BUILTIN.PROTOTYPE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
#undef DEFINE_BUILTIN_GENERATOR


} // namespace JSC
### End File: BuiltinPrototypeBuiltins.cpp
