Remove excessive headers from JavaScriptCore
[WebKit-https.git] / Source / JavaScriptCore / runtime / ProxyObject.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "JSGlobalObject.h"
29 #include "JSObject.h"
30
31 namespace JSC {
32
33 class ProxyObject : public JSNonFinalObject {
34 public:
35     typedef JSNonFinalObject Base;
36
37     const static unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | TypeOfShouldCallGetCallData | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | OverridesGetPropertyNames | ProhibitsPropertyCaching;
38
39     static ProxyObject* create(ExecState* exec, JSGlobalObject* globalObject, JSValue target, JSValue handler)
40     {
41         VM& vm = exec->vm();
42         ProxyObject* proxy = new (NotNull, allocateCell<ProxyObject>(vm.heap)) ProxyObject(vm, ProxyObject::structureForTarget(globalObject, target));
43         proxy->finishCreation(vm, exec, target, handler);
44         return proxy;
45     }
46
47     static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype, bool isCallable)
48     {
49         unsigned flags = StructureFlags;
50         if (isCallable)
51             flags |= (ImplementsHasInstance | ImplementsDefaultHasInstance);
52         Structure* result = Structure::create(vm, globalObject, prototype, TypeInfo(ProxyObjectType, flags), info(), NonArray | MayHaveIndexedAccessors);
53         result->setIsQuickPropertyAccessAllowedForEnumeration(false);
54         RELEASE_ASSERT(!result->canAccessPropertiesQuicklyForEnumeration());
55         RELEASE_ASSERT(!result->canCachePropertyNameEnumerator());
56         return result;
57     }
58
59     DECLARE_EXPORT_INFO;
60
61     JSObject* target() const { return m_target.get(); }
62     JSValue handler() const { return m_handler.get(); }
63
64     static bool put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&);
65     static bool putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow);
66     bool putByIndexCommon(ExecState*, JSValue thisValue, unsigned propertyName, JSValue putValue, bool shouldThrow);
67     JSValue performGetPrototype(ExecState*);
68     void revoke(VM&);
69     bool isRevoked() const;
70
71 private:
72     JS_EXPORT_PRIVATE ProxyObject(VM&, Structure*);
73     JS_EXPORT_PRIVATE void finishCreation(VM&, ExecState*, JSValue target, JSValue handler);
74     JS_EXPORT_PRIVATE static Structure* structureForTarget(JSGlobalObject*, JSValue target);
75
76     static String toStringName(const JSObject*, ExecState*);
77     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
78     static bool getOwnPropertySlotByIndex(JSObject*, ExecState*, unsigned propertyName, PropertySlot&);
79     static CallType getCallData(JSCell*, CallData&);
80     static ConstructType getConstructData(JSCell*, ConstructData&);
81     static bool deleteProperty(JSCell*, ExecState*, PropertyName);
82     static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned propertyName);
83     static bool preventExtensions(JSObject*, ExecState*);
84     static bool isExtensible(JSObject*, ExecState*);
85     static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow);
86     static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
87     static void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
88     static NO_RETURN_DUE_TO_CRASH void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
89     static NO_RETURN_DUE_TO_CRASH void getStructurePropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
90     static NO_RETURN_DUE_TO_CRASH void getGenericPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
91     static bool setPrototype(JSObject*, ExecState*, JSValue prototype, bool shouldThrowIfCantSet);
92     static JSValue getPrototype(JSObject*, ExecState*);
93     static void visitChildren(JSCell*, SlotVisitor&);
94
95     bool getOwnPropertySlotCommon(ExecState*, PropertyName, PropertySlot&);
96     bool performInternalMethodGetOwnProperty(ExecState*, PropertyName, PropertySlot&);
97     bool performGet(ExecState*, PropertyName, PropertySlot&);
98     bool performHasProperty(ExecState*, PropertyName, PropertySlot&);
99     template <typename DefaultDeleteFunction>
100     bool performDelete(ExecState*, PropertyName, DefaultDeleteFunction);
101     template <typename PerformDefaultPutFunction>
102     bool performPut(ExecState*, JSValue putValue, JSValue thisValue, PropertyName, PerformDefaultPutFunction);
103     bool performPreventExtensions(ExecState*);
104     bool performIsExtensible(ExecState*);
105     bool performDefineOwnProperty(ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow);
106     void performGetOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode);
107     bool performSetPrototype(ExecState*, JSValue prototype, bool shouldThrowIfCantSet);
108
109     WriteBarrier<JSObject> m_target;
110     WriteBarrier<Unknown> m_handler;
111     bool m_isCallable : 1;
112     bool m_isConstructible : 1;
113 };
114
115 } // namespace JSC