All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
QoreObject.h
/* -*- mode: c++; indent-tabs-mode: nil -*- */
/*
QoreObject.h
thread-safe object definition
references: how many variables are pointing at this object?
Qore Programming Language
Copyright 2003 - 2013 David Nichols
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _QORE_QOREOBJECT_H
#define _QORE_QOREOBJECT_H
class AutoVLock;
class VRMutex;
class BuiltinCopy;
class BuiltinDeleteBlocker;
class BuiltinNormalMethodVariantBase;
class BuiltinCopyVariantBase;
class QoreExternalMethodVariant;
class QoreExternalStaticMethodVariant;
class QoreProgram;
class QoreObject : public AbstractQoreNode {
friend class qore_object_private;
friend class ObjectRSetHelper;
friend class ObjectRSet;
private:
class qore_object_private* priv;
DLLLOCAL QoreObject(const QoreObject&);
DLLLOCAL QoreObject& operator=(const QoreObject&);
protected:
DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
DLLLOCAL virtual AbstractQoreNode* evalImpl(ExceptionSink* xsink) const;
DLLLOCAL virtual AbstractQoreNode* evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
DLLLOCAL virtual int64 bigIntEvalImpl(ExceptionSink* xsink) const;
DLLLOCAL virtual int integerEvalImpl(ExceptionSink* xsink) const;
DLLLOCAL virtual bool boolEvalImpl(ExceptionSink* xsink) const;
DLLLOCAL virtual double floatEvalImpl(ExceptionSink* xsink) const;
DLLLOCAL void customRefIntern() const;
DLLLOCAL virtual void customRef() const;
DLLLOCAL virtual void customDeref(ExceptionSink* xsink);
DLLLOCAL virtual ~QoreObject();
public:
DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p);
DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p, AbstractPrivateData *data);
DLLEXPORT virtual bool getAsBoolImpl() const;
DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
DLLEXPORT virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
DLLEXPORT virtual AbstractQoreNode* realCopy() const;
DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const;
DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const;
DLLEXPORT virtual const char* getTypeName() const;
DLLLOCAL static const char* getStaticTypeName() {
return "object";
}
DLLLOCAL static qore_type_t getStaticTypeCode() {
return NT_OBJECT;
}
DLLEXPORT bool validInstanceOf(qore_classid_t cid) const;
DLLEXPORT bool validInstanceOf(const QoreClass& qc) const;
DLLEXPORT void setValue(const char* key, AbstractQoreNode* val, ExceptionSink* xsink);
DLLEXPORT QoreListNode* getMemberList(ExceptionSink* xsink) const;
DLLEXPORT void deleteMemberValue(const QoreString* key, ExceptionSink* xsink);
DLLEXPORT void deleteMemberValue(const char* key, ExceptionSink* xsink);
DLLEXPORT void removeMember(const QoreString* key, ExceptionSink* xsink);
DLLEXPORT void removeMember(const char* key, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* takeMember(const QoreString* key, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* takeMember(const char* key, ExceptionSink* xsink);
DLLEXPORT int size(ExceptionSink* xsink) const;
DLLEXPORT bool compareSoft(const QoreObject* obj, ExceptionSink* xsink) const;
DLLEXPORT bool compareHard(const QoreObject* obj, ExceptionSink* xsink) const;
DLLEXPORT AbstractQoreNode* getReferencedMemberNoMethod(const char* mem, ExceptionSink* xsink) const;
DLLEXPORT int64 getMemberAsBigInt(const char* mem, bool& found, ExceptionSink* xsink) const;
DLLEXPORT QoreHashNode* copyData(ExceptionSink* xsink) const;
DLLEXPORT void mergeDataToHash(QoreHashNode* hash, ExceptionSink* xsink);
DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData *pd);
DLLEXPORT AbstractPrivateData *getReferencedPrivateData(qore_classid_t key, ExceptionSink* xsink) const;
DLLEXPORT AbstractQoreNode* evalMethod(const QoreString* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* evalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT int64 bigIntEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT int intEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT bool boolEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT double floatEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* evalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT int64 bigIntEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT int intEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT bool boolEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT double floatEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT void doDelete(ExceptionSink* xsink);
DLLEXPORT const QoreClass* getClass(qore_classid_t cid) const;
DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
DLLEXPORT const QoreClass* getClass() const;
DLLEXPORT const char* getClassName() const;
DLLEXPORT bool isValid() const;
DLLEXPORT QoreProgram* getProgram() const;
DLLEXPORT bool isSystemObject() const;
DLLEXPORT void tRef() const;
DLLEXPORT void tDeref();
DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const QoreString* key, AutoVLock* vl, ExceptionSink* xsink) const;
DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const char* key, AutoVLock* vl, ExceptionSink* xsink) const;
DLLEXPORT void deleteBlockerRef() const;
DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* evalMethodVariant(const QoreMethod& method, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL int getStatus() const;
DLLLOCAL AbstractQoreNode* evalMember(const QoreString* member, ExceptionSink* xsink);
DLLLOCAL QoreHashNode* getRuntimeMemberHash(ExceptionSink* xsink) const;
DLLLOCAL class KeyNode* getReferencedPrivateDataNode(qore_classid_t key);
DLLLOCAL AbstractPrivateData *getAndClearPrivateData(qore_classid_t key, ExceptionSink* xsink);
DLLLOCAL AbstractQoreNode* evalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL int64 bigIntEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL int intEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL bool boolEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL double floatEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase* meth, QoreObject* self, ExceptionSink* xsink);
DLLLOCAL void addPrivateDataToString(QoreString* str, ExceptionSink* xsink) const;
DLLLOCAL void obliterate(ExceptionSink* xsink);
DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink* xsink);
DLLLOCAL AbstractQoreNode** getExistingValuePtr(const QoreString* mem, AutoVLock* vl, ExceptionSink* xsink) const;
DLLLOCAL AbstractQoreNode** getExistingValuePtr(const char* mem, AutoVLock* vl, ExceptionSink* xsink) const;
// returns a new hash consisting of just the members of value_list
DLLLOCAL QoreHashNode* getSlice(const QoreListNode* value_list, ExceptionSink* xsink) const;
DLLLOCAL QoreObject(const QoreClass* oc, QoreProgram* p, QoreHashNode* d);
DLLLOCAL bool evalDeleteBlocker(qore_classid_t classid_for_method, BuiltinDeleteBlocker* meth);
DLLLOCAL bool hasMemberNotification() const;
DLLLOCAL void execMemberNotification(const char* member, ExceptionSink* xsink);
DLLLOCAL AbstractQoreNode** getMemberValuePtrForInitialization(const char* member);
};
template <class T>
class PrivateDataRefHolder : public ReferenceHolder<T> {
public:
DLLLOCAL PrivateDataRefHolder(const QoreObject* o, qore_classid_t cid, ExceptionSink* xsink) : ReferenceHolder<T>(reinterpret_cast<T*>(o->getReferencedPrivateData(cid, xsink)), xsink) {
}
};
class QorePrivateObjectAccessHelper {
private:
// not implemented
DLLLOCAL QorePrivateObjectAccessHelper(const QorePrivateObjectAccessHelper&);
DLLLOCAL QorePrivateObjectAccessHelper& operator=(const QorePrivateObjectAccessHelper&);
DLLLOCAL void* operator new(size_t);
protected:
ExceptionSink* xsink;
void* ptr;
public:
DLLLOCAL QorePrivateObjectAccessHelper(ExceptionSink* xs) : xsink(xs), ptr(0) {
}
DLLLOCAL operator bool() const {
return (bool)ptr;
}
};
#endif
QoreObject::getRuntimeMemberHash
DLLLOCAL QoreHashNode * getRuntimeMemberHash(ExceptionSink *xsink) const
retuns member data of the object (or 0 if there&#39;s an exception), private members are excluded if call...
QoreObject::evalCopyMethodWithPrivateData
DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase *meth, QoreObject *self, ExceptionSink *xsink)
called on the old object (this) to acquire private data, copy method called with pointer to &quot;self&quot; (n...
QoreObject::compareHard
DLLEXPORT bool compareHard(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion of c...
AutoVLock
AutoVLock is a container for safely managing global variable and object lock handovers, required for functions accessing global variables and object data where locking is necessary.
Definition: AutoVLock.h:72
QoreObject::isSystemObject
DLLEXPORT bool isSystemObject() const
returns true if the object is a system object (created with the system constructor) ...
QoreObject::execMemberNotification
DLLLOCAL void execMemberNotification(const char *member, ExceptionSink *xsink)
executes the member notification on the object the given member
QoreHashNode
This is the hash or associative list container type in Qore, dynamically allocated only...
Definition: QoreHashNode.h:41
QoreObject::setValue
DLLEXPORT void setValue(const char *key, AbstractQoreNode *val, ExceptionSink *xsink)
sets the value of the given member to the given value
QoreObject::getMemberValuePtrForInitialization
DLLLOCAL AbstractQoreNode ** getMemberValuePtrForInitialization(const char *member)
returns a pointer to an object member during initialization (no locking; interal use only) ...
QoreObject::doDelete
DLLEXPORT void doDelete(ExceptionSink *xsink)
runs the destructor on the object (if it hasn&#39;t already been deleted)
QoreObject::boolEvalImpl
virtual DLLLOCAL bool boolEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
AbstractPrivateData
the base class for all data to be used as private data of Qore objects
Definition: AbstractPrivateData.h:36
QoreObject::mergeDataToHash
DLLEXPORT void mergeDataToHash(QoreHashNode *hash, ExceptionSink *xsink)
copies all member data of the current object to the passed QoreHashNode
QoreObject::getClassName
DLLEXPORT const char * getClassName() const
returns the name of the class
QoreObject::compareSoft
DLLEXPORT bool compareSoft(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion of c...
QoreObject::externalDelete
DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink *xsink)
call this function when an object&#39;s private data is deleted externally
QoreObject::removeMember
DLLEXPORT void removeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors; the value is only dereferenc...
QoreObject::getReferencedPrivateData
DLLEXPORT AbstractPrivateData * getReferencedPrivateData(qore_classid_t key, ExceptionSink *xsink) const
returns the private data corresponding to the class ID passed with an incremented reference count...
QoreObject::size
DLLEXPORT int size(ExceptionSink *xsink) const
returns the number of members of the object
QoreObject::takeMember
DLLEXPORT AbstractQoreNode * takeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors and returns the value removed...
QoreObject::getAsBoolImpl
virtual DLLEXPORT bool getAsBoolImpl() const
returns false unless perl-boolean-evaluation is enabled, in which case it returns false only when emp...
AbstractQoreNode
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:47
NT_OBJECT
const qore_type_t NT_OBJECT
type value for QoreObject
Definition: node_types.h:44
QoreObject::~QoreObject
virtual DLLLOCAL ~QoreObject()
destructor
QoreObject::boolEvalMethod
DLLEXPORT bool boolEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as a bool ...
QoreObject::getClass
DLLEXPORT const QoreClass * getClass() const
returns a pointer to the QoreClass of this object
QoreObject::bigIntEvalMethod
DLLEXPORT int64 bigIntEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as an int64 ...
QoreObject::getMemberList
DLLEXPORT QoreListNode * getMemberList(ExceptionSink *xsink) const
returns the list of members, caller owns the list returned
QoreObject::realCopy
virtual DLLEXPORT AbstractQoreNode * realCopy() const
performs a deep copy of the list and returns the new list
QoreObject::evalImpl
virtual DLLLOCAL AbstractQoreNode * evalImpl(ExceptionSink *xsink) const
should never be called, does nothing
QoreObject::evalMethod
DLLEXPORT AbstractQoreNode * evalMethod(const QoreString *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value, caller owns the AbstractQoreNode (reference) returned
QoreObject::evalMember
DLLLOCAL AbstractQoreNode * evalMember(const QoreString *member, ExceptionSink *xsink)
returns the value of the member with an incremented reference count, or executes the memberGate() met...
QoreObject::customDeref
virtual DLLLOCAL void customDeref(ExceptionSink *xsink)
custom dereference handler - with delete
QoreObject::getProgram
DLLEXPORT QoreProgram * getProgram() const
returns the QoreProgram object associated with this object
QoreObject::derefImpl
virtual DLLEXPORT bool derefImpl(ExceptionSink *xsink)
runs the destructor if necessary and dereferences all members
QoreObject::hasMemberNotification
DLLLOCAL bool hasMemberNotification() const
returns true if the class has a memberNotification method
QoreObject::copyData
DLLEXPORT QoreHashNode * copyData(ExceptionSink *xsink) const
retuns all member data of the object (or 0 if there&#39;s an exception), caller owns the QoreHashNode ref...
qore_type_t
signed short qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:59
QoreObject::is_equal_soft
virtual DLLEXPORT bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion (sof...
QoreString
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:42
QoreObject::obliterate
DLLLOCAL void obliterate(ExceptionSink *xsink)
destroys all members and dereferences all private data structures
QoreObject::customRef
virtual DLLLOCAL void customRef() const
custom reference handler
QoreObject::getStaticTypeCode
static DLLLOCAL qore_type_t getStaticTypeCode()
returns the type code (useful in templates)
Definition: QoreObject.h:187
QoreObject::tDeref
DLLEXPORT void tDeref()
decrements the existence reference count, when it reaches 0 the C++ object (&quot;this&quot;) will be deleted ...
QoreObject::getTypeName
virtual DLLEXPORT const char * getTypeName() const
returns the type name as a c string
QoreObject::floatEvalMethod
DLLEXPORT double floatEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as a double ...
QoreListNode
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:44
QoreObject::is_equal_hard
virtual DLLEXPORT bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) without type conversions (hard com...
PrivateDataRefHolder
convenience class for holding AbstractPrivateData references
Definition: QoreObject.h:618
QoreObject::evalDeleteBlocker
DLLLOCAL bool evalDeleteBlocker(qore_classid_t classid_for_method, BuiltinDeleteBlocker *meth)
evaluates the delete blocker function for the managed private data
QoreObject::addPrivateDataToString
DLLLOCAL void addPrivateDataToString(QoreString *str, ExceptionSink *xsink) const
concatenates info about private data to a string
QoreClass
defines a Qore-language class
Definition: QoreClass.h:186
QoreObject::getReferencedMemberNoMethod
DLLEXPORT AbstractQoreNode * getReferencedMemberNoMethod(const char *mem, ExceptionSink *xsink) const
returns the value of the given member with the reference count incremented, the caller owns the Abstr...
QoreProgram
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:95
QoreObject
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:56
QoreObject::getMemberValueNoMethod
DLLEXPORT AbstractQoreNode * getMemberValueNoMethod(const QoreString *key, AutoVLock *vl, ExceptionSink *xsink) const
returns the pointer to the value of the member
QoreObject::defaultSystemDestructor
DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink *xsink)
runs the destructor for system objects
qore_classid_t
unsigned qore_classid_t
used for the unique class ID for QoreClass objects
Definition: common.h:68
ExceptionSink
container for holding Qore-language exception information and also for registering a &quot;thread_exit&quot; ca...
Definition: ExceptionSink.h:35
QoreObject::integerEvalImpl
virtual DLLLOCAL int integerEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
QoreObject::floatEvalImpl
virtual DLLLOCAL double floatEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
QoreObject::getAsString
virtual DLLEXPORT int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const
concatenate the verbose string representation of the list (including all contained values) to an exis...
QoreObject::getAndClearPrivateData
DLLLOCAL AbstractPrivateData * getAndClearPrivateData(qore_classid_t key, ExceptionSink *xsink)
retrieves the private data pointer and clears it from the object&#39;s private data store, used when executing destructors
QoreObject::customRefIntern
DLLLOCAL void customRefIntern() const
custom reference handler - unlocked
QoreObject::getExistingValuePtr
DLLLOCAL AbstractQoreNode ** getExistingValuePtr(const QoreString *mem, AutoVLock *vl, ExceptionSink *xsink) const
returns a pointer to a pointer to the value of the member only if it already exists, so it can be set externally
QoreObject::evalMethodVariant
DLLEXPORT AbstractQoreNode * evalMethodVariant(const QoreMethod &method, const QoreExternalMethodVariant *variant, const QoreListNode *args, ExceptionSink *xsink)
executes a normal object method variant
QoreObject::bigIntEvalImpl
virtual DLLLOCAL int64 bigIntEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
QoreObject::deleteMemberValue
DLLEXPORT void deleteMemberValue(const QoreString *key, ExceptionSink *xsink)
removes a member from the object, if the member&#39;s value is an object it is deleted as well (destructo...
QoreObject::evalBuiltinMethodWithPrivateData
DLLLOCAL AbstractQoreNode * evalBuiltinMethodWithPrivateData(const QoreMethod &method, const BuiltinNormalMethodVariantBase *meth, const QoreListNode *args, ExceptionSink *xsink)
called to evaluate a builtin method when private data is available
QoreObject::deleteBlockerRef
DLLEXPORT void deleteBlockerRef() const
increment the reference count of the object, to be called only from within a delete blocker ...
QoreObject::getStaticTypeName
static DLLLOCAL const char * getStaticTypeName()
returns the type name (useful in templates)
Definition: QoreObject.h:182
QoreMethod
a method in a QoreClass
Definition: QoreClass.h:83
QoreObject::tRef
DLLEXPORT void tRef() const
increments the existence reference count
QoreObject::setPrivate
DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData *pd)
sets private data for the object against the class ID passed, used in C++ functions implementing Qore...
QoreObject::isValid
DLLEXPORT bool isValid() const
returns true if the object is valid
ReferenceHolder
a templated class to manage a reference count of an object that can throw a Qore-language exception w...
Definition: ReferenceHolder.h:43
QoreObject::getMemberAsBigInt
DLLEXPORT int64 getMemberAsBigInt(const char *mem, bool &found, ExceptionSink *xsink) const
returns the value of the given member as an int64
QoreObject::validInstanceOf
DLLEXPORT bool validInstanceOf(qore_classid_t cid) const
returns true if this object is a valid instance of the classid passed
QoreObject::intEvalMethod
DLLEXPORT int intEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as an int ...