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 KJS_EXPORT 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 KJS_EXPORT 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 KJS_EXPORT 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_