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