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
00049 enum Attribute { None = 0,
00050 ReadOnly = 1 << 1,
00051 DontEnum = 1 << 2,
00052 DontDelete = 1 << 3,
00053 Internal = 1 << 4,
00054 Function = 1 << 5 };
00055
00059 struct ClassInfo {
00063 const char* className;
00068 const ClassInfo *parentClass;
00072 const HashTable *propHashTable;
00076 void *dummy;
00077 };
00078
00082 class KJS_EXPORT Object : public Value {
00083 public:
00084 Object() { }
00085 explicit Object(ObjectImp *v);
00086
00087 ObjectImp *imp() const;
00088
00089 const ClassInfo *classInfo() const;
00090 bool inherits(const ClassInfo *cinfo) const;
00091
00101 static Object dynamicCast(const Value &v);
00102
00111 Value prototype() const;
00112
00120 UString className() const;
00121
00134 Value get(ExecState *exec, const Identifier &propertyName) const;
00135 Value get(ExecState *exec, unsigned propertyName) const;
00136
00147 void put(ExecState *exec, const Identifier &propertyName,
00148 const Value &value, int attr = None);
00149 void put(ExecState *exec, unsigned propertyName,
00150 const Value &value, int attr = None);
00151
00162 bool canPut(ExecState *exec, const Identifier &propertyName) const;
00163
00174 bool hasProperty(ExecState *exec, const Identifier &propertyName) const;
00175 bool hasProperty(ExecState *exec, unsigned propertyName) const;
00176
00188 bool deleteProperty(ExecState *exec, const Identifier &propertyName);
00189 bool deleteProperty(ExecState *exec, unsigned propertyName);
00190
00203 Value defaultValue(ExecState *exec, Type hint) const;
00204
00213 bool implementsConstruct() const;
00214
00240 Object construct(ExecState *exec, const List &args);
00241
00250 bool implementsCall() const;
00251
00252
00270 Value call(ExecState *exec, Object &thisObj, const List &args);
00271
00280 bool implementsHasInstance() const;
00281
00291 Boolean hasInstance(ExecState *exec, const Value &value);
00292
00318 const ScopeChain &scope() const;
00319 void setScope(const ScopeChain &s);
00320
00337 ReferenceList propList(ExecState *exec, bool recursive = true);
00338
00347 Value internalValue() const;
00348
00356 void setInternalValue(const Value &v);
00357 };
00358
00359 inline Object Value::toObject(ExecState *exec) const { return rep->dispatchToObject(exec); }
00360
00361 class KJS_EXPORT ObjectImp : public ValueImp {
00362 friend class ObjectProtoFuncImp;
00363 public:
00369 ObjectImp(const Object &proto);
00370 ObjectImp(ObjectImp *proto);
00371
00377 ObjectImp();
00378
00379 virtual ~ObjectImp();
00380
00381 virtual void mark();
00382
00383 Type type() const;
00384
00422 virtual const ClassInfo *classInfo() const;
00423
00450 bool inherits(const ClassInfo *cinfo) const;
00451
00452
00453
00460 Value prototype() const;
00461 void setPrototype(const Value &proto);
00462
00474 virtual UString className() const;
00475
00482
00483 virtual Value get(ExecState *exec, const Identifier &propertyName) const;
00484 virtual Value getPropertyByIndex(ExecState *exec,
00485 unsigned propertyName) const;
00486
00493 virtual void put(ExecState *exec, const Identifier &propertyName,
00494 const Value &value, int attr = None);
00495 virtual void putPropertyByIndex(ExecState *exec, unsigned propertyName,
00496 const Value &value, int attr = None);
00497
00504 virtual bool canPut(ExecState *exec, const Identifier &propertyName) const;
00505
00512 virtual bool hasProperty(ExecState *exec,
00513 const Identifier &propertyName) const;
00514 virtual bool hasPropertyByIndex(ExecState *exec, unsigned propertyName) const;
00515
00522 virtual bool deleteProperty(ExecState *exec,
00523 const Identifier &propertyName);
00524 virtual bool deletePropertyByIndex(ExecState *exec, unsigned propertyName);
00525
00531 void deleteAllProperties(ExecState *);
00532
00539 virtual Value defaultValue(ExecState *exec, Type hint) const;
00540
00541 virtual bool implementsConstruct() const;
00547 virtual Object construct(ExecState *exec, const List &args);
00548
00549 virtual bool implementsCall() const;
00555 virtual Value call(ExecState *exec, Object &thisObj,
00556 const List &args);
00557
00558 virtual bool implementsHasInstance() const;
00564 virtual Boolean hasInstance(ExecState *exec, const Value &value);
00565
00571 const ScopeChain &scope() const { return _scope; }
00572 void setScope(const ScopeChain &s) { _scope = s; }
00573
00574 virtual ReferenceList propList(ExecState *exec, bool recursive = true);
00575
00576 Value internalValue() const;
00577 void setInternalValue(const Value &v);
00578 void setInternalValue(ValueImp *v);
00579
00580 Value toPrimitive(ExecState *exec,
00581 Type preferredType = UnspecifiedType) const;
00582 bool toBoolean(ExecState *exec) const;
00583 double toNumber(ExecState *exec) const;
00584 UString toString(ExecState *exec) const;
00585 Object toObject(ExecState *exec) const;
00586
00587
00588
00589
00590
00591 ValueImp *getDirect(const Identifier& propertyName) const
00592 { return _prop.get(propertyName); }
00593 void putDirect(const Identifier &propertyName, ValueImp *value, int attr = 0);
00594 void putDirect(const Identifier &propertyName, int value, int attr = 0);
00595
00600 void setFunctionName(const Identifier &propertyName);
00601
00602 protected:
00603 PropertyMap _prop;
00604 private:
00605 const HashEntry* findPropertyHashEntry( const Identifier& propertyName ) const;
00606 ObjectImpPrivate *_od;
00607 ValueImp *_proto;
00608 ValueImp *_internalValue;
00609 ScopeChain _scope;
00610 };
00611
00616 enum ErrorType { GeneralError = 0,
00617 EvalError = 1,
00618 RangeError = 2,
00619 ReferenceError = 3,
00620 SyntaxError = 4,
00621 TypeError = 5,
00622 URIError = 6};
00623
00627 class KJS_EXPORT Error {
00628 public:
00638 static Object create(ExecState *exec, ErrorType errtype = GeneralError,
00639 const char *message = 0, int lineno = -1,
00640 int sourceId = -1);
00641
00645 static const char * const * const errorNames;
00646 };
00647
00648 inline Object::Object(ObjectImp *v) : Value(v) { }
00649
00650 inline ObjectImp *Object::imp() const { return static_cast<ObjectImp*>(rep); }
00651
00652 inline const ClassInfo *Object::classInfo() const
00653 { return imp()->classInfo(); }
00654
00655 inline bool Object::inherits(const ClassInfo *cinfo) const
00656 { return imp()->inherits(cinfo); }
00657
00658 inline Value Object::prototype() const
00659 { return Value(imp()->prototype()); }
00660
00661 inline UString Object::className() const
00662 { return imp()->className(); }
00663
00664 inline Value Object::get(ExecState *exec, const Identifier &propertyName) const
00665 { return imp()->get(exec,propertyName); }
00666
00667 inline Value Object::get(ExecState *exec, unsigned propertyName) const
00668 { return imp()->getPropertyByIndex(exec, propertyName); }
00669
00670 inline void Object::put(ExecState *exec, const Identifier &propertyName, const Value &value, int attr)
00671 { imp()->put(exec,propertyName,value,attr); }
00672
00673 inline void Object::put(ExecState *exec, unsigned propertyName, const Value &value, int attr)
00674 { imp()->putPropertyByIndex(exec, propertyName, value, attr); }
00675
00676 inline bool Object::canPut(ExecState *exec, const Identifier &propertyName) const
00677 { return imp()->canPut(exec,propertyName); }
00678
00679 inline bool Object::hasProperty(ExecState *exec, const Identifier &propertyName) const
00680 { return imp()->hasProperty(exec, propertyName); }
00681
00682 inline bool Object::hasProperty(ExecState *exec, unsigned propertyName) const
00683 { return imp()->hasPropertyByIndex(exec, propertyName); }
00684
00685 inline bool Object::deleteProperty(ExecState *exec, const Identifier &propertyName)
00686 { return imp()->deleteProperty(exec,propertyName); }
00687
00688 inline bool Object::deleteProperty(ExecState *exec, unsigned propertyName)
00689 { return imp()->deletePropertyByIndex(exec, propertyName); }
00690
00691 inline Value Object::defaultValue(ExecState *exec, Type hint) const
00692 { return imp()->defaultValue(exec,hint); }
00693
00694 inline bool Object::implementsConstruct() const
00695 { return imp()->implementsConstruct(); }
00696
00697 inline Object Object::construct(ExecState *exec, const List &args)
00698 { return imp()->construct(exec,args); }
00699
00700 inline bool Object::implementsCall() const
00701 { return imp()->implementsCall(); }
00702
00703 inline bool Object::implementsHasInstance() const
00704 { return imp()->implementsHasInstance(); }
00705
00706 inline Boolean Object::hasInstance(ExecState *exec, const Value &value)
00707 { return imp()->hasInstance(exec,value); }
00708
00709 inline const ScopeChain &Object::scope() const
00710 { return imp()->scope(); }
00711
00712 inline void Object::setScope(const ScopeChain &s)
00713 { imp()->setScope(s); }
00714
00715 inline ReferenceList Object::propList(ExecState *exec, bool recursive)
00716 { return imp()->propList(exec,recursive); }
00717
00718 inline Value Object::internalValue() const
00719 { return imp()->internalValue(); }
00720
00721 inline void Object::setInternalValue(const Value &v)
00722 { imp()->setInternalValue(v); }
00723
00724 }
00725
00726 #endif // _KJS_OBJECT_H_