#include "value.h"
#include "object.h"
#include "types.h"
#include "interpreter.h"
#include "operations.h"
#include "bool_object.h"
#include "error_object.h"
#include <assert.h>
using namespace KJS;
const ClassInfo BooleanInstanceImp::info = {"Boolean", 0, 0, 0};
BooleanInstanceImp::BooleanInstanceImp(ObjectImp *proto)
: ObjectImp(proto)
{
}
BooleanPrototypeImp::BooleanPrototypeImp(ExecState *exec,
ObjectPrototypeImp *objectProto,
FunctionPrototypeImp *funcProto)
: BooleanInstanceImp(objectProto)
{
Value protect(this);
putDirect(toStringPropertyName, new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ToString,0), DontEnum);
putDirect(valueOfPropertyName, new BooleanProtoFuncImp(exec,funcProto,BooleanProtoFuncImp::ValueOf,0), DontEnum);
setInternalValue(Boolean(false));
}
BooleanProtoFuncImp::BooleanProtoFuncImp(ExecState *exec,
FunctionPrototypeImp *funcProto, int i, int len)
: InternalFunctionImp(funcProto), id(i)
{
Value protect(this);
putDirect(lengthPropertyName, len, DontDelete|ReadOnly|DontEnum);
}
bool BooleanProtoFuncImp::implementsCall() const
{
return true;
}
Value BooleanProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &)
{
if (!thisObj.inherits(&BooleanInstanceImp::info)) {
Object err = Error::create(exec,TypeError);
exec->setException(err);
return err;
}
Value v = thisObj.internalValue();
assert(!v.isNull());
if (id == ToString)
return String(v.toString(exec));
else
return Boolean(v.toBoolean(exec));
}
BooleanObjectImp::BooleanObjectImp(ExecState *exec, FunctionPrototypeImp *funcProto,
BooleanPrototypeImp *booleanProto)
: InternalFunctionImp(funcProto)
{
Value protect(this);
putDirect(prototypePropertyName, booleanProto, DontEnum|DontDelete|ReadOnly);
putDirect(lengthPropertyName, NumberImp::one(), ReadOnly|DontDelete|DontEnum);
}
bool BooleanObjectImp::implementsConstruct() const
{
return true;
}
Object BooleanObjectImp::construct(ExecState *exec, const List &args)
{
Object obj(new BooleanInstanceImp(exec->lexicalInterpreter()->builtinBooleanPrototype().imp()));
Boolean b;
if (args.size() > 0)
b = args.begin()->dispatchToBoolean(exec);
else
b = Boolean(false);
obj.setInternalValue(b);
return obj;
}
bool BooleanObjectImp::implementsCall() const
{
return true;
}
Value BooleanObjectImp::call(ExecState *exec, Object &, const List &args)
{
if (args.isEmpty())
return Boolean(false);
else
return Boolean(args[0].toBoolean(exec));
}