bc3accc6694e3f5288b4a2e61f69b9cd74d96b52
[WebKit-https.git] / Source / JavaScriptCore / runtime / ArrayConstructor.h
1 /*
2  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  *
19  */
20
21 #ifndef ArrayConstructor_h
22 #define ArrayConstructor_h
23
24 #include "InternalFunction.h"
25 #include "ProxyObject.h"
26
27 namespace JSC {
28
29 class ArrayAllocationProfile;
30 class ArrayPrototype;
31 class JSArray;
32 class GetterSetter;
33
34 class ArrayConstructor : public InternalFunction {
35 public:
36     typedef InternalFunction Base;
37     static const unsigned StructureFlags = OverridesGetOwnPropertySlot | InternalFunction::StructureFlags;
38
39     static ArrayConstructor* create(VM& vm, JSGlobalObject* globalObject, Structure* structure, ArrayPrototype* arrayPrototype, GetterSetter* speciesSymbol)
40     {
41         ArrayConstructor* constructor = new (NotNull, allocateCell<ArrayConstructor>(vm.heap)) ArrayConstructor(vm, structure);
42         constructor->finishCreation(vm, globalObject, arrayPrototype, speciesSymbol);
43         return constructor;
44     }
45
46     DECLARE_INFO;
47
48     static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
49     {
50         return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
51     }
52
53 protected:
54     void finishCreation(VM&, JSGlobalObject*, ArrayPrototype*, GetterSetter* speciesSymbol);
55
56 private:
57     ArrayConstructor(VM&, Structure*);
58     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
59
60     static ConstructType getConstructData(JSCell*, ConstructData&);
61     static CallType getCallData(JSCell*, CallData&);
62 };
63
64 JSObject* constructArrayWithSizeQuirk(ExecState*, ArrayAllocationProfile*, JSGlobalObject*, JSValue length, JSValue prototype = JSValue());
65
66 EncodedJSValue JSC_HOST_CALL arrayConstructorPrivateFuncIsArrayConstructor(ExecState*);
67
68 // ES6 7.2.2
69 // https://tc39.github.io/ecma262/#sec-isarray
70 inline bool isArray(ExecState* exec, JSValue argumentValue)
71 {
72     if (!argumentValue.isObject())
73         return false;
74
75     JSObject* argument = jsCast<JSObject*>(argumentValue);
76     while (true) {
77         if (argument->inherits(JSArray::info()))
78             return true;
79
80         if (argument->type() != ProxyObjectType)
81             return false;
82
83         ProxyObject* proxy = jsCast<ProxyObject*>(argument);
84         if (proxy->isRevoked()) {
85             throwTypeError(exec, ASCIILiteral("Array.isArray cannot be called on a Proxy that has been revoked"));
86             return false;
87         }
88         argument = proxy->target();
89     }
90
91     ASSERT_NOT_REACHED();
92 }
93
94 inline bool isArrayConstructor(JSValue argumentValue)
95 {
96     if (!argumentValue.isObject())
97         return false;
98
99     return jsCast<JSObject*>(argumentValue)->classInfo() == ArrayConstructor::info();
100 }
101
102 } // namespace JSC
103
104 #endif // ArrayConstructor_h