runtime_object.cpp [plain text]
#include "error_object.h"
#include "function.h"
#include "interpreter.h"
#include "object.h"
#include "operations.h"
#include "runtime_method.h"
#include "runtime_object.h"
#include "types.h"
#include "value.h"
#include <assert.h>
using namespace KJS;
using namespace Bindings;
const ClassInfo RuntimeObjectImp::info = {"RuntimeObject", 0, 0, 0};
RuntimeObjectImp::RuntimeObjectImp(ObjectImp *proto)
: ObjectImp(proto)
{
instance = 0;
}
RuntimeObjectImp::~RuntimeObjectImp()
{
if (ownsInstance)
delete instance;
}
RuntimeObjectImp::RuntimeObjectImp(Bindings::Instance *i, bool oi) : ObjectImp ((ObjectImp *)0)
{
ownsInstance = oi;
instance = i;
}
Value RuntimeObjectImp::get(ExecState *exec, const Identifier &propertyName) const
{
instance->begin();
Class *aClass = instance->getClass();
if (aClass) {
Field *aField = aClass->fieldNamed(propertyName.ascii());
if (aField) {
return instance->getValueOfField (exec, aField);
}
MethodList methodList = aClass->methodsNamed(propertyName.ascii());
if (methodList.length() > 0) {
instance->end();
return Object (new RuntimeMethodImp(exec, propertyName, methodList));
}
}
instance->end();
return Undefined();
}
void RuntimeObjectImp::put(ExecState *exec, const Identifier &propertyName,
const Value &value, int attr)
{
instance->begin();
Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
if (aField) {
getInternalInstance()->setValueOfField(exec, aField, value);
}
instance->end();
}
bool RuntimeObjectImp::canPut(ExecState *exec, const Identifier &propertyName) const
{
instance->begin();
Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
instance->end();
return aField ? true : false;
}
bool RuntimeObjectImp::hasProperty(ExecState *exec,
const Identifier &propertyName) const
{
instance->begin();
Field *aField = instance->getClass()->fieldNamed(propertyName.ascii());
if (aField) {
instance->end();
return true;
}
MethodList methodList = instance->getClass()->methodsNamed(propertyName.ascii());
instance->end();
if (methodList.length() > 0)
return true;
return false;
}
bool RuntimeObjectImp::deleteProperty(ExecState *exec,
const Identifier &propertyName)
{
return false;
}
Value RuntimeObjectImp::defaultValue(ExecState *exec, Type hint) const
{
instance->begin();
Value aValue = getInternalInstance()->defaultValue(hint);
instance->end();
return aValue;
}