00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef _KJS_OBJECT_H_
00027
#define _KJS_OBJECT_H_
00028
00029
00030
00031
#include "value.h"
00032
#include "types.h"
00033
#include "reference_list.h"
00034
#include "identifier.h"
00035
#include "property_map.h"
00036
#include "scope_chain.h"
00037
00038
namespace KJS {
00039
00040
class ObjectImpPrivate;
00041
class PropertyMap;
00042
class HashTable;
00043
struct HashEntry;
00044
class ListImp;
00045
00046
00047
00048
enum Attribute { None = 0,
00049 ReadOnly = 1 << 1,
00050 DontEnum = 1 << 2,
00051 DontDelete = 1 << 3,
00052 Internal = 1 << 4,
00053 Function = 1 << 5 };
00054
00058 struct ClassInfo {
00062 const char*
className;
00067 const ClassInfo *
parentClass;
00071 const HashTable *
propHashTable;
00075 void *
dummy;
00076 };
00077
00081 class Object :
public Value {
00082
public:
00083
Object() { }
00084
explicit Object(ObjectImp *v);
00085
00086 ObjectImp *imp()
const;
00087
00088
const ClassInfo *classInfo()
const;
00089
bool inherits(
const ClassInfo *cinfo)
const;
00090
00100
static Object dynamicCast(
const Value &v);
00101
00110
Value prototype()
const;
00111
00119
UString className()
const;
00120
00133
Value get(
ExecState *exec,
const Identifier &propertyName)
const;
00134
Value get(
ExecState *exec,
unsigned propertyName)
const;
00135
00145
void put(
ExecState *exec,
const Identifier &propertyName,
00146
const Value &value,
int attr = None);
00147
void put(
ExecState *exec,
unsigned propertyName,
00148
const Value &value,
int attr = None);
00149
00160
bool canPut(
ExecState *exec,
const Identifier &propertyName)
const;
00161
00172
bool hasProperty(
ExecState *exec,
const Identifier &propertyName)
const;
00173
bool hasProperty(
ExecState *exec,
unsigned propertyName)
const;
00174
00186
bool deleteProperty(
ExecState *exec,
const Identifier &propertyName);
00187
bool deleteProperty(
ExecState *exec,
unsigned propertyName);
00188
00201
Value defaultValue(
ExecState *exec, Type hint)
const;
00202
00211
bool implementsConstruct()
const;
00212
00238
Object construct(
ExecState *exec,
const List &args);
00239
00248
bool implementsCall()
const;
00249
00250
00268
Value call(
ExecState *exec,
Object &thisObj,
const List &args);
00269
00278
bool implementsHasInstance()
const;
00279
00289
Boolean hasInstance(
ExecState *exec,
const Value &value);
00290
00316
const ScopeChain &
scope()
const;
00317
void setScope(
const ScopeChain &s);
00318
00335
ReferenceList propList(
ExecState *exec,
bool recursive =
true);
00336
00345
Value internalValue()
const;
00346
00354
void setInternalValue(
const Value &v);
00355 };
00356
00357 inline Object Value::toObject(
ExecState *exec)
const {
return rep->
dispatchToObject(exec); }
00358
00359
class ObjectImp :
public ValueImp {
00360
friend class ObjectProtoFuncImp;
00361
public:
00367 ObjectImp(
const Object &proto);
00368 ObjectImp(ObjectImp *proto);
00369
00375 ObjectImp();
00376
00377
virtual ~ObjectImp();
00378
00379
virtual void mark();
00380
00381 Type type() const;
00382
00420 virtual const
ClassInfo *classInfo() const;
00421
00448
bool inherits(const
ClassInfo *cinfo) const;
00449
00450
00451
00458
Value prototype() const;
00459
void setPrototype(const
Value &proto);
00460
00472 virtual
UString className() const;
00473
00480
00481 virtual
Value get(
ExecState *exec, const
Identifier &propertyName) const;
00482 virtual
Value getPropertyByIndex(
ExecState *exec,
00483
unsigned propertyName) const;
00484
00491 virtual
void put(
ExecState *exec, const
Identifier &propertyName,
00492 const
Value &value,
int attr = None);
00493 virtual
void putPropertyByIndex(
ExecState *exec,
unsigned propertyName,
00494 const
Value &value,
int attr = None);
00495
00502 virtual
bool canPut(
ExecState *exec, const
Identifier &propertyName) const;
00503
00510 virtual
bool hasProperty(
ExecState *exec,
00511 const
Identifier &propertyName) const;
00512 virtual
bool hasPropertyByIndex(
ExecState *exec,
unsigned propertyName) const;
00513
00520 virtual
bool deleteProperty(
ExecState *exec,
00521 const
Identifier &propertyName);
00522 virtual
bool deletePropertyByIndex(
ExecState *exec,
unsigned propertyName);
00523
00529
void deleteAllProperties(
ExecState *);
00530
00537 virtual
Value defaultValue(ExecState *exec, Type hint) const;
00538
00539 virtual
bool implementsConstruct() const;
00545 virtual
Object construct(ExecState *exec, const
List &args);
00546
00547 virtual
bool implementsCall() const;
00553 virtual
Value call(ExecState *exec,
Object &thisObj,
00554 const
List &args);
00555
00556 virtual
bool implementsHasInstance() const;
00562 virtual
Boolean hasInstance(ExecState *exec, const
Value &value);
00563
00569 const
ScopeChain &scope()
const {
return _scope; }
00570
void setScope(
const ScopeChain &s) { _scope = s; }
00571
00572
virtual ReferenceList propList(
ExecState *exec,
bool recursive =
true);
00573
00574
Value internalValue() const;
00575
void setInternalValue(const
Value &v);
00576
void setInternalValue(
ValueImp *v);
00577
00578
Value toPrimitive(
ExecState *exec,
00579 Type preferredType = UnspecifiedType) const;
00580
bool toBoolean(
ExecState *exec) const;
00581
double toNumber(
ExecState *exec) const;
00582
UString toString(
ExecState *exec) const;
00583
Object toObject(
ExecState *exec) const;
00584
00585
00586
00587
00588
00589
ValueImp *getDirect(const
Identifier& propertyName)
const
00590
{
return _prop.get(propertyName); }
00591
void putDirect(
const Identifier &propertyName,
ValueImp *value,
int attr = 0);
00592
void putDirect(
const Identifier &propertyName,
int value,
int attr = 0);
00593
00598
void setFunctionName(
const Identifier &propertyName);
00599
00600
protected:
00601 PropertyMap _prop;
00602
private:
00603
const HashEntry* findPropertyHashEntry(
const Identifier& propertyName )
const;
00604 ObjectImpPrivate *_od;
00605
ValueImp *_proto;
00606
ValueImp *_internalValue;
00607
ScopeChain _scope;
00608 };
00609
00614
enum ErrorType { GeneralError = 0,
00615 EvalError = 1,
00616 RangeError = 2,
00617 ReferenceError = 3,
00618 SyntaxError = 4,
00619 TypeError = 5,
00620 URIError = 6};
00621
00625 class Error {
00626
public:
00636
static Object create(
ExecState *exec, ErrorType errtype = GeneralError,
00637
const char *message = 0,
int lineno = -1,
00638
int sourceId = -1);
00639
00643
static const char *
const *
const errorNames;
00644 };
00645
00646
inline Object::Object(ObjectImp *v) :
Value(v) { }
00647
00648
inline ObjectImp *Object::imp()
const {
return static_cast<ObjectImp*>(rep); }
00649
00650
inline const ClassInfo *Object::classInfo()
const
00651
{
return imp()->classInfo(); }
00652
00653
inline bool Object::inherits(
const ClassInfo *cinfo)
const
00654
{
return imp()->inherits(cinfo); }
00655
00656 inline Value Object::prototype()
const
00657
{
return Value(imp()->
prototype()); }
00658
00659 inline UString Object::className()
const
00660
{
return imp()->className(); }
00661
00662 inline Value Object::get(
ExecState *exec,
const Identifier &propertyName)
const
00663
{
return imp()->get(exec,propertyName); }
00664
00665
inline Value Object::get(
ExecState *exec,
unsigned propertyName)
const
00666
{
return imp()->getPropertyByIndex(exec, propertyName); }
00667
00668 inline void Object::put(
ExecState *exec,
const Identifier &propertyName,
const Value &value,
int attr)
00669 { imp()->put(exec,propertyName,value,attr); }
00670
00671
inline void Object::put(
ExecState *exec,
unsigned propertyName,
const Value &value,
int attr)
00672 { imp()->putPropertyByIndex(exec, propertyName, value, attr); }
00673
00674 inline bool Object::canPut(
ExecState *exec,
const Identifier &propertyName)
const
00675
{
return imp()->canPut(exec,propertyName); }
00676
00677 inline bool Object::hasProperty(
ExecState *exec,
const Identifier &propertyName)
const
00678
{
return imp()->hasProperty(exec, propertyName); }
00679
00680
inline bool Object::hasProperty(
ExecState *exec,
unsigned propertyName)
const
00681
{
return imp()->hasPropertyByIndex(exec, propertyName); }
00682
00683 inline bool Object::deleteProperty(
ExecState *exec,
const Identifier &propertyName)
00684 {
return imp()->deleteProperty(exec,propertyName); }
00685
00686
inline bool Object::deleteProperty(
ExecState *exec,
unsigned propertyName)
00687 {
return imp()->deletePropertyByIndex(exec, propertyName); }
00688
00689 inline Value Object::defaultValue(
ExecState *exec, Type hint)
const
00690
{
return imp()->defaultValue(exec,hint); }
00691
00692 inline bool Object::implementsConstruct()
const
00693
{
return imp()->implementsConstruct(); }
00694
00695 inline Object Object::construct(
ExecState *exec,
const List &args)
00696 {
return imp()->construct(exec,args); }
00697
00698 inline bool Object::implementsCall()
const
00699
{
return imp()->implementsCall(); }
00700
00701 inline bool Object::implementsHasInstance()
const
00702
{
return imp()->implementsHasInstance(); }
00703
00704 inline Boolean Object::hasInstance(
ExecState *exec,
const Value &value)
00705 {
return imp()->hasInstance(exec,value); }
00706
00707 inline const ScopeChain &
Object::scope()
const
00708
{
return imp()->scope(); }
00709
00710
inline void Object::setScope(
const ScopeChain &s)
00711 { imp()->setScope(s); }
00712
00713 inline ReferenceList Object::propList(
ExecState *exec,
bool recursive)
00714 {
return imp()->propList(exec,recursive); }
00715
00716 inline Value Object::internalValue()
const
00717
{
return imp()->internalValue(); }
00718
00719 inline void Object::setInternalValue(
const Value &v)
00720 { imp()->setInternalValue(v); }
00721
00722 }
00723
00724
#endif // _KJS_OBJECT_H_