18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_object.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSDOMBinding.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_method.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/Error.h> 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <runtime/ObjectPrototype.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace Bindings { 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo RuntimeObject::s_info = { "RuntimeObject", &JSObjectWithGlobalObject::s_info, 0, 0 }; 40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochRuntimeObject::RuntimeObject(ExecState*, JSGlobalObject* globalObject, Structure* structure, PassRefPtr<Instance> instance) 42e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block : JSObjectWithGlobalObject(globalObject, structure) 43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_instance(instance) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRuntimeObject::~RuntimeObject() 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RuntimeObject::invalidate() 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(m_instance); 55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_instance) 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_instance->willInvalidateRuntimeObject(); 57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_instance = 0; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue RuntimeObject::fallbackObjectGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RuntimeObject* thisObj = static_cast<RuntimeObject*>(asObject(slotBase)); 63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = thisObj->m_instance; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!instance) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return throwInvalidAccessError(exec); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class *aClass = instance->getClass(); 715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue result = aClass->fallbackObject(exec, instance.get(), propertyName); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue RuntimeObject::fieldGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RuntimeObject* thisObj = static_cast<RuntimeObject*>(asObject(slotBase)); 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = thisObj->m_instance; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!instance) 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return throwInvalidAccessError(exec); 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class *aClass = instance->getClass(); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Field* aField = aClass->fieldNamed(propertyName, instance.get()); 905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue result = aField->valueFromInstance(exec, instance.get()); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue RuntimeObject::methodGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RuntimeObject* thisObj = static_cast<RuntimeObject*>(asObject(slotBase)); 100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = thisObj->m_instance; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!instance) 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return throwInvalidAccessError(exec); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSValue method = instance->getMethod(exec, propertyName); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return method; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RuntimeObject::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot) 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 116231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) { 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project throwInvalidAccessError(exec); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class *aClass = instance->getClass(); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (aClass) { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See if the instance has a field with the specified name. 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Field *aField = aClass->fieldNamed(propertyName, instance.get()); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (aField) { 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project slot.setCustom(this, fieldGetter); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Now check if a method with specified name exists, if so return a function object for 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that method. 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MethodList methodList = aClass->methodsNamed(propertyName, instance.get()); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (methodList.size() > 0) { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project slot.setCustom(this, methodGetter); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Try a fallback object. 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!aClass->fallbackObject(exec, instance.get(), propertyName).isUndefined()) { 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project slot.setCustom(this, fallbackObjectGetter); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return instance->getOwnPropertySlot(this, exec, propertyName, slot); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RuntimeObject::getOwnPropertyDescriptor(ExecState *exec, const Identifier& propertyName, PropertyDescriptor& descriptor) 160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) { 162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block throwInvalidAccessError(exec); 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block instance->begin(); 168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Class *aClass = instance->getClass(); 170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (aClass) { 172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // See if the instance has a field with the specified name. 173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Field *aField = aClass->fieldNamed(propertyName, instance.get()); 174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (aField) { 175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PropertySlot slot; 176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block slot.setCustom(this, fieldGetter); 177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block instance->end(); 178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block descriptor.setDescriptor(slot.getValue(exec, propertyName), DontDelete); 179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else { 181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Now check if a method with specified name exists, if so return a function object for 182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // that method. 183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block MethodList methodList = aClass->methodsNamed(propertyName, instance.get()); 184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (methodList.size() > 0) { 185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PropertySlot slot; 186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block slot.setCustom(this, methodGetter); 187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block instance->end(); 188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block descriptor.setDescriptor(slot.getValue(exec, propertyName), DontDelete | ReadOnly); 189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Try a fallback object. 194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!aClass->fallbackObject(exec, instance.get(), propertyName).isUndefined()) { 195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block PropertySlot slot; 196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block slot.setCustom(this, fallbackObjectGetter); 197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block instance->end(); 198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block descriptor.setDescriptor(slot.getValue(exec, propertyName), DontDelete | ReadOnly | DontEnum); 199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block instance->end(); 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return instance->getOwnPropertyDescriptor(this, exec, propertyName, descriptor); 206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RuntimeObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) { 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project throwInvalidAccessError(exec); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Set the value of the property. 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Field *aField = instance->getClass()->fieldNamed(propertyName, instance.get()); 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (aField) 221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project aField->setValueToInstance(exec, instance.get(), value); 222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (!instance->setValueOfUndefinedField(exec, propertyName, value)) 223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project instance->put(this, exec, propertyName, value, slot); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RuntimeObject::deleteProperty(ExecState*, const Identifier&) 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Can never remove a property of a RuntimeObject. 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue RuntimeObject::defaultValue(ExecState* exec, PreferredPrimitiveType hint) const 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return throwInvalidAccessError(exec); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 2425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue result = instance->defaultValue(exec, hint); 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 247545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL callRuntimeObject(ExecState* exec) 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT(exec->callee()->inherits(&RuntimeObject::s_info)); 2505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke RefPtr<Instance> instance(static_cast<RuntimeObject*>(exec->callee())->getInternalInstance()); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 2525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue result = instance->invokeDefaultMethod(exec); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 254545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result); 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCallType RuntimeObject::getCallData(CallData& callData) 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CallTypeNone; 261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!instance->supportsInvokeDefaultMethod()) 264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return CallTypeNone; 265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callData.native.function = callRuntimeObject; 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return CallTypeHost; 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 270545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL callRuntimeConstructor(ExecState* exec) 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 272545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch JSObject* constructor = exec->callee(); 273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(constructor->inherits(&RuntimeObject::s_info)); 274545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch RefPtr<Instance> instance(static_cast<RuntimeObject*>(exec->callee())->getInternalInstance()); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 276545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ArgList args(exec); 2775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue result = instance->invokeConstruct(exec, args); 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(result); 281545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return JSValue::encode(result.isObject() ? static_cast<JSObject*>(result.asCell()) : constructor); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockConstructType RuntimeObject::getConstructData(ConstructData& constructData) 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ConstructTypeNone; 288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!instance->supportsConstruct()) 291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return ConstructTypeNone; 292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project constructData.native.function = callRuntimeConstructor; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ConstructTypeHost; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RuntimeObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode) 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!m_instance) { 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project throwInvalidAccessError(exec); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<Instance> instance = m_instance; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->begin(); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->getPropertyNames(exec, propertyNames); 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project instance->end(); 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSObject* RuntimeObject::throwInvalidAccessError(ExecState* exec) 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 313545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return throwError(exec, createReferenceError(exec, "Trying to access object from destroyed plug-in.")); 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 318