2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
29 #include "JSDestructibleObject.h"
33 class JSProxy
: public JSDestructibleObject
{
35 typedef JSDestructibleObject Base
;
36 static const unsigned StructureFlags
= Base::StructureFlags
| OverridesGetOwnPropertySlot
| OverridesGetPropertyNames
| InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero
;
38 static JSProxy
* create(VM
& vm
, Structure
* structure
, JSObject
* target
)
40 JSProxy
* proxy
= new (NotNull
, allocateCell
<JSProxy
>(vm
.heap
)) JSProxy(vm
, structure
);
41 proxy
->finishCreation(vm
, target
);
45 static Structure
* createStructure(VM
& vm
, JSGlobalObject
* globalObject
, JSValue prototype
, JSType proxyType
= ImpureProxyType
)
47 return Structure::create(vm
, globalObject
, prototype
, TypeInfo(proxyType
, StructureFlags
), info());
52 JSObject
* target() const { return m_target
.get(); }
53 static ptrdiff_t targetOffset() { return OBJECT_OFFSETOF(JSProxy
, m_target
); }
56 JSProxy(VM
& vm
, Structure
* structure
)
57 : JSDestructibleObject(vm
, structure
)
61 void finishCreation(VM
& vm
)
63 Base::finishCreation(vm
);
66 void finishCreation(VM
& vm
, JSObject
* target
)
68 Base::finishCreation(vm
);
69 m_target
.set(vm
, this, target
);
72 JS_EXPORT_PRIVATE
static void visitChildren(JSCell
*, SlotVisitor
&);
74 JS_EXPORT_PRIVATE
void setTarget(VM
&, JSGlobalObject
*);
76 JS_EXPORT_PRIVATE
static String
className(const JSObject
*);
77 JS_EXPORT_PRIVATE
static bool getOwnPropertySlot(JSObject
*, ExecState
*, PropertyName
, PropertySlot
&);
78 JS_EXPORT_PRIVATE
static bool getOwnPropertySlotByIndex(JSObject
*, ExecState
*, unsigned, PropertySlot
&);
79 JS_EXPORT_PRIVATE
static void put(JSCell
*, ExecState
*, PropertyName
, JSValue
, PutPropertySlot
&);
80 JS_EXPORT_PRIVATE
static void putByIndex(JSCell
*, ExecState
*, unsigned, JSValue
, bool shouldThrow
);
81 JS_EXPORT_PRIVATE
static bool deleteProperty(JSCell
*, ExecState
*, PropertyName
);
82 JS_EXPORT_PRIVATE
static bool deletePropertyByIndex(JSCell
*, ExecState
*, unsigned);
83 JS_EXPORT_PRIVATE
static void getOwnPropertyNames(JSObject
*, ExecState
*, PropertyNameArray
&, EnumerationMode
);
84 JS_EXPORT_PRIVATE
static void getPropertyNames(JSObject
*, ExecState
*, PropertyNameArray
&, EnumerationMode
);
85 JS_EXPORT_PRIVATE
static uint32_t getEnumerableLength(ExecState
*, JSObject
*);
86 JS_EXPORT_PRIVATE
static void getStructurePropertyNames(JSObject
*, ExecState
*, PropertyNameArray
&, EnumerationMode
);
87 JS_EXPORT_PRIVATE
static void getGenericPropertyNames(JSObject
*, ExecState
*, PropertyNameArray
&, EnumerationMode
);
88 JS_EXPORT_PRIVATE
static bool defineOwnProperty(JSObject
*, ExecState
*, PropertyName
, const PropertyDescriptor
&, bool shouldThrow
);
91 WriteBarrier
<JSObject
> m_target
;