All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
CallReferenceNode.h
/* -*- mode: c++; indent-tabs-mode: nil -*- */
/*
CallReferenceNode.h
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_FUNCTIONREFERENCENODE_H
#define _QORE_FUNCTIONREFERENCENODE_H
class AbstractCallReferenceNode : public AbstractQoreNode {
private:
DLLLOCAL virtual AbstractQoreNode *realCopy() const;
DLLLOCAL virtual bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const;
DLLLOCAL virtual bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const;
protected:
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 AbstractCallReferenceNode(bool n_needs_eval, bool n_there_can_be_only_one, qore_type_t n_type = NT_FUNCREF);
public:
DLLLOCAL AbstractCallReferenceNode(bool n_needs_eval = false, qore_type_t n_type = NT_FUNCREF);
DLLLOCAL virtual ~AbstractCallReferenceNode();
DLLEXPORT virtual bool getAsBoolImpl() const;
DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const;
DLLLOCAL virtual QoreString *getAsString(bool &del, int foff, ExceptionSink *xsink) const;
DLLLOCAL virtual const char *getTypeName() const;
DLLLOCAL static const char *getStaticTypeName() {
return "call reference";
}
};
class ResolvedCallReferenceNode : public AbstractCallReferenceNode {
public:
DLLLOCAL ResolvedCallReferenceNode(bool n_needs_eval = false, qore_type_t n_type = NT_FUNCREF);
DLLLOCAL virtual AbstractQoreNode *exec(const QoreListNode *args, ExceptionSink *xsink) const = 0;
DLLLOCAL virtual int64 bigIntExec(const QoreListNode *args, ExceptionSink *xsink) const {
ReferenceHolder<AbstractQoreNode> rv(exec(args, xsink), xsink);
return rv ? rv->getAsBigInt() : 0;
}
DLLLOCAL virtual int intExec(const QoreListNode *args, ExceptionSink *xsink) const {
ReferenceHolder<AbstractQoreNode> rv(exec(args, xsink), xsink);
return rv ? rv->getAsInt() : 0;
}
DLLLOCAL virtual bool boolExec(const QoreListNode *args, ExceptionSink *xsink) const {
ReferenceHolder<AbstractQoreNode> rv(exec(args, xsink), xsink);
return rv ? rv->getAsBool() : false;
}
DLLLOCAL virtual double floatExec(const QoreListNode *args, ExceptionSink *xsink) const {
ReferenceHolder<AbstractQoreNode> rv(exec(args, xsink), xsink);
return rv ? rv->getAsFloat() : 0.0;
}
DLLLOCAL virtual QoreProgram *getProgram() const;
DLLLOCAL virtual class QoreFunction *getFunction() = 0;
DLLLOCAL ResolvedCallReferenceNode *refRefSelf() const {
ref();
return const_cast<ResolvedCallReferenceNode *>(this);
}
};
#endif
ResolvedCallReferenceNode::getProgram
virtual DLLLOCAL QoreProgram * getProgram() const
returns a pointer to the QoreProgram object associated with this reference (can be 0) ...
AbstractCallReferenceNode::getAsString
virtual DLLLOCAL int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const
concatenate the verbose string representation of the value to an existing QoreString ...
AbstractQoreNode::getAsBool
DLLEXPORT bool getAsBool() const
returns the boolean value of the object
ResolvedCallReferenceNode::exec
virtual DLLLOCAL AbstractQoreNode * exec(const QoreListNode *args, ExceptionSink *xsink) const =0
pure virtual function for executing the function reference
AbstractCallReferenceNode::getTypeName
virtual DLLLOCAL const char * getTypeName() const
returns the type name as a c string
AbstractQoreNode::getAsFloat
DLLEXPORT double getAsFloat() const
returns the float value of the object
AbstractCallReferenceNode::evalImpl
virtual DLLLOCAL AbstractQoreNode * evalImpl(ExceptionSink *xsink) const
this function should never be called for function references; this function should never be called di...
AbstractQoreNode
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:47
AbstractCallReferenceNode::AbstractCallReferenceNode
DLLLOCAL AbstractCallReferenceNode(bool n_needs_eval, bool n_there_can_be_only_one, qore_type_t n_type=NT_FUNCREF)
protected constructor for subclasses that are not reference-counted
NT_FUNCREF
const qore_type_t NT_FUNCREF
type value for AbstractCallReferenceNode
Definition: node_types.h:63
AbstractCallReferenceNode::getAsBoolImpl
virtual DLLEXPORT bool getAsBoolImpl() const
returns false unless perl-boolean-evaluation is enabled, in which case it returns true ...
AbstractCallReferenceNode
base class for call references, reference-counted, dynamically allocated only
Definition: CallReferenceNode.h:31
AbstractCallReferenceNode::integerEvalImpl
virtual DLLLOCAL int integerEvalImpl(ExceptionSink *xsink) const
this function should never be called for function references; this function should never be called di...
AbstractQoreNode::getAsInt
DLLEXPORT int getAsInt() const
returns the integer value of the object
AbstractQoreNode::getAsBigInt
DLLEXPORT int64 getAsBigInt() const
returns the 64-bit integer value of the object
qore_type_t
signed short qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:59
QoreString
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:42
QoreListNode
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:44
ResolvedCallReferenceNode::ResolvedCallReferenceNode
DLLLOCAL ResolvedCallReferenceNode(bool n_needs_eval=false, qore_type_t n_type=NT_FUNCREF)
constructor is not exported outside the library
QoreProgram
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:95
AbstractQoreNode::ref
DLLEXPORT void ref() const
increments the reference count
AbstractCallReferenceNode::floatEvalImpl
virtual DLLLOCAL double floatEvalImpl(ExceptionSink *xsink) const
this function should never be called for function references; this function should never be called di...
ExceptionSink
container for holding Qore-language exception information and also for registering a &quot;thread_exit&quot; ca...
Definition: ExceptionSink.h:35
ResolvedCallReferenceNode
base class for resolved call references
Definition: CallReferenceNode.h:120
AbstractCallReferenceNode::boolEvalImpl
virtual DLLLOCAL bool boolEvalImpl(ExceptionSink *xsink) const
this function should never be called for function references; this function should never be called di...
AbstractCallReferenceNode::bigIntEvalImpl
virtual DLLLOCAL int64 bigIntEvalImpl(ExceptionSink *xsink) const
this function should never be called for function references; this function should never be called di...
ReferenceHolder
a templated class to manage a reference count of an object that can throw a Qore-language exception w...
Definition: ReferenceHolder.h:43