QoreProgram.h
/* -*- mode: c++; indent-tabs-mode: nil -*- */
/*
QoreProgram.h
Program Object Definition
Qore Programming Language
Copyright (C) 2003 - 2015 David Nichols
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
Note that the Qore library is released under a choice of three open-source
licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
information.
*/
#ifndef _QORE_QOREPROGRAM_H
#define _QORE_QOREPROGRAM_H
#include <qore/AbstractPrivateData.h>
#include <qore/Restrictions.h>
// warnings - must correspond with the string order in QoreProgram.cpp
// new warnings must also be added as constants
#define QP_WARN_NONE 0
#define QP_WARN_WARNING_MASK_UNCHANGED (1 << 0)
#define QP_WARN_DUPLICATE_LOCAL_VARS (1 << 1)
#define QP_WARN_UNKNOWN_WARNING (1 << 2)
#define QP_WARN_UNDECLARED_VAR (1 << 3)
#define QP_WARN_DUPLICATE_GLOBAL_VARS (1 << 4)
#define QP_WARN_UNREACHABLE_CODE (1 << 5)
#define QP_WARN_NONEXISTENT_METHOD_CALL (1 << 6)
#define QP_WARN_INVALID_OPERATION (1 << 7)
#define QP_WARN_CALL_WITH_TYPE_ERRORS (1 << 8)
#define QP_WARN_RETURN_VALUE_IGNORED (1 << 9)
#define QP_WARN_DEPRECATED (1 << 10)
#define QP_WARN_EXCESS_ARGS (1 << 11)
#define QP_WARN_DUPLICATE_HASH_KEY (1 << 12)
#define QP_WARN_UNREFERENCED_VARIABLE (1 << 13)
#define QP_WARN_DUPLICATE_BLOCK_VARS (1 << 14)
#define QP_WARN_MODULE_ONLY (1 << 15)
#define QP_WARN_ALL -1
#define QP_WARN_MODULES (QP_WARN_UNREACHABLE_CODE|QP_WARN_NONEXISTENT_METHOD_CALL|QP_WARN_INVALID_OPERATION|QP_WARN_CALL_WITH_TYPE_ERRORS|QP_WARN_RETURN_VALUE_IGNORED|QP_WARN_DUPLICATE_HASH_KEY|QP_WARN_DUPLICATE_BLOCK_VARS)
#define QP_WARN_DEFAULT (QP_WARN_UNKNOWN_WARNING|QP_WARN_MODULES|QP_WARN_DEPRECATED)
DLLEXPORT extern const char** qore_warnings;
DLLEXPORT extern unsigned qore_num_warnings;
DLLEXPORT int get_warning_code(const char* str);
class AbstractCallReferenceNode;
class LocalVar;
class ExceptionSink;
class QoreListNode;
class QoreNamespace;
class RootQoreNamespace;
class QoreStringNode;
class QoreHashNode;
class FunctionCallNode;
class AbstractStatement;
class UnresolvedProgramCallReferenceNode;
class Var;
class LVList;
class UserFunctionVariant;
class QoreTypeInfo;
class QoreParseTypeInfo;
class ParamList;
class AbstractQoreZoneInfo;
class qore_program_private;
class QoreProgram : public AbstractPrivateData {
friend class qore_program_private_base;
friend class qore_program_private;
private:
qore_program_private* priv;
DLLLOCAL QoreProgram(const QoreProgram&);
DLLLOCAL QoreProgram& operator=(const QoreProgram&);
protected:
DLLLOCAL virtual ~QoreProgram();
public:
DLLEXPORT QoreProgram();
DLLEXPORT QoreProgram(int64 parse_options);
DLLEXPORT AbstractQoreNode* callFunction(const char* name, const QoreListNode* args, ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* run(ExceptionSink* xsink);
DLLEXPORT AbstractQoreNode* runTopLevel(ExceptionSink* xsink);
DLLEXPORT void parseFileAndRun(const char* filename);
DLLEXPORT void parseAndRun(FILE *fp, const char* name);
DLLEXPORT void parseAndRun(const char* str, const char* name);
DLLEXPORT void runClass(const char* classname, ExceptionSink* xsink);
DLLEXPORT void parseFileAndRunClass(const char* filename, const char* classname);
DLLEXPORT void parseAndRunClass(FILE *fp, const char* name, const char* classname);
DLLEXPORT void parseAndRunClass(const char* str, const char* name, const char* classname);
DLLEXPORT void parse(FILE *fp, const char* name, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parse(const QoreString* str, const QoreString* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parse(const QoreString* str, const QoreString* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink, int warn_mask, const QoreString* source, int offset);
DLLEXPORT void parse(const char* str, const char* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parse(const char* str, const char* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink, int warn_mask, const char* source, int offset);
DLLEXPORT void parseFile(const char* filename, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL, bool only_first_except = false);
DLLEXPORT void parsePending(const char* code, const char* label, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parsePending(const char* code, const char* label, ExceptionSink* xsink, ExceptionSink* warn_sink, int warn_mask, const char* source, int offset);
DLLEXPORT void parsePending(const QoreString* str, const QoreString* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parsePending(const QoreString* str, const QoreString* lstr, ExceptionSink* xsink, ExceptionSink* warn_sink, int warn_mask, const QoreString* source, int offset);
DLLEXPORT void parseCommit(ExceptionSink* xsink, ExceptionSink* warn_sink = 0, int warn_mask = QP_WARN_ALL);
DLLEXPORT void parseRollback();
DLLEXPORT int parseRollback(ExceptionSink* xsink);
DLLEXPORT bool existsFunction(const char* name);
using AbstractPrivateData::deref;
DLLEXPORT virtual void deref(ExceptionSink* xsink);
DLLEXPORT QoreProgram* programRefSelf() const;
DLLEXPORT void lockOptions();
DLLEXPORT void setExecClass(const char* ecn = 0);
DLLEXPORT void parseSetParseOptions(int po);
DLLEXPORT void parseSetParseOptions(int64 po);
DLLEXPORT void parseDisableParseOptions(int64 po);
DLLEXPORT void waitForTermination();
DLLEXPORT void waitForTerminationAndDeref(ExceptionSink* xsink);
DLLEXPORT QoreNamespace* getQoreNS() const;
DLLEXPORT RootQoreNamespace* getRootNS() const;
DLLEXPORT int setWarningMask(int wm);
DLLEXPORT int enableWarning(int code);
DLLEXPORT int disableWarning(int code);
DLLEXPORT int getParseOptions() const;
DLLEXPORT int64 getParseOptions64() const;
DLLEXPORT void setParseOptions(int po, ExceptionSink* xsink);
DLLEXPORT void setParseOptions(int64 po, ExceptionSink* xsink);
DLLEXPORT void disableParseOptions(int po, ExceptionSink* xsink);
DLLEXPORT void disableParseOptions(int64 po, ExceptionSink* xsink);
DLLEXPORT void replaceParseOptions(int64 po, ExceptionSink* xsink);
DLLEXPORT QoreListNode* getUserFunctionList();
DLLEXPORT bool checkWarning(int code) const;
DLLEXPORT int getWarningMask() const;
DLLEXPORT bool checkFeature(const char* f) const;
DLLEXPORT QoreListNode* getFeatureList() const;
DLLEXPORT QoreStringNode* getScriptName() const;
DLLEXPORT QoreStringNode* getScriptPath() const;
DLLEXPORT QoreStringNode* getScriptDir() const;
DLLEXPORT void setScriptPath(const char* path);
DLLEXPORT AbstractQoreNode* getGlobalVariableValue(const char* var, bool &found) const;
DLLEXPORT QoreValue getGlobalVariableVal(const char* var, bool &found) const;
// retrieves the time zone setting for the program
DLLEXPORT const AbstractQoreZoneInfo *currentTZ() const;
// sets the program's time zone
DLLEXPORT void setTZ(const AbstractQoreZoneInfo *n_TZ);
DLLEXPORT void addFeature(const char* name);
DLLEXPORT void parseSetTimeZone(const char* zone);
DLLEXPORT void parseDefine(const char* str, AbstractQoreNode* val);
DLLEXPORT void parseCmdLineDefines(const std::map<std::string, std::string> defmap, ExceptionSink& xs, ExceptionSink& ws, int w);
DLLLOCAL QoreProgram(QoreProgram* pgm, int64 po, bool ec = false, const char* ecn = 0);
DLLLOCAL LocalVar *createLocalVar(const char* name, const QoreTypeInfo *typeInfo);
// returns 0 if a "requires" exception has already occurred
DLLLOCAL ExceptionSink* getParseExceptionSink();
DLLLOCAL QoreHashNode* getThreadData();
DLLLOCAL void depRef();
DLLLOCAL void depDeref(ExceptionSink* xsink);
DLLLOCAL void addFile(char* f);
DLLLOCAL QoreListNode* getVarList();
DLLLOCAL void parseSetIncludePath(const char* path);
DLLLOCAL const char* parseGetIncludePath() const;
/* for run-time module loading; the parse lock must be grabbed
before loading new modules - note this should only be assigned
to an AutoLock or SafeLocker object!
*/
DLLLOCAL QoreThreadLock *getParseLock();
DLLLOCAL const LVList* getTopLevelLVList() const;
DLLLOCAL const char* parseGetScriptDir() const;
// can only be called while parsing from the same thread doing the parsing
DLLLOCAL bool parseExceptionRaised() const;
};
class QoreProgramHelper {
private:
QoreProgram* pgm;
ExceptionSink& xsink;
public:
DLLEXPORT QoreProgramHelper(ExceptionSink& xs);
DLLEXPORT QoreProgramHelper(int64 parse_options, ExceptionSink& xs);
DLLEXPORT ~QoreProgramHelper();
DLLEXPORT QoreProgram* operator->();
DLLEXPORT QoreProgram* operator*();
};
#endif // _QORE_QOREPROGRAM_H
QoreProgram::waitForTermination
DLLEXPORT void waitForTermination()
this call blocks until the program's last thread terminates
QoreProgram::getQoreNS
DLLEXPORT QoreNamespace * getQoreNS() const
returns a pointer to the "Qore" namespace
QoreProgram::parseDefine
DLLEXPORT void parseDefine(const char *str, AbstractQoreNode *val)
defines a parse-time variable; call only at parse time (or before parsing)
QoreProgramHelper::~QoreProgramHelper
DLLEXPORT ~QoreProgramHelper()
waits until all background threads in the Qore library have terminated and until the QoreProgram obje...
QoreProgram::lockOptions
DLLEXPORT void lockOptions()
locks parse options so they may not be changed
QoreProgram::programRefSelf
DLLEXPORT QoreProgram * programRefSelf() const
references "this" and returns a non-const pointer to itself
QoreProgram::getRootNS
DLLEXPORT RootQoreNamespace * getRootNS() const
returns a pointer to the root namespace
QoreProgram::parsePending
DLLEXPORT void parsePending(const char *code, const char *label, ExceptionSink *xsink, ExceptionSink *warn_sink=0, int warn_mask=QP_WARN_ALL)
parses code from the given string but does not commit changes to the QoreProgram
QoreProgram::addFeature
DLLEXPORT void addFeature(const char *name)
manually add the feature to the program
QoreProgram::getParseOptions
DLLEXPORT int getParseOptions() const
returns the parse options currently set for this program; DEPRECATED; use getParseOptions64() instead...
QoreHashNode
This is the hash or associative list container type in Qore, dynamically allocated only...
Definition: QoreHashNode.h:49
QoreProgram::getGlobalVariableVal
DLLEXPORT QoreValue getGlobalVariableVal(const char *var, bool &found) const
returns the value of the global variable given (do not include the "$" symbol), the caller owns the r...
QoreProgram::~QoreProgram
virtual DLLLOCAL ~QoreProgram()
the destructor is private in order to prohibit the object from being allocated on the stack ...
QoreProgram::waitForTerminationAndDeref
DLLEXPORT void waitForTerminationAndDeref(ExceptionSink *xsink)
this call blocks until the program's last thread terminates, and then calls QoreProgram::deref() ...
QoreProgram::disableParseOptions
DLLEXPORT void disableParseOptions(int po, ExceptionSink *xsink)
turns off the parse options given in the passed mask and adds Qore-language exception information if ...
AbstractPrivateData
the base class for all data to be used as private data of Qore objects
Definition: AbstractPrivateData.h:44
QoreProgram::getGlobalVariableValue
DLLEXPORT AbstractQoreNode * getGlobalVariableValue(const char *var, bool &found) const
returns the value of the global variable given (do not include the "$" symbol), the caller owns the r...
Restrictions.h
QoreProgram::setExecClass
DLLEXPORT void setExecClass(const char *ecn=0)
sets the name of the application class to be executed (instantiated) instead of top-level code ...
QoreProgram::runTopLevel
DLLEXPORT AbstractQoreNode * runTopLevel(ExceptionSink *xsink)
tuns the top level code and returns any return value
QoreProgram::checkWarning
DLLEXPORT bool checkWarning(int code) const
returns true if the warning code is set
AbstractQoreNode
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:55
QoreNamespace
contains constants, classes, and subnamespaces in QoreProgram objects
Definition: QoreNamespace.h:58
QoreProgramHelper::operator*
DLLEXPORT QoreProgram * operator*()
returns the QoreProgram object being managed
QoreProgram::getFeatureList
DLLEXPORT QoreListNode * getFeatureList() const
returns a list of features in the program object
QoreProgram::parseFileAndRun
DLLEXPORT void parseFileAndRun(const char *filename)
parses the given filename and runs the file
AbstractCallReferenceNode
base class for call references, reference-counted, dynamically allocated only
Definition: CallReferenceNode.h:39
QoreProgram::callFunction
DLLEXPORT AbstractQoreNode * callFunction(const char *name, const QoreListNode *args, ExceptionSink *xsink)
calls a function from the function name and returns the return value
QoreProgramHelper
safely manages QoreProgram objects; note the the destructor will block until all background threads i...
Definition: QoreProgram.h:631
QoreProgram::parseSetTimeZone
DLLEXPORT void parseSetTimeZone(const char *zone)
sets the time zone during parsing
QoreString
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:82
QoreStringNode
Qore's string value type, reference counted, dynamically-allocated only.
Definition: QoreStringNode.h:50
QoreProgram::parseAndRun
DLLEXPORT void parseAndRun(FILE *fp, const char *name)
parses the given file and runs the file
QoreProgram::getUserFunctionList
DLLEXPORT QoreListNode * getUserFunctionList()
returns a list of all user functions in this program
RootQoreNamespace
the root namespace of a QoreProgram object
Definition: QoreNamespace.h:226
QoreProgram::existsFunction
DLLEXPORT bool existsFunction(const char *name)
returns true if the given function exists as a user function, false if not
QoreListNode
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
QoreProgram::enableWarning
DLLEXPORT int enableWarning(int code)
enables a warning by its code
QoreProgram::parseGetScriptDir
DLLLOCAL const char * parseGetScriptDir() const
returns the script directory, if known (0 if not), does not grab the parse lock, only to be called wh...
AbstractPrivateData::deref
virtual DLLLOCAL void deref()
decrements the reference count of the object without the possibility of throwing a Qore-language exce...
Definition: AbstractPrivateData.h:67
QoreProgram::parseCommit
DLLEXPORT void parseCommit(ExceptionSink *xsink, ExceptionSink *warn_sink=0, int warn_mask=QP_WARN_ALL)
commits pending changes to the program
QoreProgram::setWarningMask
DLLEXPORT int setWarningMask(int wm)
sets the warning mask
QoreProgram::setScriptPath
DLLEXPORT void setScriptPath(const char *path)
sets the script path
QoreProgram::getScriptPath
DLLEXPORT QoreStringNode * getScriptPath() const
returns the script path (directory and name), if known (0 if not)
QoreProgram::getParseOptions64
DLLEXPORT int64 getParseOptions64() const
returns the parse options currently set for this program
QoreProgram
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:103
QoreProgram::parseRollback
DLLEXPORT void parseRollback()
rolls back changes to the program object that were added with QoreProgram::parsePending() ...
QoreProgram::parse
DLLEXPORT void parse(FILE *fp, const char *name, ExceptionSink *xsink, ExceptionSink *warn_sink=0, int warn_mask=QP_WARN_ALL)
parses code from the file given and commits changes to the QoreProgram
QoreProgram::parseAndRunClass
DLLEXPORT void parseAndRunClass(FILE *fp, const char *name, const char *classname)
parses the given file and runs the code by instantiating the class given
QoreProgram::setParseOptions
DLLEXPORT void setParseOptions(int po, ExceptionSink *xsink)
sets the parse options and adds Qore-language exception information if an error occurs ...
QoreProgram::getScriptDir
DLLEXPORT QoreStringNode * getScriptDir() const
returns the script directory, if known (0 if not)
ExceptionSink
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:43
QoreProgram::runClass
DLLEXPORT void runClass(const char *classname, ExceptionSink *xsink)
instantiates the class given and runs its constructor
int64
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition: common.h:228
QoreProgram::QoreProgram
DLLEXPORT QoreProgram()
creates the object
QoreProgram::disableWarning
DLLEXPORT int disableWarning(int code)
disables a warning by its code
QoreProgram::parseSetParseOptions
DLLEXPORT void parseSetParseOptions(int po)
adds the parse options given to the parse option mask; DEPRECATED: use parseSetParseOptions(int64) in...
QoreProgram::parseDisableParseOptions
DLLEXPORT void parseDisableParseOptions(int64 po)
disables the parse options given to the parse option mask
QoreProgram::run
DLLEXPORT AbstractQoreNode * run(ExceptionSink *xsink)
runs the program (instantiates the program class if a program class has been set) and returns the ret...
QoreProgramHelper::operator->
DLLEXPORT QoreProgram * operator->()
returns the QoreProgram object being managed
QoreThreadLock
provides a mutually-exclusive thread lock
Definition: QoreThreadLock.h:49
QoreProgramHelper::QoreProgramHelper
DLLEXPORT QoreProgramHelper(ExceptionSink &xs)
creates the QoreProgram object: DEPRECATED: use QoreProgramHelper(int64, ExceptionSink&) instead ...
QoreProgram::checkFeature
DLLEXPORT bool checkFeature(const char *f) const
returns true if the given feature is present in the program object
QoreProgram::replaceParseOptions
DLLEXPORT void replaceParseOptions(int64 po, ExceptionSink *xsink)
replaces the parse options in the program with those given by the argument; adds Qore-language except...
QoreProgram::getWarningMask
DLLEXPORT int getWarningMask() const
returns the warning mask
QoreProgram::parseFileAndRunClass
DLLEXPORT void parseFileAndRunClass(const char *filename, const char *classname)
parses the given filename and runs the program by instantiating the class given
QoreProgram::parseCmdLineDefines
DLLEXPORT void parseCmdLineDefines(const std::map< std::string, std::string > defmap, ExceptionSink &xs, ExceptionSink &ws, int w)
defines a parse-time variables
QoreProgram::parseFile
DLLEXPORT void parseFile(const char *filename, ExceptionSink *xsink, ExceptionSink *warn_sink=0, int warn_mask=QP_WARN_ALL, bool only_first_except=false)
parses code from the file given and commits changes to the QoreProgram
QoreProgram::getScriptName
DLLEXPORT QoreStringNode * getScriptName() const
returns the script file name, if known (0 if not)
currentTZ
DLLEXPORT const AbstractQoreZoneInfo * currentTZ()
returns the current local time zone, note that if 0 = UTC