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_