2 * Copyright (C) 2011, 2012 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. 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.
29 #include "JSGlobalObject.h"
30 #include "JSCInlines.h"
34 STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSProxy
);
36 const ClassInfo
JSProxy::s_info
= { "JSProxy", &Base::s_info
, 0, 0, CREATE_METHOD_TABLE(JSProxy
) };
38 void JSProxy::visitChildren(JSCell
* cell
, SlotVisitor
& visitor
)
40 JSProxy
* thisObject
= jsCast
<JSProxy
*>(cell
);
41 ASSERT_GC_OBJECT_INHERITS(thisObject
, info());
43 COMPILE_ASSERT(StructureFlags
& OverridesVisitChildren
, OverridesVisitChildrenWithoutSettingFlag
);
44 ASSERT(thisObject
->structure()->typeInfo().overridesVisitChildren());
46 Base::visitChildren(thisObject
, visitor
);
47 visitor
.append(&thisObject
->m_target
);
50 void JSProxy::setTarget(VM
& vm
, JSGlobalObject
* globalObject
)
52 ASSERT_ARG(globalObject
, globalObject
);
53 m_target
.set(vm
, this, globalObject
);
54 setPrototype(vm
, globalObject
->prototype());
56 PrototypeMap
& prototypeMap
= vm
.prototypeMap
;
57 if (!prototypeMap
.isPrototype(this))
60 // This is slow but constant time. We think it's very rare for a proxy
61 // to be a prototype, and reasonably rare to retarget a proxy,
62 // so slow constant time is OK.
63 for (size_t i
= 0; i
<= JSFinalObject::maxInlineCapacity(); ++i
)
64 prototypeMap
.clearEmptyObjectStructureForPrototype(this, i
);
67 String
JSProxy::className(const JSObject
* object
)
69 const JSProxy
* thisObject
= jsCast
<const JSProxy
*>(object
);
70 return thisObject
->target()->methodTable()->className(thisObject
->target());
73 bool JSProxy::getOwnPropertySlot(JSObject
* object
, ExecState
* exec
, PropertyName propertyName
, PropertySlot
& slot
)
75 JSProxy
* thisObject
= jsCast
<JSProxy
*>(object
);
76 return thisObject
->target()->methodTable(exec
->vm())->getOwnPropertySlot(thisObject
->target(), exec
, propertyName
, slot
);
79 bool JSProxy::getOwnPropertySlotByIndex(JSObject
* object
, ExecState
* exec
, unsigned propertyName
, PropertySlot
& slot
)
81 JSProxy
* thisObject
= jsCast
<JSProxy
*>(object
);
82 return thisObject
->target()->methodTable(exec
->vm())->getOwnPropertySlotByIndex(thisObject
->target(), exec
, propertyName
, slot
);
85 void JSProxy::put(JSCell
* cell
, ExecState
* exec
, PropertyName propertyName
, JSValue value
, PutPropertySlot
& slot
)
87 JSProxy
* thisObject
= jsCast
<JSProxy
*>(cell
);
88 thisObject
->target()->methodTable(exec
->vm())->put(thisObject
->target(), exec
, propertyName
, value
, slot
);
91 void JSProxy::putByIndex(JSCell
* cell
, ExecState
* exec
, unsigned propertyName
, JSValue value
, bool shouldThrow
)
93 JSProxy
* thisObject
= jsCast
<JSProxy
*>(cell
);
94 thisObject
->target()->methodTable(exec
->vm())->putByIndex(thisObject
->target(), exec
, propertyName
, value
, shouldThrow
);
97 bool JSProxy::defineOwnProperty(JSObject
* object
, ExecState
* exec
, PropertyName propertyName
, const PropertyDescriptor
& descriptor
, bool shouldThrow
)
99 JSProxy
* thisObject
= jsCast
<JSProxy
*>(object
);
100 return thisObject
->target()->methodTable(exec
->vm())->defineOwnProperty(thisObject
->target(), exec
, propertyName
, descriptor
, shouldThrow
);
103 bool JSProxy::deleteProperty(JSCell
* cell
, ExecState
* exec
, PropertyName propertyName
)
105 JSProxy
* thisObject
= jsCast
<JSProxy
*>(cell
);
106 return thisObject
->target()->methodTable(exec
->vm())->deleteProperty(thisObject
->target(), exec
, propertyName
);
109 bool JSProxy::deletePropertyByIndex(JSCell
* cell
, ExecState
* exec
, unsigned propertyName
)
111 JSProxy
* thisObject
= jsCast
<JSProxy
*>(cell
);
112 return thisObject
->target()->methodTable(exec
->vm())->deletePropertyByIndex(thisObject
->target(), exec
, propertyName
);
115 void JSProxy::getPropertyNames(JSObject
* object
, ExecState
* exec
, PropertyNameArray
& propertyNames
, EnumerationMode mode
)
117 JSProxy
* thisObject
= jsCast
<JSProxy
*>(object
);
118 thisObject
->target()->methodTable(exec
->vm())->getPropertyNames(thisObject
->target(), exec
, propertyNames
, mode
);
121 void JSProxy::getOwnPropertyNames(JSObject
* object
, ExecState
* exec
, PropertyNameArray
& propertyNames
, EnumerationMode mode
)
123 JSProxy
* thisObject
= jsCast
<JSProxy
*>(object
);
124 thisObject
->target()->methodTable(exec
->vm())->getOwnPropertyNames(thisObject
->target(), exec
, propertyNames
, mode
);