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) 45 { 46 return Structure::create(vm, globalObject, prototype, TypeInfo(ProxyType, StructureFlags), &s_info); 47 } 48 49 static JS_EXPORTDATA const ClassInfo s_info; 50 51 JSObject* target() const { return m_target.get(); } 52 53protected: 54 JSProxy(VM& vm, Structure* structure) 55 : JSDestructibleObject(vm, structure) 56 { 57 } 58 59 void finishCreation(VM& vm) 60 { 61 Base::finishCreation(vm); 62 } 63 64 void finishCreation(VM& vm, JSObject* target) 65 { 66 Base::finishCreation(vm); 67 m_target.set(vm, this, target); 68 } 69 70 static const unsigned StructureFlags = OverridesVisitChildren | OverridesGetOwnPropertySlot | OverridesGetPropertyNames | InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | Base::StructureFlags; 71 72 JS_EXPORT_PRIVATE static void visitChildren(JSCell*, SlotVisitor&); 73 74 JS_EXPORT_PRIVATE void setTarget(VM&, JSGlobalObject*); 75 76 JS_EXPORT_PRIVATE static String className(const JSObject*); 77 JS_EXPORT_PRIVATE static bool getOwnPropertySlot(JSCell*, ExecState*, PropertyName, PropertySlot&); 78 JS_EXPORT_PRIVATE static bool getOwnPropertySlotByIndex(JSCell*, ExecState*, unsigned, PropertySlot&); 79 JS_EXPORT_PRIVATE static bool getOwnPropertyDescriptor(JSObject*, ExecState*, PropertyName, PropertyDescriptor&); 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 void putDirectVirtual(JSObject*, ExecState*, PropertyName, JSValue, unsigned attributes); 83 JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); 84 JS_EXPORT_PRIVATE static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned); 85 JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 86 JS_EXPORT_PRIVATE static void getPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); 87 JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, PropertyDescriptor&, bool shouldThrow); 88 89private: 90 WriteBarrier<JSObject> m_target; 91}; 92 93} // namespace JSC 94 95#endif // JSProxy_h 96