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
);