1/* 2 * Copyright (C) 2011 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. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef JSProxy_h 27#define JSProxy_h 28 29#include "JSDestructibleObject.h" 30 31namespace JSC { 32 33class JSProxy : public JSDestructibleObject { 34public: 35 typedef JSDestructibleObject Base; 36 37 static JSProxy* create(VM& vm, Structure* structure, JSObject* target) 38 { 39 JSProxy* proxy = new (NotNull, allocateCell<JSProxy>(vm.heap)) JSProxy(vm, structure); 40 proxy->finishCreation(vm, target); 41 return proxy; 42 } 43 44 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype, JSType proxyType = ImpureProxyType) 45 { 46 return Structure::create(vm, globalObject, prototype, TypeInfo(proxyType, StructureFlags), info()); 47 } 48 49 DECLARE_EXPORT_INFO; 50 51 JSObject* target() const { return m_target.get(); } 52 static ptrdiff_t targetOffset() { return OBJECT_OFFSETOF(JSProxy, m_target); } 53 54protected: 55 JSProxy(VM& vm, Structure* structure) 56 : JSDestructibleObject(vm, structure) 57 { 58 } 59 60 void finishCreation(VM& vm) 61 { 62 Base::finishCreation(vm); 63 } 64 65 void finishCreation(VM& vm, JSObject* target) 66 { 67 Base::finishCreation(vm); 68 m_target.set(vm, this, target); 69 } 70 71 static const unsigned StructureFlags = OverridesVisitChildren | OverridesGetOwnPropertySlot | OverridesGetPropertyNames | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | Base::StructureFlags; 72 73 JS_EXPORT_PRIVATE static void visitChildren(JSCell*, SlotVisitor&); 74 75 JS_EXPORT_PRIVATE void setTarget(VM&, JSGlobalObject*); 76 77 JS_EXPORT_PRIVATE static String className(const JSObject*); 78 JS_EXPORT_PRIVATE static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&); 79 JS_EXPORT_PRIVATE static bool getOwnPropertySlotByIndex(JSObject*, ExecState*, unsigned, PropertySlot&); 80 JS_EXPORT_PRIVATE static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); 81 JS_EXPORT_PRIVATE static void putByIndex(JSCell*, ExecState*, unsigned, JSValue, bool shouldThrow); 82 JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); 83 JS_EXPORT_PRIVATE static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned); 84 JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 85 JS_EXPORT_PRIVATE static void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 86 JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&, bool shouldThrow); 87 88private: 89 WriteBarrier<JSObject> m_target; 90}; 91 92} // namespace JSC 93 94#endif // JSProxy_h 95